用pytorch对以mnist数据集进行卷积神经网络(代码片段)

Paul-Huang Paul-Huang     2023-01-20     251

关键词:

PyTorch构建深度学习网络一般步骤

  1. 加 载 数 据 集 \\colorred加载数据集
  2. 定 义 网 络 结 构 模 型 \\colorred定义网络结构模型
  3. 定 义 损 失 函 数 \\colorred定义损失函数
  4. 定 义 优 化 算 法 \\colorred定义优化算法
  5. 迭 代 训 练 \\colorred迭代训练
    在训练阶段主要分为四个部分。
    1. 前向过程,计算输入到输出的结果
    2. 由结果和labels计算损失函数的值
    3. 后向过程,由损失计算各个变量的梯度
    4. 优化器根据梯度进行参数的更新
  6. 测 试 集 验 证 \\colorred测试集验证

1. 配置库

#配置库
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

解释:

  1. optim是优化器模块,里面包括具体的优化算法有:SGD、Momentum、RMSProp、AdaGrad和Adam

    其中Momentum是加速梯度下降算法,其他三个是改进学习率。常用的有:SGD和Adam。

  2. Variable是对tensor的封装,用于放入计算图进行前向传播、反向传播和自动求导,是一个非常最重要的基本对象。包含三个重要属性:datagradcreator。其中:
    1. data表示Tensor的本身;
    2. grad表示传播方向的梯度,
    3. creator是创建这个Variable的Function引用,该引用用于回溯整个创建链路。

    如果是用户创建的Variable,则creator为None,同时这种Variable称为Leaf Variable,autograd只会给这种Variable分配梯度。

  3. DataLoaderDataset是一个包装类,用来将数据包装为Dataset类,然后传入DataLoader中,我们再使用DataLoader这个类来更加快捷的对数据进行操作。

    具体来说,就是将数据集包装成特定的格式,便于处理和引用。

  4. torchvision.transforms是pytorch中的图像预处理模块,包含了很多种对图像数据进行变换的函数,这些都是在进行图像数据读入步骤中必不可少的。
  5. datasets顾名思义,是一系列数据集,可以通过相应的命令加载诸如MNIST等的数据集。

2. 配置超参数

#配置参数
torch.manual_seed(1)
Learning_rate = 1e-2
Batch_Size = 16   # 没批处理的数据
Device = torch.device("cuda" if torch.cuda.is_available() else "cpu")  # 用CPU还是GPU
Epochs = 100     # 训练数据集的轮次

解释:

  1. torch.manual_seed()是设置随机数种子,保证程序数字的可重复性,便于测试等。
  2. batch_size是批处理大小(批尺寸),即每次处理的数据量。 迭代次数 = 样本总数 批尺寸 \\colorred\\text迭代次数=\\frac\\text样本总数\\text批尺寸 迭代次数=批尺寸样本总数;在一定范围内,批尺寸越大,跑完一次全数据集(一个epoch)需要的迭代次数越少,处理数据速度也越快。但盲目增大会导致达到一定精度所需时间更大。
  3. learning_rate为学习率。学习率越小,每次梯度下降的步伐越小,要达到目标精度所需训练次数也更多;但学习率过大会导致梯度下降不收敛,达不到学习的目的。
  4. num_epocher 是数据集训练次数,即跑几遍数据集。

3. 加载数据集

## 3.构建pipeline,对图像做处理,transform
pipeline = transforms.Compose([
    transforms.ToTensor(),   # 将图片转换成Tensor
    transforms.Normalize((0.1307,), (0.3081, )) # 正则化,降低模型的复杂度
])

## 4.下载、加载数据
# 下载数据集
train_set = datasets.MNIST(root="data_Mnist", train=True, download=True, transform=pipeline)
test_set = datasets.MNIST(root="data_Mnist", train=False, download=True, transform=pipeline)

# 加载数据
train_loader = DataLoader(train_set, batch_size=Batch_Size, shuffle=True)    # 加载图片,进行打乱
test_loader = DataLoader(test_set, batch_size=Batch_Size, shuffle=True)

解释:

  1. 加载datasets中的MNIST手写数字数据集,可以加载本地下载好的数据集。
    • root为数据集存放的位置;
    • train表示是否是训练集;
    • transform.ToTensor()是将数据集数据归一化,将值为[0,255]的Image转化为[0,1.0]的Tensor数据,归一化能够提高梯度下降算法的收敛速度;
    • downlaod代表是否需要在线下载数据集,若本地没有则需要为True。
      加载测试集,参数设置与训练集类似。
  2. DataLoader用于包装数据,并提供对数据的快捷处理,其中shuffle参数为是否打乱顺序,训练集必须要打乱数据的次序,防止过拟合。

4. 定义卷积网络结构模型(重点)

