已重新上傳好數據集:
分割線-----------------------------------------------------------------
2020.3.10
發現數據集沒有完整的上傳到谷歌的colab上去,我說怎么計算出來的step不對勁。
測試集是完整的。
訓練集中cat的確是有10125張圖片,而dog只有1973張,所以完成一個epoch需要迭代的次數為:
(10125+1973)/128=94.515625,約等於95。
順便提一下,有兩種方式可以計算出數據集的量:
第一種:print(len(train_dataset))
第二種:在../dog目錄下,輸入ls | wc -c
今天重新上傳dog數據集。
分割線-----------------------------------------------------------------
數據集下載地址:
鏈接:https://pan.baidu.com/s/1l1AnBgkAAEhh0vI5_loWKw
提取碼:2xq4
創建數據集:https://www.cnblogs.com/xiximayou/p/12398285.html
讀取數據集:https://www.cnblogs.com/xiximayou/p/12422827.html
進行訓練:https://www.cnblogs.com/xiximayou/p/12448300.html
保存模型並繼續進行訓練:https://www.cnblogs.com/xiximayou/p/12452624.html
epoch、batchsize、step之間的關系:https://www.cnblogs.com/xiximayou/p/12405485.html
我們在test目錄下新建一個文件test.py
test.py
import sys sys.path.append("/content/drive/My Drive/colab notebooks") from utils import rdata from model import resnet import torch.nn as nn import torch import numpy as np import torchvision device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') train_loader,test_loader,train_data,test_data=rdata.load_dataset() model =torchvision.models.resnet18(pretrained=False) model.fc = nn.Linear(model.fc.in_features,2,bias=False) model.cuda() #print(model) save_path="/content/drive/My Drive/colab notebooks/output/dogcat-resnet18.t7" checkpoint = torch.load(save_path) model.load_state_dict(checkpoint['model']) start_epoch = checkpoint['epoch'] start_loss=checkpoint["train_loss"] start_acc=checkpoint["train_acc"] print("當前epoch:{} 當前訓練損失:{:.4f} 當前訓練准確率:{:.4f}".format(start_epoch+1,start_loss,start_acc)) num_epochs=1 criterion=nn.CrossEntropyLoss() # Train the model total_step = len(test_loader) def test(): for epoch in range(num_epochs): tot_loss = 0.0 correct = 0 for i ,(images, labels) in enumerate(test_loader): images = images.cuda() labels = labels.cuda() # Forward pass outputs = model(images) _, preds = torch.max(outputs.data,1) loss = criterion(outputs, labels) tot_loss += loss.data correct += torch.sum(preds == labels.data).to(torch.float32) if (i+1) % 2 == 0: print('Epoch: [{}/{}], Step: [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, i+1, total_step, loss.item())) ### Epoch info #### epoch_loss = tot_loss/len(test_data) print('test loss: {:.4f}'.format(epoch_loss)) epoch_acc = correct/len(test_data) print('test acc: {:.4f}'.format(epoch_acc)) with torch.no_grad(): test()
需要注意,測試的時候我們不需要進行反向傳播更新參數。
結果:
當前epoch:2 當前訓練損失:0.0037 當前訓練准確率:0.8349 Epoch: [1/1], Step: [2/38], Loss: 1.0218 Epoch: [1/1], Step: [4/38], Loss: 0.9890 Epoch: [1/1], Step: [6/38], Loss: 0.9255 Epoch: [1/1], Step: [8/38], Loss: 0.9305 Epoch: [1/1], Step: [10/38], Loss: 0.9013 Epoch: [1/1], Step: [12/38], Loss: 1.0436 Epoch: [1/1], Step: [14/38], Loss: 0.8102 Epoch: [1/1], Step: [16/38], Loss: 0.9356 Epoch: [1/1], Step: [18/38], Loss: 0.8668 Epoch: [1/1], Step: [20/38], Loss: 1.0083 Epoch: [1/1], Step: [22/38], Loss: 1.0202 Epoch: [1/1], Step: [24/38], Loss: 0.8906 Epoch: [1/1], Step: [26/38], Loss: 1.0110 Epoch: [1/1], Step: [28/38], Loss: 0.8508 Epoch: [1/1], Step: [30/38], Loss: 0.9539 Epoch: [1/1], Step: [32/38], Loss: 0.9225 Epoch: [1/1], Step: [34/38], Loss: 0.9501 Epoch: [1/1], Step: [36/38], Loss: 0.8252 Epoch: [1/1], Step: [38/38], Loss: 0.9201 test loss: 0.0074 test acc: 0.5000