Pytorch分類和准確性評估--基於FashionMNIST數據集


最近在學習Pytorch v1.3最新版和Tensorflow2.0。

我學習Pytorch的主要途徑:莫煩PythonPytorch 1.3官方文檔 ,Pytorch v1.3跟之前的Pytorch不太一樣,比如1.3中,Variable類已經被棄用了(目前還可以用,但不推薦),tensor可以直接調用backward方法進行反向求導,不需要再像之前的版本一樣必須包裝成Variable對象之后再backward。

Tensorflow2.0的學習可以參考北大學生寫的教程:https://tf.wiki/zh/basic/basic.html ,TensorFlow2.0與之前的版本也有很大不同,TF 1.x的很多寫法已經不適用了,2.0把大量keras的內容包括了進去,使用之前的TF方便,但我總感覺混在一起,那還不如直接學Keras,另外跟Pytorch相比,為了實現相同的功能,TF2.0的代碼還是太多了,不夠簡潔。

為了對比兩者的速度,今天自己第一次嘗試用Pytorch實現了用於圖片分類的最簡單的全連接神經網絡。代碼包括了神經網絡的定義、使用DataLoader批訓練、效果的准確性評估,模型使用方法、輸出轉換為label型等內容。

  1 import time
  2 import torch.nn as nn
  3 from torchvision.datasets import FashionMNIST
  4 import torch
  5 import numpy as np
  6 from torch.utils.data import DataLoader
  7 import torch.utils.data as Data
  8 
  9 '''數據集為FashionMNIST'''
 10 data=FashionMNIST('../pycharm_workspace/data/')
 11 
 12 def train_test_split(data,test_pct=0.3):
 13     test_len=int(data.data.size(0)*test_pct)
 14     x_test=data.data[0:test_len].type(torch.float)
 15     x_train=data.data[test_len:].type(torch.float)
 16     
 17     y_test=data.targets[0:test_len]
 18     y_train=data.targets[test_len:]
 19   
 20     return x_train,y_train,x_test,y_test
 21 
 22 '''自定義神經網絡1'''    
 23 class MLP(nn.Module):
 24     def __init__(self,input_size,hidden_size,output_size):
 25         super().__init__()
 26         self.linear1=nn.Linear(input_size,hidden_size)
 27         self.linear2=nn.Linear(hidden_size,output_size)
 28 
 29     def forward(self,x):
 30         out=self.linear1(x)
 31         out=torch.relu(out)
 32         out=self.linear2(out)
 33         return out
 34         #out=torch.softmax()
 35 
 36 def train_1():
 37     '''創建模型對象'''
 38     input_size=784#訓練數據的維度
 39     hidden_size=64#隱藏層的神經元數量,這個數量越大,神經網絡越復雜,訓練后網絡的准確度越高,但訓練耗時也越長
 40     ouput_size=10#輸出層的神經元數量
 41     mlp=MLP(input_size,hidden_size,ouput_size)
 42     '''定義損失函數'''
 43     loss_func=torch.nn.CrossEntropyLoss()
 44     '''定義優化器'''
 45     #optimizer=torch.optim.RMSprop(mlp.parameters(),lr=0.001,alpha=0.9)
 46     #optimizer=torch.optim.Adam(mlp.parameters(),lr=0.01)
 47     optimizer=torch.optim.Adam(mlp.parameters(),lr=0.001)
 48     x_train,y_train,x_test,y_test=train_test_split(data,0.2)
 49     start=time.time()
 50     for i in range(200):
 51         x=x_train.view(x_train.shape[0],-1)
 52         prediction=mlp(x)
 53         loss=loss_func(prediction,y_train)
 54         print('Batch No.%s,loss:%s'%(i,loss.data.numpy()))
 55         optimizer.zero_grad()
 56         loss.backward()
 57         optimizer.step()
 58     end=time.time()
 59     print('runnig time:%.3f sec.'%(end-start))
 60     
 61     '''評估模型效果'''
 62     samples=10000
 63     '''取一定數量的樣本,用於評估'''
 64     x_input=x_test[:samples]
 65     '''模型輸入必須為tensor形式,且維度為(784,)'''
 66     x_input=x_input.view(x_input.shape[0],-1)
 67     y_pred=mlp(x_input)
 68     '''把模型輸出(向量)轉為label形式'''
 69     y_pred_=list(map(lambda x:np.argmax(x),y_pred.data.numpy()))
 70     '''計算准確率'''
 71     acc=sum(y_pred_==y_test.numpy()[:samples])/samples
 72     print('Accuracy:',acc)
     ###輸出:Accuracy:0.8153
73 74 '''自定義神經網絡2''' 75 class MyNet(nn.Module): 76 def __init__(self,in_size,hidden_size,out_size): 77 super().__init__() 78 self.linear1=nn.Linear(in_size,hidden_size) 79 self.linear2=nn.Linear(hidden_size,out_size) 80 81 def forward(self,x): 82 x=x.view(x.size(0),-1) 83 out=self.linear1(x) 84 out=torch.relu(out) 85 out=self.linear2(out) 86 return out 87 88 def train_2(): 89 num_epoch=20 90 #t_data=data.data.type(torch.float) 91 x_train,y_train,x_test,y_test=train_test_split(data,0.2) 92 '''使用DataLoader批量輸入訓練數據''' 93 dl_train=DataLoader(Data.TensorDataset(x_train,y_train),batch_size=100,shuffle=True) 94 '''創建模型對象''' 95 model=MyNet(784,512,10) 96 '''定義損失函數''' 97 loss_func=torch.nn.CrossEntropyLoss() 98 '''定義優化器''' 99 optimizer=torch.optim.Adam(model.parameters(),lr=0.001) 100 start=time.time() 101 for i in range(num_epoch): 102 for index,(x_data,y_data) in enumerate(dl_train): 103 prediction=model(x_data) 104 loss=loss_func(prediction,y_data) 105 print('No.%s,loss=%.3f'%(index,loss.data.numpy())) 106 optimizer.zero_grad() 107 loss.backward() 108 optimizer.step() 109 print('No.%s,loss=%.3f'%(i,loss.data.numpy())) 110 end=time.time() 111 print('runnig time:%.3f sec.'%(end-start)) 112 113 '''評估模型的Accuracy''' 114 samples=10000 115 '''取一定數量的樣本,用於評估''' 116 y_pred=model(x_test[:samples]) 117 '''把模型輸出(向量)轉為label形式''' 118 y_pred_=list(map(lambda x:np.argmax(x),y_pred.data.numpy())) 119 '''計算准確率''' 120 acc=sum(y_pred_==y_test.numpy()[:samples])/samples 121 print('Accuracy:',acc) 122 ###輸出:Accuracy:0.8622

 

題外話,用相同的數據集、相同的神經網絡結構、相同的優化器、相同的參數,把Pytorch跟TensorFlow2.0對比,發現pytorch對cpu的占用更小,TF 2.0跑起來Mac pro呼呼地響,Pytorch跑的時候安靜很多。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM