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   
01-12 03:18