PyTorch详细入门-实现MNIST手写识别网络

本文详述了使用PyTorch构建MNIST手写识别网络的步骤,包括CNN概念、激活函数、池化层、全连接层、损失函数、数据加载、超参数设置、模型定义、训练与测试过程。
摘要由CSDN通过智能技术生成

实现MNIST手写识别网络

若想复现一个神经网络,MNIST手写识别可以算是简单的入门了,mnist是由七万张28*28像素的图片构成,其中60000用来训练我们的模型,剩下的10000张用来测试。今天就详细的介绍基于pytorch框架的网络实现:

CNN的几个概念

首先,构建的网络是卷积神经网络;分别是:

卷积层(Convolutional layer),卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。

激活函数(Rectified Linear Units layer, ReLU layer),这一层神经的活性化函数(Activation function)使用线性整流(Rectified Linear Units, ReLU)f(x)=max(0,x)f(x)=max(0,x)。

池化层(Pooling layer),通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。对图片进行压缩(降采样)

全连接层( Fully-Connected layer), 把所有局部特征结合变成全局特征,用来计算最后每一类的得分。

损失函数
在深度学习中,损失反映模型最后预测结果与实际真值之间的差距,可以用来分析训练过程的好坏、模型是否收敛等,例如均方损失、交叉熵损失等。

代码书写思路:

第一步
加载用到的库,
其中torch包含多维张量的数据结构,并定义了对这些张量的数学运算。
torch.nn.functional包含了卷积函数,池化函数,非线性激活函数,线性函数,损失函数等函数。
torch.optim是一个实现各种优化算法的包,必须构造一个优化器对象,该对象将保存当前状态并根据计算出的梯度更新参数
PyTorch 数据加载实用程序的核心是torch.utils.data.DataLoader 类,它代表一个 Python 可迭代的数据集

# 加载库
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms

第二步
设置超参数,超参数类似于c++中的宏定义,便于控制,BATCH_SIZE是每一批次处理的数量,比如一次输入64张图片进行处理, DEVICE顾名思义就是设备,我们将数据部署到GPU上进行处理,如果用cpu也可以,改为cpu即可。EPOCHS是数据集迭代的轮次。

BATCH_SIZE = 64
DEVICE = torch.device("gpu")
EPOCHS = 10

第三步
定义数据变换pipline,把我们的数据集的图片信息转换为张量表示,并正则化处理。实现对图片的变换处理。

pipline = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

第四步
上文中提到的数据集可以从网上下载,可以直接在代码里通过指令下载,下载到当前目录下自定义设置的“data”这个目录下,通过datasets.MNIST完成下载。下载完了还要加载数据,用DataLoader函数实现加载。

from torch.utils.data import DataLoader
train_set = datasets.MNIST("data", train=True, download=True, transform=pipline)
test_set = datasets.MNIST("data", train=False, download=True, transform=pipline)

train_loader = DataLoader(train_set, batch_size=BATCH_SIZE, shuffle=True)
test_loader = DataLoader(test_set, batch_size=BATCH_SIZE, shuffle=True)

第五步
创建我们的模型,在这里用到了两层卷积层,两层全连接层。

class MMN(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 10, 5)
        self.conv2 = nn.Conv2d(10, 20, 3)
        self.fc1 = nn.Linear(20*10*10, 500)
        self
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值