使用的数据集是MNIST,预期可以达到98%左右的准确率。

该神经网络由一个输入层,一个全连接层结构的隐含层和一个输出层构建。

1.配置库和配置参数

import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torch.autograd import Variable

#配置参数
torch.manual_seed(1) #设置随机数种子,确保结果可重复
input_size=784
hidden_size=500
num_classes=10
num_epoches=5 #训练次数
batch_size=100 #批处理大小
learning_rate=0.001 #学习率

 2.加载MNIST数据

#加载MNIST数据
train_dataset=dsets.MNIST(root='./data',#数据保持的位置
                          train=True,#训练集
                          transform=transforms.ToTensor(),
                          download=True)
#将一个取值范围是【0,255】的PIL.Image转化成取值范围是【0,1.0】的torch.FloatTensor
test_dataset=dsets.MNIST(root='./data',
                         train=False,
                         transform=transforms.ToTensor())

 3.数据的批处理一

#数据的批处理
#Data Loader(Input Pipeline)
#数据的预处理,尺寸大小必须为batch_size,在训练集中,shuffle必须设置为True,表示次序是随机的
train_loader=torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)
test_loader=torch.utils.data.DataLoader(dataset=test_dataset,batch_size=batch_size,shuffle=False)

4.创建DNN模型

#创建DNN模型
#Neural Network Model(1 hidden layer)定义神经网络模型
class Net(nn.Module):
    def __init__(self,input_size,hidden_size,num_classes):
        super(Net,self).__init__()
        self.fc1=nn.Linear(input_size,hidden_size)
        self.relu=nn.ReLU()
        self.fc2=nn.Linear(hidden_size,num_classes)

    def forward(self, x):
        out=self.fc1(x)
        out=self.relu(out)
        out=self.fc2(out)
        return out
net=Net(input_size,hidden_size,num_classes)
#打印模型,呈现网络结构
print(net)

 5.训练流程

#训练流程
#Loss and Optimizer 定义loss和optimizer
criterion=nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(net.parameters(),lr=learning_rate)

#train the model 开始训练
for epoch in range(num_epoches):
    for i,(images,labels) in enumerate(train_loader):#批处理
        #convert torch tensor to Variable
        images=Variable(images.view(-1,28*28))
        labels=Variable(labels)

        #forward+backward+optimize
        optimizer.zero_grad()#zero the gradient buffer梯度清零,以免影响其他batch
        outputs=net(images)#前向传播
        loss=criterion(outputs,labels)#loss
        loss.backward()#后向传播,计算梯度
        optimizer.step()#梯度更新

        if(i+1)%100==0:
            print('Epoch [%d/%d],Step[%d,%d],Loss:%.4f'%(epoch+1,num_epoches,i+1,len(train_dataset)//batch_size,loss.item()))

 6.在测试集测试识别率

#Test the model,在测试集上验证模型
correct=0
total=0
for images,labels in test_loader:#test set批处理
    images=Variable(images.view(-1,28*28))
    outputs=net(images)
    _,predicted=torch.max(outputs.data,1)#预测结果
    total+=labels.size(0)#正确结果
    correct+=(predicted==labels).sum()#正确结果总数
print('Accuracy of the network on thr 10000 test iamges:%d %%'%(100*correct/total))
12-15 02:36
查看更多