首页 > 其他 > 详细

Pytorch分类和准确性评估--基于FashionMNIST数据集

时间:2019-10-23 21:54:05      阅读:120      评论:0      收藏:0      [点我收藏+]

最近在学习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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!