數據集下載地址:
鏈接: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
加載保存的模型並測試:https://www.cnblogs.com/xiximayou/p/12459499.html
划分驗證集並邊訓練邊驗證:https://www.cnblogs.com/xiximayou/p/12464738.html
使用學習率衰減策略並邊訓練邊測試:https://www.cnblogs.com/xiximayou/p/12468010.html
利用tensorboard可視化訓練和測試過程:https://www.cnblogs.com/xiximayou/p/12482573.html
從命令行接收參數:https://www.cnblogs.com/xiximayou/p/12488662.html
使用top1和top5准確率來衡量模型:https://www.cnblogs.com/xiximayou/p/12489069.html
使用預訓練的resnet18模型:https://www.cnblogs.com/xiximayou/p/12504579.html
計算數據集的平均值和方差:https://www.cnblogs.com/xiximayou/p/12507149.html
讀取數據集的第二種方式:https://www.cnblogs.com/xiximayou/p/12516735.html
對一張張圖像進行預測(而不是測試集):https://www.cnblogs.com/xiximayou/p/12522690.html
epoch、batchsize、step之間的關系:https://www.cnblogs.com/xiximayou/p/12405485.html
最后讀取訓練好的模型,可視化特征圖,至此貓狗數據集系列就完結了,后面准備着手pyorch-ssd訓練自己的數據集(比如是否口罩檢測)。
直接看代碼吧:visual.py
import cv2 import time import os import matplotlib.pyplot as plt import torch from torch import nn import torchvision.models as models import torchvision.transforms as transforms import numpy as np import torchvision import torch.nn as nn savepath=r'results' if not os.path.exists(savepath): os.mkdir(savepath) def load_model(): model=torchvision.models.resnet18(pretrained=False) model.fc = nn.Linear(model.fc.in_features,2,bias=False) save_path="/content/drive/My Drive/colab notebooks/output/resnet18_best.t7" checkpoint = torch.load(save_path,map_location=lambda storage, loc: storage) model.load_state_dict(checkpoint['model']) return model def draw_features(width,height,x,savename): tic=time.time() fig = plt.figure(figsize=(16, 16)) fig.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95, wspace=0.05, hspace=0.05) for i in range(width*height): plt.subplot(height,width, i + 1) plt.axis('off') img = x[0, i, :, :] pmin = np.min(img) pmax = np.max(img) img = ((img - pmin) / (pmax - pmin + 0.000001))*255 #float在[0,1]之間,轉換成0-255 img=img.astype(np.uint8) #轉成unit8 img=cv2.applyColorMap(img, cv2.COLORMAP_JET) #生成heat map img = img[:, :, ::-1]#注意cv2(BGR)和matplotlib(RGB)通道是相反的 plt.imshow(img) #print("{}/{}".format(i+1,width*height)) fig.savefig(savename, dpi=100) fig.clf() plt.close() print("time:{}".format(time.time()-tic)) class ft_net(nn.Module): def __init__(self): super(ft_net, self).__init__() model=load_model() self.model = model def forward(self, x): if True: # draw features or not x = self.model.conv1(x) draw_features(8,8,x.cpu().numpy(),"{}/f1_conv1.png".format(savepath)) x = self.model.bn1(x) draw_features(8, 8, x.cpu().numpy(),"{}/f2_bn1.png".format(savepath)) x = self.model.relu(x) draw_features(8, 8, x.cpu().numpy(), "{}/f3_relu.png".format(savepath)) x = self.model.maxpool(x) draw_features(8, 8, x.cpu().numpy(), "{}/f4_maxpool.png".format(savepath)) x = self.model.layer1(x) draw_features(8, 8, x.cpu().numpy(), "{}/f5_layer1.png".format(savepath)) x = self.model.layer2(x) draw_features(8, 16, x.cpu().numpy(), "{}/f6_layer2.png".format(savepath)) x = self.model.layer3(x) draw_features(16, 16, x.cpu().numpy(), "{}/f7_layer3.png".format(savepath)) x = self.model.layer4(x) draw_features(16, 32, x.cpu().numpy(), "{}/f8_layer4.png".format(savepath)) #draw_features(16, 32, x.cpu().numpy()[:, 0:1024, :, :], "{}/f8_layer4_1.png".format(savepath)) #draw_features(16, 32, x.cpu().numpy()[:, 1024:2048, :, :], "{}/f8_layer4_2.png".format(savepath)) x = self.model.avgpool(x) #plt.plot(np.linspace(1, 2048, 2048), x.cpu().numpy()[0, :, 0, 0]) plt.plot(np.linspace(1, 512, 512), x.cpu().numpy()[0, :, 0, 0]) plt.savefig("{}/f9_avgpool.png".format(savepath)) plt.clf() plt.close() x = x.view(x.size(0), -1) x = self.model.fc(x) #plt.plot(np.linspace(1, 1000, 1000), x.cpu().numpy()[0, :]) plt.plot(np.linspace(1, 2, 2), x.cpu().numpy()[0, :]) plt.savefig("{}/f10_fc.png".format(savepath)) plt.clf() plt.close() else : x = self.model.conv1(x) x = self.model.bn1(x) x = self.model.relu(x) x = self.model.maxpool(x) x = self.model.layer1(x) x = self.model.layer2(x) x = self.model.layer3(x) x = self.model.layer4(x) x = self.model.avgpool(x) x = x.view(x.size(0), -1) x = self.model.fc(x) return x model=ft_net() # pretrained_dict = resnet50.state_dict() # pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict} # model_dict.update(pretrained_dict) # net.load_state_dict(model_dict) model.eval() img=cv2.imread('/content/drive/My Drive/colab notebooks/image/cat7.jpg') img=cv2.resize(img,(224,224)) img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))]) img=transform(img) img=img.unsqueeze(0) with torch.no_grad(): start=time.time() out=model(img) print("total time:{}".format(time.time()-start)) result=out.cpu().numpy() # ind=np.argmax(out.cpu().numpy()) ind=np.argsort(result,axis=1) """ for i in range(5): print("predict:top {} = cls {} : score {}".format(i+1,ind[0,1000-i-1],result[0,1000-i-1])) """ for i in range(2): print("predict:top {} = cls {} : score {}".format(i+1,ind[0,2-i-1],result[0,2-i-1])) print("done")
說明:需要注意的地方
- 在draw_features()中的前兩個參數的乘積必須為該層輸出的通道數目的大小。
- 在GPU上訓練的模型要轉換成CPU模式。
- 輸入的圖像轉換成測試的格式:圖像大小、維度[batchsize,C,H,W]
- 要注意我們的類別是兩類:貓和狗
運行:
輸出文件夾:
原始圖片:
查看每一個文件中的圖像:只截取部分
f1_conv1.png
f2_bn1.png
f3_relu.png
f4_maxpool.png
f5_layer1.png
f6_layer2.png
f7_layer3.png
f8_layer4.png
f9_avgpool.png
f10_fc.png
橫軸是類別編號,縱軸是評分。最后一個圖咋好像不太對勁。。
參考了:https://blog.csdn.net/weixin_40500230/article/details/93845890
其實pytorch有一個可視化庫很全面,奈何整了半天沒整成功,有機會再試試了。