PyTorch搭建神经网络——MNIST手写数据集


之前自己写的网络一直放在为知笔记里,现在把它们移到这边来。

MNIST数据集介绍

MNIST数据集是学习模式识别和各大深度学习框架的基础数据库,共含有60000个训练样本和10000个测试样本,60000个训练样本又拆分为55000个训练样本和5000个验证样本,验证样本为每张28×28的灰度图片在这里插入图片描述
MNIST数据集可以在:http://m.cnwest.com/data/html/content/11271894.html获取,它一共包含了四个部分:
1、Training set images: train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)
2、Training set labels: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)
3、Test set images: t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)
4、Test set labels: t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)
解压后如下:
在这里插入图片描述

搭建网络过程

Step1

仿照莫烦PYTHON里面的分类问题和批训练两节内容,搭建一个只有一个隐藏层且有100个神经元的神经网络

代码如下:

import torch
import torch.nn.functional as nn
import torch.utils.data as data
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from torch.autograd import Variable

num_epoch = 10
BATCH_SIZE = 100

#MNIST数据集加载
train_dataset = datasets.MNIST(
    root= '/home/cxm-irene/mnist',
    train= True, 
    transform= transforms.ToTensor(), 
    download= False
)
train_loader = data.DataLoader(
    dataset= train_dataset, 
    batch_size= BATCH_SIZE, 
    shuffle= True
)
test_dataset = datasets.MNIST(
    root= '/home/cxm-irene/mnist', 
    train= False, 
    transform= transforms.ToTensor(), 
    download= False
)

#搭建网络
class Net_MNIST(torch.nn.Module):
    def __init__(self, n_features, n_hidden, n_output):
        super(Net_MNIST, self).__init__()
        self.hidden = torch.nn.Linear(n_features, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)
    def forward(self, x):
        x = nn.relu(self.hidden(x))
        x = self.predict(x)
        return x
        
input_size = 28*28
num_class = 10
hidden_layer = 100

#定义网络
net_mnist = Net_MNIST(input_size, hidden_layer, num_class)
print(net_mnist)

#进行优化
optimizer = torch.optim.SGD(net_mnist.parameters(), lr = 0.005)
loss_function = torch.nn.CrossEntropyLoss()

#开始训练
for epoch in range(num_epoch):
    print('epoch = %d' % epoch)
    for i, (batch_x, batch_y) in enumerate(train_loader):
        batch_x = Variable(batch_x.view(-1, 28*28))
        batch_y = Variable(batch_y)

        optimizer.zero_grad()
        x = net_mnist(batch_x)
        loss = loss_function(x, batch_y)
        loss.backward()
        optimizer.step()

        if i % 50 == 0:
            print('loss = %.5f' % loss.data[0])
            prediction = torch.max(x, 1)[1]
            pred_y = prediction.data.numpy().squeeze()
            target_y = batch_y.data.numpy()
            accuracy = float((pred_y == target_y).astype(int).sum()) / float(target_y.size)
            print('Accuracy=%.2f' % accuracy)

在step1里面,batch_size设置的是100,然后epoch设置的是10,优化器选择的是SGD,学习率设定的是0.005,
网络结构如下图:
在这里插入图片描述
图片是28*28的,中间隐藏层有100个神经元,然后最后输出的是10个分类
训练结果如下(截取了三个)
在这里插入图片描述
可以看到的是,loss值整体上是下降的,但是到后期这个趋势就没那么明显了,准确度到最后大概是0.9左右

Step2

两层隐藏层,每层隐藏层都是100个神经元,修改部分如下:

class Net_MNIST(torch.nn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值