pytorch实现mlp并在mnist数据集上验证(代码片段)

fyunaru fyunaru     2023-03-21     425

关键词:

写在前面

由于MLP的实现框架已经非常完善,网上搜到的代码大都大同小异,而且MLP的实现是deeplearning学习过程中较为基础的一个实验。因此完全可以找一份源码以参考,重点在于照着源码手敲一遍,以熟悉pytorch的基本操作。

实验要求

熟悉pytorch的基本操作:用pytorch实现MLP,并在MNIST数据集上进行训练

环境配置

实验环境如下:

  • Win10
  • python3.8
  • Anaconda3
  • Cuda10.2 + cudnn v7
  • GPU : NVIDIA GeForce MX250

配置环境的过程中遇到了一些问题,解决方案如下:

  1. anaconda下载过慢

    使用清华镜像源,直接百度搜索即可

  2. pytorch安装失败

    这里我首先使用的是pip的安装方法,失败多次后尝试了使用anaconda,然后配置了清华镜像源,最后成功。参考的教程如下:
    win10快速安装pytorch,清华镜像源

    当然也可以直接去pytorch官网下载所需版本的whl文件,然后手动pip安装。由于这种方式我已经学会了,为了学习anaconda,所以没有采用这种方式。具体方式可以百度如何使用whl。顺便贴下pytorch的whl的下载页面

注意:pytorch的版本是要严格对应是否使用GPU、python版本、cuda版本的,如需手动下载pytorch的安装包,需搞懂其whl文件的命名格式

另外还学习了anaconda的一些基本操作与原理,参考如下:
Anaconda完全入门指南

实验过程

最终代码见github:hit-deeplearning-1

首先设置一些全局变量,加载数据。batch_size决定了每次向网络中输入的样本数,epoch决定了整个数据集的迭代次数,具体作用与大小如何调整可参考附录中的博客。

将数据读入,如果数据不存在于本地,则可以自动从网上下载,并保存在本地的data文件夹下。

#一次取出的训练样本数
batch_size = 16
# epoch 的数目
n_epochs = 10

#读取数据
train_data = datasets.MNIST(root="./data", train=True, download=True,transform=transforms.ToTensor())
test_data = datasets.MNIST(root="./data", train=False, download=True, transform=transforms.ToTensor())
#创建数据加载器
train_loader = torch.utils.data.DataLoader(train_data, batch_size = batch_size, num_workers = 0)
test_loader = torch.utils.data.DataLoader(test_data, batch_size = batch_size, num_workers = 0)

接下来是创建MLP模型,关于如何创建一个模型,可以参考附录中的博客,总之创建模型模板,训练模板都是固定的。

其中LinearviewCrossEntropyLossSGD的用法需重点关注。查看官方文档或博客解决。

这两条语句将数据放到了GPU上,同理测试的时候也要这样做。

data = data.cuda()
target = target.cuda()
class MLP(nn.Module):
    def __init__(self):
        #继承自父类
        super(MLP, self).__init__()
        #创建一个三层的网络
        #输入的28*28为图片大小,输出的10为数字的类别数
        hidden_first = 512
        hidden_second = 512
        self.first = nn.Linear(in_features=28*28, out_features=hidden_first)
        self.second = nn.Linear(in_features=hidden_first, out_features=hidden_second)
        self.third = nn.Linear(in_features=hidden_second, out_features=10)

    def forward(self, data):
        #先将图片数据转化为1*784的张量
        data = data.view(-1, 28*28)
        data = F.relu(self.first(data))
        data = F.relu((self.second(data)))
        data = F.log_softmax(self.third(data), dim = 1)

        return data

def train():
    # 定义损失函数和优化器
    lossfunc = torch.nn.CrossEntropyLoss().cuda()
    #lossfunc = torch.nn.CrossEntropyLoss()
    optimizer = torch.optim.SGD(params=model.parameters(), lr=0.01)
    # 开始训练
    for epoch in range(n_epochs):
        train_loss = 0.0
        for data, target in train_loader:
            optimizer.zero_grad()
            #将数据放至GPU并计算输出
            data = data.cuda()
            target = target.cuda()
            output = model(data)
            #计算误差
            loss = lossfunc(output, target)
            #反向传播
            loss.backward()
            #将参数更新至网络中
            optimizer.step()
            #计算误差
            train_loss += loss.item() * data.size(0)
        train_loss = train_loss / len(train_loader.dataset)
        print(‘Epoch:    	Training Loss: :.6f‘.format(epoch + 1, train_loss))
        # 每遍历一遍数据集,测试一下准确率
        test()
    #最后将模型保存
    path = "model.pt"
    torch.save(model, path)

