中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站建設(shè)不完整軟文推廣代理平臺(tái)

網(wǎng)站建設(shè)不完整,軟文推廣代理平臺(tái),wordpress重裝,長(zhǎng)春建站公司網(wǎng)站預(yù)訓(xùn)練模型CBAM模塊 知識(shí)點(diǎn)回顧: resnet結(jié)構(gòu)解析CBAM放置位置的思考針對(duì)預(yù)訓(xùn)練模型的訓(xùn)練策略 差異化學(xué)習(xí)率三階段微調(diào) 使用resnet的預(yù)訓(xùn)練策略:先凍結(jié)預(yù)訓(xùn)練層,然后訓(xùn)練其他層。之前的其它層是全連接層(分類頭)&…

預(yù)訓(xùn)練模型+CBAM模塊

知識(shí)點(diǎn)回顧:

  1. resnet結(jié)構(gòu)解析
  2. CBAM放置位置的思考
  3. 針對(duì)預(yù)訓(xùn)練模型的訓(xùn)練策略
    1. 差異化學(xué)習(xí)率
    2. 三階段微調(diào)

使用resnet的預(yù)訓(xùn)練策略:先凍結(jié)預(yù)訓(xùn)練層,然后訓(xùn)練其他層。之前的其它層是全連接層(分類頭),現(xiàn)在其它層還包含了每一個(gè)殘差塊中的cbam注意力層。

resnet結(jié)構(gòu)解析

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np# 定義通道注意力
class ChannelAttention(nn.Module):def __init__(self, in_channels, ratio=16):"""通道注意力機(jī)制初始化參數(shù):in_channels: 輸入特征圖的通道數(shù)ratio: 降維比例,用于減少參數(shù)量,默認(rèn)為16"""super().__init__()# 全局平均池化,將每個(gè)通道的特征圖壓縮為1x1,保留通道間的平均值信息self.avg_pool = nn.AdaptiveAvgPool2d(1)# 全局最大池化,將每個(gè)通道的特征圖壓縮為1x1,保留通道間的最顯著特征self.max_pool = nn.AdaptiveMaxPool2d(1)# 共享全連接層,用于學(xué)習(xí)通道間的關(guān)系# 先降維(除以ratio),再通過(guò)ReLU激活,最后升維回原始通道數(shù)self.fc = nn.Sequential(nn.Linear(in_channels, in_channels // ratio, bias=False),  # 降維層nn.ReLU(),  # 非線性激活函數(shù)nn.Linear(in_channels // ratio, in_channels, bias=False)   # 升維層)# Sigmoid函數(shù)將輸出映射到0-1之間,作為各通道的權(quán)重self.sigmoid = nn.Sigmoid()def forward(self, x):"""前向傳播函數(shù)參數(shù):x: 輸入特征圖,形狀為 [batch_size, channels, height, width]返回:調(diào)整后的特征圖,通道權(quán)重已應(yīng)用"""# 獲取輸入特征圖的維度信息,這是一種元組的解包寫法b, c, h, w = x.shape# 對(duì)平均池化結(jié)果進(jìn)行處理:展平后通過(guò)全連接網(wǎng)絡(luò)avg_out = self.fc(self.avg_pool(x).view(b, c))# 對(duì)最大池化結(jié)果進(jìn)行處理:展平后通過(guò)全連接網(wǎng)絡(luò)max_out = self.fc(self.max_pool(x).view(b, c))# 將平均池化和最大池化的結(jié)果相加并通過(guò)sigmoid函數(shù)得到通道權(quán)重attention = self.sigmoid(avg_out + max_out).view(b, c, 1, 1)# 將注意力權(quán)重與原始特征相乘,增強(qiáng)重要通道,抑制不重要通道return x * attention #這個(gè)運(yùn)算是pytorch的廣播機(jī)制## 空間注意力模塊
class SpatialAttention(nn.Module):def __init__(self, kernel_size=7):super().__init__()self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):# 通道維度池化avg_out = torch.mean(x, dim=1, keepdim=True)  # 平均池化:(B,1,H,W)max_out, _ = torch.max(x, dim=1, keepdim=True)  # 最大池化:(B,1,H,W)pool_out = torch.cat([avg_out, max_out], dim=1)  # 拼接:(B,2,H,W)attention = self.conv(pool_out)  # 卷積提取空間特征return x * self.sigmoid(attention)  # 特征與空間權(quán)重相乘## CBAM模塊
class CBAM(nn.Module):def __init__(self, in_channels, ratio=16, kernel_size=7):super().__init__()self.channel_attn = ChannelAttention(in_channels, ratio)self.spatial_attn = SpatialAttention(kernel_size)def forward(self, x):x = self.channel_attn(x)x = self.spatial_attn(x)return x

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np# 設(shè)置中文字體支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False  # 解決負(fù)號(hào)顯示問(wèn)題# 檢查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用設(shè)備: {device}")# 數(shù)據(jù)預(yù)處理(與原代碼一致)
train_transform = transforms.Compose([transforms.RandomCrop(32, padding=4),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.RandomRotation(15),transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])# 加載數(shù)據(jù)集(與原代碼一致)
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, transform=test_transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
import torch
import torchvision.models as models
from torchinfo import summary #之前的內(nèi)容說(shuō)了,推薦用他來(lái)可視化模型結(jié)構(gòu),信息最全# 加載 ResNet18(預(yù)訓(xùn)練)
model = models.resnet18(pretrained=True)
model.eval()# 輸出模型結(jié)構(gòu)和參數(shù)概要
summary(model, input_size=(1, 3, 224, 224))