##5. 构建网络模型
class Digit(nn.Module):
    def __init__(self):  # 定义自己的构造方法
        super().__init__()  # 继承构造方法
        self.conv1 = nn.Conv2d(1, 10, 5)  # 1:灰度图片的通道    10:输出通道    5:kernel  padding默认为0,输出:10*26*26
        self.conv2 = nn.Conv2d(10, 20, 3)  # 10:输入通道    20:输出通道      3:Kernel   padding默认为0,输出:20*24*24
        self.fc1 = nn.Linear(20 * 10 * 10, 500)  # 20*10*10:输入通道     500:输出通道
        self.fc2 = nn.Linear(500, 10)  # 500:输入通道   10:输出通道

    def forward(self, x):
        input_size = x.size(0)          # batch_size
        x = self.conv1(x)               # 输入:batch*1*28*28, 输出:batch*10*24*24(28-5+1=24)
        x = F.relu(x)                   # 激活函数shape不变
        x = F.max_pool2d(x, 2, 2)       # 输入:batch*10*24*24  输出:batch*10*12*12
        x = self.conv2(x)               # 输入:batch*10*12*12 输出:batch*20*10*1012-3+1=10)
        x = F.relu(x)  #
        x = x.view(input_size, -1)      # view:拉平,-1 自动计算维度:20*10*10 = 2000
        x = self.fc1(x)                 # 输入:batch*2000 输出:batch*500
        x = F.relu(x)                   # 保持shape不变
        x = self.fc2(x)                 # 输入: batch*500 输出:batch*10
        output = F.log_softmax(x, dim=1)  # 计算分类后每个数字的概率值

        return output

解释:

  1. nn.Moudle是十分重要的类,包含网络各层的定义,以及forword函数的定义 自 定 义 的 网 络 结 构 模 型 都 需 要 继 承 M o u d l e 类 \\colorred自定义的网络结构模型都需要继承Moudle类 Moudle

    自 定 义 网 络 结 构 \\colorblue自定义网络结构

    1. 需要继承nn.Module类,并实现forward方法。
    2. 一般把网络中具有可学习参数的层放在构造函数__init__()中,
    3. 不具有可学习参数的层(如ReLU)可放在构造函数中,也可不放在构造函数中(而在forward中使用nn.functional来代替)
    4. 只要在nn.Module的子类中定义了forward函数,backward函数就会被自动实现,而不需要像forword那样需要重新定义。
  2. super类的作用是 继 承 \\colorred继承 ,调用含super的各个的基类__init__函数。

    如果不使用super,就不会调用这些类的__init__函数,除非显式声明。而且使用super可以避免基类被重复调用。

  3. nn.sequential官方的解释是一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为元素的有序字典也可以作为传入参数。在这里的作用是构造神经网络结构。

  4. nn.Conv2d是卷积神经网络的卷积层函数,其默认参数如下:

    nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))
    

    程序中的参数解释:
      - in_channels: 输入数据通道数,RGB图片通道数为3,黑白图片的通道数1,MNIST数据集中是黑白图像,参数为1;
      - out_channel: 输出数据通道数,也称为卷积核数量,和提取的特征数量相关,这里取6;
      - kennel_size: 卷积核大小;这里取卷积核大小为3*3;
      - stride:步长,默认为1;
      - padding:填充数量,为保持输出尺寸不变,这里取1。