test程序不再贴出,直接调用了一个很常用的test程序。

最后是主程序,在这里将模型放到GPU上。

model = MLP()
#将模型放到GPU上
model = model.cuda()
train()

实验结果

实验结果如下,可以看到,当对数据迭代训练十次时,准确率已经可以达到97%

技术图片

分别运行了两次,第一次没有使用cuda加速,第二次使用了cuda加速,任务管理器分别显示如下:

技术图片

技术图片

可以看到,未使用cuda加速时,cpu占用率达到了100%,而GPU的使用率为0;而使用cuda加速时,cpu占用率只有49%,而GPU使用率为1%。这里GPU使用率较低的原因很多,比如我程序中batch_size设置的较小,另外只将数据和模型放到了GPU上,cpu上仍有部分代码与数据。经简单测试,使用cuda的训练时间在2:30左右,不使用cuda的训练时间在3:40左右。

参考博客

使用Pytorch构建MLP模型实现MNIST手写数字识别

如何创建自定义模型

pytorch教程之nn.Module类详解——使用Module类来自定义网络层

epoch和batch是什么

深度学习 | 三个概念:Epoch, Batch, Iteration

如何用GPU加速

从头学pytorch(十三):使用GPU做计算

PyTorch如何使用GPU加速(CPU与GPU数据的相互转换)

保存模型

PyTorch模型保存与加载

使用 pytorch 和 sklearn 对 MNIST 数据集进行交叉验证

】使用pytorch和sklearn对MNIST数据集进行交叉验证【英文标题】:CrossvalidationforMNISTdatasetwithpytorchandsklearn【发布时间】:2020-03-1815:27:22【问题描述】:我是pytorch的新手,正在尝试实现前馈神经网络来对mnist数据集进行分类。我在尝... 查看详情

用pytorch实现多层感知机(mlp)(全连接神经网络fc)分类mnist手写数字体的识别(代码片段)

1.导入必备的包1importtorch2importnumpyasnp3fromtorchvision.datasetsimportmnist4fromtorchimportnn5fromtorch.autogradimportVariable6importmatplotlib.pyplotasplt7importtorch.nn.functionalasF8fromtorch.utils.da 查看详情

mnist数据集手写体识别(mlp实现)(代码片段)

...络模型(mnist手写体识别数据集)MNIST数据集手写体识别(MLP实现)importtensorflowastfimporttensorflow.examples.tutorials.mnist.input_dataasinput_data#导入 查看详情

pytorch实现mlp(基于pytorch实现)

文章目录前言一、导入相关库二、加载Cora数据集三、定义MLP网络3.1定义MLP层3.1.1定义参数WWW和bb 查看详情

tersorflowtutorial_mnist数据集上简单cnn实现

MNIST数据集上简单CNN实现觉得有用的话,欢迎一起讨论相互学习~FollowMe参考文献Tensorflow机器学习实战指南源代码请点击下方链接欢迎加星Tesorflow实现基于MNIST数据集上简单CNN少说废话多写代码下载并读取MNIST数据集importmatplotlib.pyplo... 查看详情

深度学习mlp/lenet/alexnet/googlenet/resnet在三个不同数据集上的分类效果实践

...度神经网络模型结构和MNIST、FashionMNIST、HWDB1三个不同的数据集,所用的开发框架为tensorflow2。本文的数据集和.ipynb文件可在此处下载​实验结果实验结果如下表所示模型在不同数据集上的准确度MNISTFashionMNISTHWDB1MLP97.76%87.7 查看详情

pytorch使用mnist数据集实现手写数字识别(代码片段)

