1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 """ 4 Created on Tue Oct 22 17:36:12 2019 5 6 @author: huhuaixiong430 7 """ 8 import time 9 import torch.nn as nn 10 from torchvision.datasets import FashionMNIST 11 import torch 12 import numpy as np 13 from torch.utils.data import DataLoader 14 import torch.utils.data as Data 15 16 '''数据集为FashionMNIST''' 17 data=FashionMNIST('../pycharm_workspace/data/') 18 19 '''自定义神经网络1''' 20 class MLP(nn.Module): 21 def __init__(self): 22 super().__init__() 23 self.linear1=nn.Linear(784,64) 24 self.linear2=nn.Linear(64,10) 25 26 def forward(self,x): 27 out=self.linear1(x) 28 out=torch.relu(out) 29 out=self.linear2(out) 30 return out 31 #out=torch.softmax() 32 33 def train_1(): 34 '''创建模型对象''' 35 mlp=MLP() 36 '''定义损失函数''' 37 loss_func=torch.nn.CrossEntropyLoss() 38 '''定义优化器''' 39 #optimizer=torch.optim.RMSprop(mlp.parameters(),lr=0.001,alpha=0.9) 40 #optimizer=torch.optim.Adam(mlp.parameters(),lr=0.01) 41 optimizer=torch.optim.Adam(mlp.parameters(),lr=0.001) 42 t_data=data.data.type(torch.float) 43 start=time.time() 44 for i in range(200): 45 x=t_data.view(t_data.shape[0],-1) 46 prediction=mlp(x) 47 loss=loss_func(prediction,data.targets) 48 print('Batch No.%s,loss:%s'%(i,loss.data.numpy())) 49 optimizer.zero_grad() 50 loss.backward() 51 optimizer.step() 52 end=time.time() 53 print('runnig time:%.3f sec.'%(end-start)) 54 '''评估效果''' 55 x_train=data.data.numpy().astype('float32') 56 '''取一定数量的样本,用于评估''' 57 samples=10000 58 x_train=torch.tensor(x_train[:samples]) 59 '''模型输入必须为tensor形式,且维度为(784,)''' 60 x_input=x_train.view(x_train.shape[0],-1) 61 y_pred=mlp(x_input) 62 '''把模型输出(向量)转为label形式''' 63 y_pred_=list(map(lambda x:np.argmax(x),y_pred.data.numpy())) 64 '''计算准确率''' 65 acc=sum(y_pred_==data.targets.detach().numpy()[:samples])/samples 66 print(acc) 67 68 '''自定义神经网络2''' 69 class MyNet(nn.Module): 70 def __init__(self,in_size,hidden_size,out_size): 71 super().__init__() 72 self.linear1=nn.Linear(in_size,hidden_size) 73 self.linear2=nn.Linear(hidden_size,out_size) 74 75 def forward(self,x): 76 x=x.view(x.size(0),-1) 77 out=self.linear1(x) 78 out=torch.relu(out) 79 out=self.linear2(out) 80 return out 81 82 def train_2(): 83 num_epoch=20 84 t_data=data.data.type(torch.float) 85 '''使用DataLoader批量输入训练数据''' 86 dl_train=DataLoader(Data.TensorDataset(t_data,data.targets),batch_size=100,shuffle=True) 87 '''创建模型对象''' 88 model=MyNet(784,512,10) 89 '''定义损失函数''' 90 loss_func=torch.nn.CrossEntropyLoss() 91 '''定义优化器''' 92 optimizer=torch.optim.Adam(model.parameters(),lr=0.001) 93 start=time.time() 94 for i in range(num_epoch): 95 for index,(x_data,y_data) in enumerate(dl_train): 96 prediction=model(x_data) 97 loss=loss_func(prediction,y_data) 98 print('No.%s,loss=%.3f'%(index,loss.data.numpy())) 99 optimizer.zero_grad() 100 loss.backward() 101 optimizer.step() 102 print('No.%s,loss=%.3f'%(i,loss.data.numpy())) 103 end=time.time() 104 print('runnig time:%.3f sec.'%(end-start)) 105 106 '''评估模型的Accuracy''' 107 x_train=data.data.numpy().astype('float32') 108 samples=10000 109 '''取一定数量的样本,用于评估''' 110 x_train=torch.tensor(x_train[:samples]) 111 y_pred=model(x_train) 112 '''把模型输出(向量)转为label形式''' 113 y_pred_=list(map(lambda x:np.argmax(x),y_pred.data.numpy())) 114 '''计算准确率''' 115 acc=sum(y_pred_==data.targets.detach().numpy()[:samples])/samples 116 print(acc) 117