LeNet------识别手写数字图像的经典卷积神经网络与PyTorch实现
- 1、LeNet简介
- 2、LeNet主要贡献
- 3、LeNet网络结构PyTorch实现
1、LeNet简介
LeNet的网络结构如下图所示。
由上图可以看出,LeNet模型主要有两部分组成:卷积模块(红色区域)与全连接模块(绿色区域)。而在卷积模块中主要是由卷积操作与最大池化层。
1.1 卷积模块
在卷积层块中,每个卷积层都使用5×55\times 55×5的窗口,并在输出上使用sigmoid激活函数。第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。
在上图网络结构中有Subsampling,此过程就是应用最大池化完成的。其中,最大池化的窗口大小为2×22\times 22×2,且步幅为2。由于池化窗口与步幅形状相同,池化窗口在输入上每次滑动所覆盖的区域互不重叠。
1.2 全连接模块
全连接模块是以第二次卷积池化的结果作为输入。此时的输出主要包括批量大小, 通道, 高, 宽等4维数据。当卷积层块的输出传入全连接层块时,全连接层的输入形状将变成二维(flatten操作,即将小批量中每个样本变平化),其中第一维是小批量中的样本,第二维是每个样本变平后的向量表示,且向量长度为通道、高和宽的乘积。全连接层块含3个全连接层。它们的输出个数分别是120、84和10,其中10为输出的类别个数。
2、LeNet主要贡献
- LeNet是第一次将卷积神经网络应用于实际操作中,是通过梯度下降训练卷积神经网络的鼻祖算法之一;
- LeNet奠定了卷积神经网络的基本结构,即卷积、非线性激活函数、池化、全连接;
- 使用局部感受野,权值共享,池化(下采样)来实现图像的平移,缩放和形变的不变性,其中卷积层用来识别图像里的空间模式,如线条和物体局部特征,最大池化层则用来降低卷积层对位置的敏感性;
3、LeNet网络结构PyTorch实现
import time
import torch
from torch import nn, optim
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')class LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()self.conv = nn.Sequential(nn.Conv2d(1, 6, 5), nn.Sigmoid(), nn.MaxPool2d(2, 2), nn.Conv2d(6, 16, 5), nn.Sigmoid(),nn.MaxPool2d(2, 2))self.fc = nn.Sequential(nn.Linear(16*4*4, 120), nn.Sigmoid(),nn.Linear(120, 84),nn.Sigmoid(),nn.Linear(84, 10))def forward(self, img):feature = self.conv(img)output = self.fc(feature.view(img.shape[0], -1))return output