...用mnist数据集实现手写数字识别是入门必做吧。这里使用pyTorch框架进行简单神经网络的搭建。首先导入需要的包。1importtorch2importtorch.nnasnn3importtorch.utils.dataasData4importtorchvision 接下来需要下载mnist数据集。我们创建train_data。使... 查看详情

从头开始实现 MLP 和在 PyTorch 中实现有啥区别?

】从头开始实现MLP和在PyTorch中实现有啥区别?【英文标题】:WhatisthedifferencebetweenMLPimplementationfromscratchandinPyTorch?从头开始实现MLP和在PyTorch中实现有什么区别?【发布时间】:2019-06-1207:33:57【问题描述】:跟进Howtoupdatethelearningra... 查看详情

pytorch-模型建立(代码片段)

...MNIST成为FashionMNIST?FashionMNIST是怎么创建的?通过PyTorch进行数据集加载数据准备Datasets和DataLoaders批量处理模型建立python中的面向对象(OOP)PyTorch中的torch.nnnn.Module中的forward()方法PyTorch中的nn.functional包定义神经网... 查看详情

mlp多层感知器pytorch实现过程(代码片段)

参考博客:https://blog.csdn.net/xholes/article/details/78461164https://www.pianshen.com/article/1392309515/代码github地址使用pytorch框架实现MLP。为了深入了解源码,没有使用pytorch中torch.nn.Module类和其它现有的方法,大部分功 查看详情

pytorch+pyg实现mlp(代码片段)

...台:Windows10语言环境:python3.7编译器:PyCharmPyTorch版本:1.11.0PyG版本:2.1.0💥项目专栏:【图神经网络代码实战目录】本文我们将使用Pytorch+PytorchGeometric来简易实现一个MLP(感知机网络)࿰... 查看详情

pytorch之神经网络mnist分类任务(代码片段)

...使用TensorDataset和DataLoader简化本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052一、Mnist分类任务简介在上一篇博客当中,我们通过搭建PyTorch神经网络实现了气温预测,这本质上是一个回归任务。在... 查看详情

基于pytorch平台实现对mnist数据集的分类分析(前馈神经网络softmax)基础版(代码片段)

基于pytorch平台实现对MNIST数据集的分类分析(前馈神经网络、softmax)基础版文章目录基于pytorch平台实现对MNIST数据集的分类分析(前馈神经网络、softmax)基础版前言一、基于“前馈神经网络”模型,分类分析... 查看详情

图像分类基于pytorch搭建lstm实现mnist手写数字体识别(单向lstm,附完整代码和数据集)(代码片段)

写在前面:首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。提起LSTM大家第一反应是在NLP的数据集上比较常见,不过在... 查看详情

利用knnsvmcnn逻辑回归mlprnn等方法实现mnist数据集分类(pytorch实现)(代码片段)

电脑配置:python3.6*​*Pytorch1.2.0*​*torchvision0.4.0想学习机器学习和深度学习的同学,首先找个比较经典的案例和经典的方法自己动手试一试,分析这些方法的思想和每一行代码是一个快速入门的小技巧,今天我们... 查看详情

MNIST 数据集上的 NuPIC

】MNIST数据集上的NuPIC【英文标题】:NuPIConMNISTDataset【发布时间】:2014-12-0211:48:51【问题描述】:我是新手。我认为NuPIC的想法真的很酷,因此想将KNN分类器应用于NuPIC的输出。我看到python中已经有一个KNNClassifier对象。我对输入... 查看详情

深度学习6.多层感知机及pytorch实现

深度学习6.多层感知机及PyTorch实现​​一、概念​​​​1.MLP​​​​2.前向传播​​​​3.反向传播​​​​4.评估模式与训练模式​​​​二、模型定义​​​​1.加载数据集​​​​2.定义MLP层​​​​3.前向传播​​​​4.... 查看详情

gluon实现多层感知机mlp分类fashionmnist(代码片段)

frommxnetimportgluon,initfrommxnet.gluonimportlossasgloss,nnfrommxnet.gluonimportdataasgdatafrommxnetimportnd,autogradimportgluonbookasgbimportsys#读取数据#读取数据mnist_train=gdata.vision.FashionMNIST(train= 查看详情