經(jīng)典的 ResNet-18 模型可以將其看作一個(gè)處理流水線,圖像數(shù)據(jù)從一端進(jìn)去,分類結(jié)果從另一端出來(lái)。整個(gè)過(guò)程可以分為三個(gè)主要部分:

?
  1. 輸入預(yù)處理(Stem):對(duì)應(yīng)層級(jí)為 Conv2d:1-1 到 MaxPool2d:1-4,主要作用是對(duì)輸入圖像進(jìn)行初步的特征提取,并通過(guò)池化操作將特征圖尺寸減半,為后續(xù)處理做準(zhǔn)備。
  2. 核心特征提取:對(duì)應(yīng)層級(jí)為四個(gè) Sequential 模塊(1-5 到 1-8),這是網(wǎng)絡(luò)的主體,由多個(gè)殘差塊(BasicBlock)堆疊而成,負(fù)責(zé)從淺到深、從粗到細(xì)地學(xué)習(xí)圖像特征。
  3. 分類輸出(Head):對(duì)應(yīng)層級(jí)為 AdaptiveAvgPool2d:1-9 和 Linear:1-10,主要作用是將最終的特征圖(feature map)轉(zhuǎn)換成一個(gè)特征向量,并通過(guò)全連接層映射到最終的 1000 個(gè)類別上。

將CBAM插入resnet的放置位置:

?預(yù)訓(xùn)練模型的訓(xùn)練策略:

介紹一種比較適合這里的預(yù)訓(xùn)練策略:

1. 階段 1(epoch 1-5):

僅解凍分類頭(fc)和所有 CBAM 模塊,凍結(jié) ResNet18 的主干卷積層(layer1-4)。

目標(biāo):先讓模型通過(guò)預(yù)訓(xùn)練特征學(xué)習(xí)新任務(wù)的分類邊界,同時(shí)微調(diào)注意力模塊。

學(xué)習(xí)率:1e-3(較高學(xué)習(xí)率加速分類頭收斂)。

階段 2(epoch 6-20):

解凍高層卷積層(layer3、layer4)+ 分類頭 + CBAM,凍結(jié)低層卷積層(layer1、layer2)。

目標(biāo):釋放高層語(yǔ)義特征(如 “物體類別” 相關(guān)層),適應(yīng)新任務(wù)的抽象表示。

學(xué)習(xí)率:1e-4(降低學(xué)習(xí)率,避免破壞預(yù)訓(xùn)練權(quán)重)。

階段 3(epoch 21-50):

解凍所有層(包括低層卷積層 layer1、layer2),端到端微調(diào)。

目標(biāo):讓底層特征(如邊緣、紋理)與新任務(wù)對(duì)齊,提升特征表達(dá)能力。

學(xué)習(xí)率:1e-5(最小學(xué)習(xí)率,緩慢調(diào)整全局參數(shù))。

2. CBAM 模塊集成

在每個(gè)殘差塊組(layer1-4)輸出后添加 CBAM,確保注意力機(jī)制作用于各階段特征圖,且不影響殘差塊內(nèi)部的跳連接。

CBAM 參數(shù)默認(rèn)使用ratio=16和kernel_size=7,可根據(jù)計(jì)算資源調(diào)整(如減小ratio以降低參數(shù)量)。

3. 學(xué)習(xí)率與優(yōu)化器

使用Adam優(yōu)化器,分階段手動(dòng)調(diào)整學(xué)習(xí)率(也可配合自動(dòng)調(diào)度器如CosineAnnealingLR)。

每次解凍新層時(shí),學(xué)習(xí)率降低一個(gè)數(shù)量級(jí),避免梯度沖擊預(yù)訓(xùn)練權(quán)重。

預(yù)期效果與監(jiān)控

階段 1:測(cè)試準(zhǔn)確率應(yīng)逐步提升至 20%-40%(擺脫隨機(jī)猜測(cè)),損失開始下降。

階段 2:準(zhǔn)確率加速提升(利用高層特征),可能達(dá)到 60%-80%。

