優化器根據梯度調整參數,以達到降低誤差
import torch.optim
import torchvision
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader# 加載CIFAR10測試數據集,設置transform將圖像轉換為Tensor
dataset = torchvision.datasets.CIFAR10("./data", train=False, transform=torchvision.transforms.ToTensor(),download=True)
# 創建數據加載器,設置批量大小為64
dataloader = DataLoader(dataset, batch_size=64)# 定義卷積神經網絡模型
class TY(nn.Module):def __init__(self):super(TY, self).__init__()# 構建網絡結構:3個卷積層+池化層組合,2個全連接層self.model1 = Sequential(Conv2d(3, 32, 5, padding=2), # 輸入3通道,輸出32通道,卷積核5x5MaxPool2d(2), # 最大池化,步長2Conv2d(32, 32, 5, padding=2), # 第二層卷積MaxPool2d(2), # 第二次池化Conv2d(32, 64, 5, padding=2), # 第三層卷積MaxPool2d(2), # 第三次池化Flatten(), # 將多維張量展平為向量Linear(1024, 64), # 全連接層,輸入1024維,輸出64維Linear(64, 10), # 輸出層,10個類別對應10個輸出)def forward(self, x):# 定義前向傳播路徑x = self.model1(x)return x# 定義損失函數(交叉熵損失適用于多分類問題)
loss = nn.CrossEntropyLoss()
# 實例化模型
ty = TY()
# 定義優化器(隨機梯度下降),設置學習率為0.01
optim = torch.optim.SGD(ty.parameters(), lr=0.01)# 訓練20個完整輪次
for epoch in range(20):running_loss = 0.0 # 初始化本輪累計損失# 遍歷數據加載器中的每個批次for data in dataloader:imgs, targets = data # 獲取圖像和標簽outputs = ty(imgs) # 前向傳播result_loss = loss(outputs, targets) # 計算損失optim.zero_grad() # 梯度清零,防止累積result_loss.backward() # 反向傳播計算梯度optim.step() # 更新模型參數running_loss += result_loss # 累加損失值# 打印本輪訓練的累計損失print(f"Epoch {epoch+1}, Loss: {running_loss}")