pytorch深度學習-01: CNN for dogs vs cats


Using CNN for dogs vs cats
數(shù)據預處理
數(shù)據集:catsvsdogs
正則化 mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225] 目的是對每個通道的像素點去除亮度的影響
數(shù)據集加載 torch.utils.data.DataLoader(dsets['train'], batch_size=64, shuffle=True, num_workers=6)?shuffle表示打亂,使每個epoch遍歷的數(shù)據順序都不一樣; num_workers表示加載數(shù)據的通道數(shù)
VGG模型與微調
加載預訓練模型 model_vgg = models.vgg16(pretrained=True)?
數(shù)據讀取和訓練?
1. 樣本、標簽、模型 .to(device)
2. 模型訓練 outputs_try = model_vgg(inputs_try)
修改最后一層,微調以適配二分類任務
凍結前面層的權重 param.requires_grad = False?
修改最后一層輸出size?從1000變?yōu)? model_vgg.classifier._modules['6'] = nn.Linear(4096, 2)?
增加一層LogSoftmax計算輸出的概率值 torch.nn.LogSoftmax(dim = 1)
重新應用模型 model = model.to(device)
訓練修改后的整個模型
定義損失函數(shù) criterion NLLLOSS() 負對數(shù)似然函數(shù)損失: -sum(y_ture * log(y_pred))
定義優(yōu)化器?optimizer torch.optim.SGD() 核心思想是根據梯度來更新神經網絡的參數(shù)
模型訓練
0. 清零梯度optimizer.zero_grad()? 以便進行新一輪的梯度計算
1.前向傳播 outputs = model(inputs)?
?2.計算損失 loss = criterion(outputs,classes) (一個批次的)?
3.反向傳播,計算梯度 loss.backward()??
4.參數(shù)更新 optimizer.step()??
預測概率&類別 _,preds = torch.max(outputs.data,1)
輸出指標: epoch_loss = 總損失/batch_size; epoch_acc = 預測值正確/batch_size
模型測試
輸入樣本和類別依然需要?.to(device)
預測值需要轉化成cpu形式 .to('cpu').numpy()
預計算加快學習速度
原理:訓練數(shù)據不再是原始圖像,而是經過模型特征提取器之后的特征結果,從而大大加快訓練速度。由于只修改了最后一層,所以前面層的中間結果都是相同的,可以保存下來以避免重復計算。(即把特征提取的結果保存下來)然后再用這些特征來進行訓練。
x = model_vgg.features(inputs) 保存特征
重新加載訓練數(shù)據和標簽,重新配置DataLoder,重新訓練(每個epoch速度很快)