階段 3:準(zhǔn)確率緩慢提升并收斂(底層特征微調(diào)),最終可能超過(guò) 85%(取決于 CIFAR10 的基線表現(xiàn))。

監(jiān)控重點(diǎn):

若階段 1 準(zhǔn)確率仍為 9%,檢查數(shù)據(jù)預(yù)處理或標(biāo)簽是否正確。

若階段 2 后準(zhǔn)確率停滯,嘗試增加正則化(如在 CBAM 后添加 Dropout)或調(diào)整 CBAM 參數(shù)。

import time# ======================================================================
# 4. 結(jié)合了分階段策略和詳細(xì)打印的訓(xùn)練函數(shù)
# ======================================================================
def set_trainable_layers(model, trainable_parts):print(f"\n---> 解凍以下部分并設(shè)為可訓(xùn)練: {trainable_parts}")for name, param in model.named_parameters():param.requires_grad = Falsefor part in trainable_parts:if part in name:param.requires_grad = Truebreakdef train_staged_finetuning(model, criterion, train_loader, test_loader, device, epochs):optimizer = None# 初始化歷史記錄列表,與你的要求一致all_iter_losses, iter_indices = [], []train_acc_history, test_acc_history = [], []train_loss_history, test_loss_history = [], []for epoch in range(1, epochs + 1):epoch_start_time = time.time()# --- 動(dòng)態(tài)調(diào)整學(xué)習(xí)率和凍結(jié)層 ---if epoch == 1:print("\n" + "="*50 + "\n🚀 **階段 1:訓(xùn)練注意力模塊和分類頭**\n" + "="*50)set_trainable_layers(model, ["cbam", "backbone.fc"])optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)elif epoch == 6:print("\n" + "="*50 + "\n?? **階段 2:解凍高層卷積層 (layer3, layer4)**\n" + "="*50)set_trainable_layers(model, ["cbam", "backbone.fc", "backbone.layer3", "backbone.layer4"])optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-4)elif epoch == 21:print("\n" + "="*50 + "\n🛰? **階段 3:解凍所有層,進(jìn)行全局微調(diào)**\n" + "="*50)for param in model.parameters(): param.requires_grad = Trueoptimizer = optim.Adam(model.parameters(), lr=1e-5)# --- 訓(xùn)練循環(huán) ---model.train()running_loss, correct, total = 0.0, 0, 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()# 記錄每個(gè)iteration的損失iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append((epoch - 1) * len(train_loader) + batch_idx + 1)running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()# 按你的要求,每100個(gè)batch打印一次if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 單Batch損失: {iter_loss:.4f} | 累計(jì)平均損失: {running_loss/(batch_idx+1):.4f}')epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totaltrain_loss_history.append(epoch_train_loss)train_acc_history.append(epoch_train_acc)# --- 測(cè)試循環(huán) ---model.eval()test_loss, correct_test, total_test = 0, 0, 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()_, predicted = output.max(1)total_test += target.size(0)correct_test += predicted.eq(target).sum().item()epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_testtest_loss_history.append(epoch_test_loss)test_acc_history.append(epoch_test_acc)# 打印每個(gè)epoch的最終結(jié)果print(f'Epoch {epoch}/{epochs} 完成 | 耗時(shí): {time.time() - epoch_start_time:.2f}s | 訓(xùn)練準(zhǔn)確率: {epoch_train_acc:.2f}% | 測(cè)試準(zhǔn)確率: {epoch_test_acc:.2f}%')# 訓(xùn)練結(jié)束后調(diào)用繪圖函數(shù)print("\n訓(xùn)練完成! 開始繪制結(jié)果圖表...")plot_iter_losses(all_iter_losses, iter_indices)plot_epoch_metrics(train_acc_history, test_acc_history, train_loss_history, test_loss_history)# 返回最終的測(cè)試準(zhǔn)確率return epoch_test_acc# ======================================================================
# 5. 繪圖函數(shù)定義
# ======================================================================
def plot_iter_losses(losses, indices):plt.figure(figsize=(10, 4))plt.plot(indices, losses, 'b-', alpha=0.7, label='Iteration Loss')plt.xlabel('Iteration(Batch序號(hào))')plt.ylabel('損失值')plt.title('每個(gè) Iteration 的訓(xùn)練損失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()def plot_epoch_metrics(train_acc, test_acc, train_loss, test_loss):epochs = range(1, len(train_acc) + 1)plt.figure(figsize=(12, 4))plt.subplot(1, 2, 1)plt.plot(epochs, train_acc, 'b-', label='訓(xùn)練準(zhǔn)確率')plt.plot(epochs, test_acc, 'r-', label='測(cè)試準(zhǔn)確率')plt.xlabel('Epoch')plt.ylabel('準(zhǔn)確率 (%)')plt.title('訓(xùn)練和測(cè)試準(zhǔn)確率')plt.legend(); plt.grid(True)plt.subplot(1, 2, 2)plt.plot(epochs, train_loss, 'b-', label='訓(xùn)練損失')plt.plot(epochs, test_loss, 'r-', label='測(cè)試損失')plt.xlabel('Epoch')plt.ylabel('損失值')plt.title('訓(xùn)練和測(cè)試損失')plt.legend(); plt.grid(True)plt.tight_layout()plt.show()# ======================================================================
# 6. 執(zhí)行訓(xùn)練
# ======================================================================
model = ResNet18_CBAM().to(device)
criterion = nn.CrossEntropyLoss()
epochs = 50print("開始使用帶分階段微調(diào)策略的ResNet18+CBAM模型進(jìn)行訓(xùn)練...")
final_accuracy = train_staged_finetuning(model, criterion, train_loader, test_loader, device, epochs)
print(f"訓(xùn)練完成!最終測(cè)試準(zhǔn)確率: {final_accuracy:.2f}%")# torch.save(model.state_dict(), 'resnet18_cbam_finetuned.pth')
# print("模型已保存為: resnet18_cbam_finetuned.pth")

?

torch.save(model.state_dict(), 'resnet18_cbam_finetuned.pth')
print("模型已保存為: resnet18_cbam_finetuned.pth")

@浙大疏錦行

http://m.risenshineclean.com/news/63756.html

相關(guān)文章:

  • 做化妝品注冊(cè)和注冊(cè)的網(wǎng)站有哪些灰色行業(yè)推廣平臺(tái)
  • 移動(dòng)端網(wǎng)站和微信網(wǎng)頁(yè)設(shè)計(jì)關(guān)鍵詞挖掘排名
  • 昆明網(wǎng)站建設(shè)服務(wù)公司上海牛巨微網(wǎng)絡(luò)科技有限公司
  • 廣州優(yōu)質(zhì)網(wǎng)站建設(shè)案例百度人工客服電話24小時(shí)
  • 網(wǎng)站中英文切換代碼線上銷售方案
  • 企業(yè)網(wǎng)站的建設(shè)水平直接關(guān)系到網(wǎng)絡(luò)營(yíng)銷的效果java培訓(xùn)機(jī)構(gòu)
  • 創(chuàng)建網(wǎng)站app靠譜seo整站優(yōu)化外包
  • 蘭州解封最新消息seopeixun com cn
  • Wordpress 分表分庫(kù)電腦優(yōu)化大師有用嗎
  • 做網(wǎng)站的公司術(shù)語(yǔ)杭州網(wǎng)站排名seo
  • 哪有做網(wǎng)站的公司建網(wǎng)站用什么軟件
  • 企業(yè)自助建站360瀏覽器網(wǎng)頁(yè)版入口
  • 吉林智能網(wǎng)站建設(shè)企業(yè)免費(fèi)網(wǎng)站推廣軟文發(fā)布
  • 上海注冊(cè)公司官網(wǎng)seo發(fā)包排名軟件
  • 阿里網(wǎng)站多個(gè)域名作品提示優(yōu)化要?jiǎng)h嗎
  • 淮安網(wǎng)站排名優(yōu)化公司自助建站系統(tǒng)哪個(gè)好
  • 做網(wǎng)站費(fèi)免圖片網(wǎng)站站長(zhǎng)工具
  • 北京移動(dòng)端網(wǎng)站開發(fā)網(wǎng)絡(luò)營(yíng)銷策劃總結(jié)
  • 深圳做網(wǎng)站的公司哪家好做網(wǎng)站好的網(wǎng)站建設(shè)公司
  • 網(wǎng)站用什么系統(tǒng)好用網(wǎng)站推廣100種方法
  • 中文 域名的網(wǎng)站網(wǎng)站seo基本流程
  • 健身網(wǎng)站建設(shè)百度收錄快的發(fā)帖平臺(tái)
  • 怎么建企業(yè)網(wǎng)站網(wǎng)絡(luò)平臺(tái)推廣具體是怎么推廣
  • 維護(hù)一個(gè)網(wǎng)站一年多少錢淘寶關(guān)鍵詞排名查詢工具免費(fèi)
  • .ai域名注冊(cè)網(wǎng)站公司網(wǎng)站建設(shè)代理
  • 編程網(wǎng)課哪家好seo門戶
  • 網(wǎng)站關(guān)鍵詞怎么做百度怎么推廣自己的視頻
  • 建設(shè)網(wǎng)站需要什么技術(shù)支持360優(yōu)化大師官方下載
  • 對(duì)運(yùn)營(yíng)網(wǎng)站有什么見解百度推廣年費(fèi)多少錢
  • 做物流的在什么網(wǎng)站找客戶呢推廣互聯(lián)網(wǎng)推廣