卷积的计算公式:
Input: ( N , C in  , H in  , W in  ) \\left(N, C_\\text in , H_\\text in , W_\\text in \\right) (N,Cin ,Hin ,Win )
Output: ( N , C out  , H out  , W out  ) \\left(N, C_\\text out , H_\\text out , W_\\text out \\right) (N,Cout ,Hout ,Wout ) where
H out  = ⌊ H in  + 2 ×  padding  [ 0 ] −  dilation  [ 0 ] × ( k e r n e l    s i z e [ 0 ] − 1 ) − 1  stride  [ 0 ] + 1 ⌋ . W out  = ⌊ W in  + 2 ×  padding  [ 1 ] −  dilation  [ 1 ] × ( k e r n e l    s i z e [ 1 ] − 1 ) − 1  stride  [ 1 ] + 1 ⌋ . \\beginaligned H_\\text out &=\\left\\lfloor\\fracH_\\text in +2 \\times \\text padding [0]-\\text dilation [0] \\times(kernel\\;size[0]-1)-1\\text stride [0]+1\\right\\rfloor.\\\\ W_\\text out &=\\left\\lfloor\\fracW_\\text in +2 \\times \\text padding [1]-\\text dilation [1] \\times(kernel\\;size[1]-1)-1\\text stride [1]+1\\right\\rfloor. \\endaligned Hout Wout = stride [0]Hin +2× padding [0] dilation [0]×(kernelsize[0]1)1+1.= stride [1]Win +2× padding [1] dilation [1]×(kernelsize[1]1)1+1.

  1. nn.Relu是激活函数,具有减少计算量,缓解过拟合的作用。

  2. nn.MaxPool2d是卷积神经网络的池化层,具有降采样,减少计算量的功能。这里采用的是最大池化层,卷积核大小为2*2,步长为2。池化层输出尺寸计算方法为:

    W:图像宽,H:图像高,D:图像深度(通道数)F:卷积核宽高,S:步长
    池化后输出图像大小:
    W = ( W − F ) S + 1 H = ( H − F ) S + 1 W=\\frac(W-F)S+1\\\\H=\\frac(H-F)S+1 W=S(WF)+1H=S(HF)+1
    输出的图像通道数(深度)不变。

    • 因此,程序中经过池化层后,图片尺寸为6×14×14,可见减

      用pytorch构建基于卷积神经网络的手写数字识别模型(代码片段)

      本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052目录一、MINST数据集介绍与分析二、卷积神经网络三、基于卷积神经网络的手写数字识别一、MINST数据集介绍与分析        MINST数据库是机器学习领域... 查看详情

      tensorflow训练mnist数据集——卷积神经网络(代码片段)

      ...积层和池化层各有两层。  在整个模型中,输入层负责数据输入;卷积层负责提取图片的特征 查看详情

      [pytorch系列-34]:卷积神经网络-搭建lenet-5网络与mnist数据集手写数字识别(代码片段)

      作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/details/121050469目录前言:LeNet网络详解第1章业务领域分析1.1 步骤1-1:... 查看详情

      [pytorch系列-40]:卷积神经网络-模型的恢复/加载-搭建lenet-5网络与mnist数据集手写数字识别(代码片段)

      作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客本文网址:https://blog.csdn.net/HiWangWenBing/article/details/121132377目录第1章模型的恢复与加载1.1概述 1.2 模型的恢复与加载类型1.... 查看详情

      [pytorch系列-41]:卷积神经网络-模型参数的恢复/加载-搭建lenet-5网络与mnist数据集手写数字识别(代码片段)

      作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客本文网址:https://blog.csdn.net/HiWangWenBing/article/details/121183889目录第1章模型的恢复与加载1.1概述 1.2 模型的恢复与加载类型1.... 查看详情

      pytorch深度学习实战|用tensorflow训练神经网络

      为了更好地理解神经网络如何解决现实世界中的问题,同时也为了熟悉TensorFlow的API,本篇我们将会做一个有关如何训练神经网络的练习,并以此为例,训练一个类似的神经网络。我们即将看到的神经网络,是... 查看详情

      我用pytorch复现了lenet-5神经网络(自定义数据集篇)!

      ...:这可能是神经网络LeNet-5最详细的解释了!我用PyTorch复现了LeNet-5神经网络(MNIST手写数据集篇)!我用PyTorch复现了LeNet-5神经网络(CIFAR10数据集篇)!详细介绍了卷积神经网络LeNet-5的理论部分和... 查看详情

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

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

      tensorflow学习教程------利用卷积神经网络对mnist数据集进行分类_训练模型(代码片段)

      原理就不多讲了,直接上代码,有详细注释。#coding:utf-8importtensorflowastffromtensorflow.examples.tutorials.mnistimportinput_datamnist=input_data.read_data_sets(‘MNIST_data‘,one_hot=True)#每个批次的大小batch_size=100n_batch=mnis 查看详情

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

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

      我用pytorch复现了lenet-5神经网络(cifar10数据集篇)!

      ...:这可能是神经网络LeNet-5最详细的解释了!我用PyTorch复现了LeNet-5神经网络(MNIST手写数据集篇)!详细介绍了卷积神经网络LeNet-5的理论部分和使用PyTorch复现LeNet-5网络来解决MNIST数据集的识别问题。今天我们... 查看详情

      我用pytorch复现了lenet-5神经网络(mnist手写数据集篇)!

      ...介绍了卷积神经网络LeNet-5的理论部分。今天我们将使用Pytorch来实现LeNet-5模型,并用它来解决MNIST数据集的识别。正文开始!一、使用LeNet-5网络结构创建MNIST手写数字识别分类器MNIST是一个非常有名的手写体数字识别数据... 查看详情

      我用pytorch复现了lenet-5神经网络(mnist手写数据集篇)!

      ...介绍了卷积神经网络LeNet-5的理论部分。今天我们将使用Pytorch来实现LeNet-5模型,并用它来解决MNIST数据集的识别。正文开始!一、使用LeNet-5网络结构创建MNIST手写数字识别分类器MNIST是一个非常有名的手写体数字识别数据... 查看详情

      我用pytorch复现了lenet-5神经网络(mnist手写数据集篇)!

      ...介绍了卷积神经网络LeNet-5的理论部分。今天我们将使用Pytorch来实现LeNet-5模型,并用它来解决MNIST数据集的识别。正文开始!一、使用LeNet-5网络结构创建MNIST手写数字识别分类器MNIST是一个非常有名的手写体数字识别数据... 查看详情

      tensorflow/简单网络mnist数据集-softmax全连接神经网络,卷积神经网络模型(代码片段)

      ...习]全连接+各种优化[待学习]BN层[待学习]先解释以下MNIST数据集,训练数据集有55,000条,即X为55,000*784的矩阵,那么Y为55,000*10的矩阵,每个图片是28 查看详情

      深度学习与tensorflow2.0卷积神经网络(cnn)(代码片段)

      注:在很长一段时间,MNIST数据集都是机器学习界很多分类算法的benchmark。初学深度学习,在这个数据集上训练一个有效的卷积神经网络就相当于学习编程的时候打印出一行“HelloWorld!”。下面基于与MNIST数据集非常类似的... 查看详情

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

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

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

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