Day 40 訓練
- PyTorch 圖像數據訓練與測試的規范寫法
- 單通道圖像的規范訓練流程
- 數據預處理與加載
- 模型定義
- 訓練與測試函數封裝
- 模型訓練執行
- 彩色圖像的擴展應用
- 數據預處理調整
- 模型結構調整
- 關鍵要點總結
知識點回顧:
彩色和灰度圖片測試和訓練的規范寫法:封裝在函數中
展平操作:除第一個維度batchsize外全部展平
dropout操作:訓練階段隨機丟棄神經元,測試階段eval模式關閉dropout
作業:仔細學習下測試和訓練代碼的邏輯,這是基礎,這個代碼框架后續會一直沿用,后續的重點慢慢就是轉向模型定義階段了。
PyTorch 圖像數據訓練與測試的規范寫法
在深度學習項目中,規范的代碼結構能極大提升開發效率與代碼可維護性。本文將基于 PyTorch 框架,詳細講解圖像數據訓練和測試的規范寫法,從單通道圖像到彩色圖像,助你構建高效、清晰的模型訓練流程。
單通道圖像的規范訓練流程
數據預處理與加載
我們以 MNIST 手寫數字數據集為例,其為單通道灰度圖像。數據預處理是模型訓練的起點,我們利用 torchvision.transforms
對圖像進行轉換:
transform = transforms.Compose([transforms.ToTensor(), # 轉換為張量并歸一化到[0,1]transforms.Normalize((0.1307,), (0.3081,)) # 使用 MNIST 數據集的均值和標準差進行標準化
])
接著加載數據集并創建數據加載器:
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform)batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
模型定義
針對 MNIST 圖像尺寸(28×28),定義一個多層感知機(MLP)模型:
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten() # 將 28x28 圖像展平為 784 維向量self.layer1 = nn.Linear(784, 128)self.relu = nn.ReLU()self.layer2 = nn.Linear(128, 10)def forward(self, x):x = self.flatten(x)x = self.layer1(x)x = self.relu(x)x = self.layer2(x)return x
訓練與測試函數封裝
為提升代碼復用性與可讀性,我們將訓練和測試邏輯封裝為函數:
def train(model, train_loader, test_loader, criterion, optimizer, device, epochs):model.train()all_iter_losses = []iter_indices = []for epoch in range(epochs):running_loss = 0.0correct = 0total = 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()iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch+1}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 單 Batch 損失: {iter_loss:.4f} | 累計平均損失: {running_loss/(batch_idx+1):.4f}')epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totalepoch_test_loss, epoch_test_acc = test(model, test_loader, criterion, device)print(f'Epoch {epoch+1}/{epochs} 完成 | 訓練準確率: {epoch_train_acc:.2f}% | 測試準確率: {epoch_test_acc:.2f}%')plot_iter_losses(all_iter_losses, iter_indices)return epoch_test_accdef test(model, test_loader, criterion, device):model.eval()test_loss = 0correct = 0total = 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 += target.size(0)correct += predicted.eq(target).sum().item()avg_loss = test_loss / len(test_loader)accuracy = 100. * correct / totalreturn avg_loss, accuracy
模型訓練執行
設置訓練輪次并啟動訓練:
epochs = 2
print("開始訓練模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"訓練完成!最終測試準確率: {final_accuracy:.2f}%")
彩色圖像的擴展應用
對于彩色圖像(如 CIFAR-10 數據集),處理流程與單通道圖像類似,主要差異在于:
數據預處理調整
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 適應彩色圖像的標準化
])
模型結構調整
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten() # 將 3x32x32 圖像展平為 3072 維向量self.layer1 = nn.Linear(3072, 512)self.relu1 = nn.ReLU()self.dropout1 = nn.Dropout(0.2)self.layer2 = nn.Linear(512, 256)self.relu2 = nn.ReLU()self.dropout2 = nn.Dropout(0.2)self.layer3 = nn.Linear(256, 10)def forward(self, x):x = self.flatten(x)x = self.layer1(x)x = self.relu1(x)x = self.dropout1(x)x = self.layer2(x)x = self.relu2(x)x = self.dropout2(x)x = self.layer3(x)return x
關鍵要點總結
- 數據處理規范化 :利用
DataLoader
和Dataset
對數據進行分批次處理,提高數據加載效率。 - 模型結構清晰化 :明確展平操作在圖像任務中的應用,彩色圖像需考慮通道維度。
- 訓練測試函數封裝 :將訓練和測試邏輯封裝為函數,便于參數調整與復用,為多模型對比奠定基礎。
- 迭代損失記錄 :記錄每個迭代的損失,繪制損失曲線輔助訓練過程分析。
通過遵循上述規范寫法,無論是單通道還是彩色圖像數據,都能高效地完成模型訓練與測試任務,在實際項目中可根據需求靈活擴展與優化。
@浙大疏錦行