教程:j从零开始实现一个基于Pytorch的卷积神经网络 - 知乎
目录
模型命名为LeNet,创建一个名为LeNet的类,该类继承了nn.Module
类,写法如下:
class LeNet(nn.Module):
网络结构
从图中可以看出,其输入32x32的灰度图像,由于MNIST数据集的图像为28x28,因此,我们将输入改为28x28,并依次计算每一层输出的特征图大小。其每一层参数大致如下:
输入层:输入大小28x28,通道数为1。注意:本层不算LeNet-5的网络结构,一般情况下不将输入层视为网络层次结构之一。
C1-卷积层:输入大小28x28,通道数为1;输出大小28x28,通道数为6;卷积核大小为5x5;步长为1;边缘补零为2;激活函数为ReLU。注意:为了提升卷积神经网络的效果,在每个卷积层后添加激活函数,本教程使用的激活函数为ReLU。
S2-池化层:输入大小28x28,通道数为6;输出大小14x14,通道数为6;池化核大小为2x2;步长为2;池化方式为最大池化。
C3-卷积层:输入大小14x14,通道数为6;输出大小10x10,通道数为16;卷积核大小为5x5;步长为1;边缘补零为0;激活函数为ReLU。
S4-池化层:输入大小10x10,通道数为16;输出大小5x5,通道数为16;池化核大小为2x2;步长为2;池化方式为最大池化。
C5-卷积层:输入大小5x5,通道数为16;输出大小1x1,通道数为120;卷积核大小为5x5;步长为1;边缘补零为0;激活函数为ReLU。注意:这层也可以看作全连接层,可以通过全连接的方法实现。
F6-全连接层:输入为120维向量;输出为84维向量;激活函数为ReLU。
OUTPUT-输出层:输入为84维向量;输出为10维向量。注意:该层也是全连接层,且不带激活函数。
1 初始化
__init__
函数即初始化,主要用于定义每一层的构成,如卷积、池化层等;根据网络结构对每一层的参数进行定义。
# 初始化模型
def __init__(self):
super(LeNet,self).__init__()
# 定义每一层的操作和参数
self.C1 = nn.Conv2d(in_channels=1,out_channels=6,kernel_size=5,stride=1,padding