深层神经网络——Pytorch实现MNIST手写数据集识别

Pytorch实现MNIST手写数据集识别

pytorch从入门到实战学习笔记

本文搭建简单的深层神经网络模型,对MNIST手写数据集进行识别。该神经网络由784个输入神经元,100个隐层神经元和10个输出神经元构成。待读者通过这个例子掌握深层神经网络特征,便可自行设计。

import torch
import torch.nn as nn
from torch.autograd import  Variable
import torch.utils.data as Data
import torchvision
import matplotlib.pyplot as plt

# Hypwe parameters
EPOCH = 10
BATCH_SIZE = 100                        #批处理大小
LR = 0.001                              #learning rate
DOWNLOAD_MNIST = False                   #在这里,我已经下载了MNIST数据集了,就不用再下载了,否则为True

# MNIST Dataest
train_data = torchvision.datasets.MNIST(           #下载MNIST数据
    root='./mnist/',
    train=True,
    transform=torchvision.transforms.ToTensor(), #下载的数据改成Tensor的数据 图片数据(0,255),转换为(0,1)的totensor数据
    download=DOWNLOAD_MNIST
)                                          #设置训练集
test_data = torchvision.datasets.MNIST(root='./data',train=False,transform=torchvision.transforms.ToTensor(),download=True)                      #设置测试集
train_loader = Data.DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True)    #训练集中,shuffle必须为True 打乱次序
test_loader = Data.DataLoader(dataset=test_data,batch_size=BATCH_SIZE,shuffle=False)

# Neural Network Model
class Net(torch.nn.Module):                                    #   设置DNN模型
    def __init__(self,n_feature,n_hidden,n_output):                      
        super(Net,self).__init__()
        self.hidden = torch.nn.Linear(n_feature,n_hidden)         #设置 输入层到隐含层
        self.relu = nn.ReLU()                                   #激活函数
        self.predict = torch.nn.Linear(n_hidden,n_output)       #隐含层到输出层

    def forward(self, x):                       
        out = self.hidden(x)
        out = self.relu(out)
        out = self.predict(out)
        return out

net = Net(784,100,10)                                         
print(net)

# Loss and Optimizer
optimizer = torch.optim.SGD(net.parameters(),lr=LR)
loss_func = nn.CrossEntropyLoss()


Loss_list = []                      #创建一个list,以便后续可视化
Accuracy_list = []


#Train the Model
for epoch in range(EPOCH):
    running_loss = 0
    running_acc = 0
    for i, (images, labels) in enumerate(train_loader):  #批处理
        images = Variable(images.view(-1, 28*28))
        labels = Variable(labels)  #Convert torch tensor to Variable   将数据用Variable包起来输入模型中



        outputs = net(images)                     #前向传播,将包好的数据输入net
        loss = loss_func(outputs, labels)           #损失函数
        running_loss += loss.item()*labels.size(0)    #由于loss是batch取均值的,所以把要把batch size乘回去
        _,pred = torch.max(outputs,1)               #预测结果
        num_correct = (pred == labels).sum()          
        running_acc += num_correct.item()              #正确结果的总数
        optimizer.zero_grad()       #梯度清零 以免影响其他batch
        loss.backward()             #反向传播
        optimizer.step()            #梯度更新


    print('Train{} epoch, Loss: {:.6f},Acc: {:.6f}'.format(epoch + 1, running_loss / (len(train_data)),running_acc / (len(train_data)))) 输出每个epoch的 loss 和 acc
          
    Loss_list.append(running_loss / (len(train_data)))         
    Accuracy_list.append(running_acc / (len(train_data)))
 # 我这里迭代了10次,所以x的取值范围为(0,10),然后再将每次相对应的准确率以及损失率附在x上
    x1 = range(0, 10)
    x2 = range(0, 10)
    y1 = Accuracy_list
    y2 = Loss_list
plt.subplot(2, 1, 1)
plt.plot(x1, y1, 'o-')
plt.title('Test accuracy vs. epoches')
plt.ylabel('Test accuracy')
plt.subplot(2, 1, 2)
plt.plot(x2, y2, '.-')
plt.xlabel('epoches')
plt.ylabel('Test loss')                     #将精确率可视化的过程


#Test the model
correct = 0
total = 0
for images, labels in test_loader:
    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 the 10000 test images: %d %%' % (100*correct /total)) 

具体可视化过程参照:

https://blog.csdn.net/tequilaro/article/details/81841748

结果
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值