最近在学习Pytorch v1.3最新版和Tensorflow2.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 ‘‘‘自定义神经网络1‘‘‘ 13 class MLP(nn.Module): 14 def __init__(self,input_size,hidden_size,output_size): 15 super().__init__() 16 self.linear1=nn.Linear(input_size,hidden_size) 17 self.linear2=nn.Linear(hidden_size,output_size) 18 19 def forward(self,x): 20 out=self.linear1(x) 21 out=torch.relu(out) 22 out=self.linear2(out) 23 return out 24 #out=torch.softmax() 25 26 def train_1(): 27 ‘‘‘创建模型对象‘‘‘ 28 input_size=784#训练数据的维度 29 hidden_size=64#隐藏层的神经元数量,这个数量越大,神经网络越复杂,训练后网络的准确度越高,但训练耗时也越长 30 ouput_size=10#输出层的神经元数量 31 mlp=MLP(input_size,hidden_size,ouput_size) 32 ‘‘‘定义损失函数‘‘‘ 33 loss_func=torch.nn.CrossEntropyLoss() 34 ‘‘‘定义优化器‘‘‘ 35 #optimizer=torch.optim.RMSprop(mlp.parameters(),lr=0.001,alpha=0.9) 36 #optimizer=torch.optim.Adam(mlp.parameters(),lr=0.01) 37 optimizer=torch.optim.Adam(mlp.parameters(),lr=0.001) 38 t_data=data.data.type(torch.float) 39 start=time.time() 40 for i in range(200): 41 x=t_data.view(t_data.shape[0],-1) 42 prediction=mlp(x) 43 loss=loss_func(prediction,data.targets) 44 print(‘Batch No.%s,loss:%s‘%(i,loss.data.numpy())) 45 optimizer.zero_grad() 46 loss.backward() 47 optimizer.step() 48 end=time.time() 49 print(‘runnig time:%.3f sec.‘%(end-start)) 50 ‘‘‘评估效果‘‘‘ 51 x_train=data.data.numpy().astype(‘float32‘) 52 ‘‘‘取一定数量的样本,用于评估‘‘‘ 53 samples=10000 54 x_train=torch.tensor(x_train[:samples]) 55 ‘‘‘模型输入必须为tensor形式,且维度为(784,)‘‘‘ 56 x_input=x_train.view(x_train.shape[0],-1) 57 y_pred=mlp(x_input) 58 ‘‘‘把模型输出(向量)转为label形式‘‘‘ 59 y_pred_=list(map(lambda x:np.argmax(x),y_pred.data.numpy())) 60 ‘‘‘计算准确率‘‘‘ 61 acc=sum(y_pred_==data.targets.detach().numpy()[:samples])/samples 62 print(acc) 63 64 ‘‘‘自定义神经网络2‘‘‘ 65 class MyNet(nn.Module): 66 def __init__(self,in_size,hidden_size,out_size): 67 super().__init__() 68 self.linear1=nn.Linear(in_size,hidden_size) 69 self.linear2=nn.Linear(hidden_size,out_size) 70 71 def forward(self,x): 72 x=x.view(x.size(0),-1) 73 out=self.linear1(x) 74 out=torch.relu(out) 75 out=self.linear2(out) 76 return out 77 78 def train_2(): 79 num_epoch=20 80 t_data=data.data.type(torch.float) 81 ‘‘‘使用DataLoader批量输入训练数据‘‘‘ 82 dl_train=DataLoader(Data.TensorDataset(t_data,data.targets),batch_size=100,shuffle=True) 83 ‘‘‘创建模型对象‘‘‘ 84 model=MyNet(784,512,10) 85 ‘‘‘定义损失函数‘‘‘ 86 loss_func=torch.nn.CrossEntropyLoss() 87 ‘‘‘定义优化器‘‘‘ 88 optimizer=torch.optim.Adam(model.parameters(),lr=0.001) 89 start=time.time() 90 for i in range(num_epoch): 91 for index,(x_data,y_data) in enumerate(dl_train): 92 prediction=model(x_data) 93 loss=loss_func(prediction,y_data) 94 print(‘No.%s,loss=%.3f‘%(index,loss.data.numpy())) 95 optimizer.zero_grad() 96 loss.backward() 97 optimizer.step() 98 print(‘No.%s,loss=%.3f‘%(i,loss.data.numpy())) 99 end=time.time() 100 print(‘runnig time:%.3f sec.‘%(end-start)) 101 102 ‘‘‘评估模型的Accuracy‘‘‘ 103 x_train=data.data.numpy().astype(‘float32‘) 104 samples=10000 105 ‘‘‘取一定数量的样本,用于评估‘‘‘ 106 x_train=torch.tensor(x_train[:samples]) 107 y_pred=model(x_train) 108 ‘‘‘把模型输出(向量)转为label形式‘‘‘ 109 y_pred_=list(map(lambda x:np.argmax(x),y_pred.data.numpy())) 110 ‘‘‘计算准确率‘‘‘ 111 acc=sum(y_pred_==data.targets.detach().numpy()[:samples])/samples 112 print(acc)
题外话,用相同的数据集、相同的神经网络结构、相同的优化器、相同的参数,把Pytorch跟TensorFlow2.0对比,发现pytorch对cpu的占用更小,TF 2.0跑起来Mac pro呼呼地响,Pytorch跑的时候安静很多。
Pytorch分类和准确性评估--基于FashionMNIST数据集
原文:https://www.cnblogs.com/aaronhoo/p/11728815.html