代码地址
https://github.com/xmy0916/DLNetwork

简介

LeNet5诞生于1994年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从1988年开始,在多年的研究和许多次成功的迭代后,这项由Yann LeCun完成的开拓性成果被命名为LeNet5。

重点

局部感受野(local receptive fields):基于图像局部相关的原理,保留了图像局部结构,同时减少了网络的权值

权值共享(shared weights): 也是基于图像局部相关的原理,同时减少网络的权值参数

下采样(sub-sampling):对平移和形变更加鲁棒,实现特征的不变性,同时起到了一定的降维的作用

局部感受野

在这里插入图片描述

黑色绿色红色蓝色这四个神经元分别链接了图示四个区域,而不是与图中单个像素相链接这就叫局部感受野。

权重共享

如果想要原始图像的一个特征图只需要一个卷积核即可,假设这个卷积核的是3 _ 3大小的,那么要得到这个特征图只需要训练9个参数。也就是说整张图都是享用这个3 _ 3的卷积核的参数这就是权重共享。如果想要更多的特征图只需要增加卷积核的个数即可。

池化下采样

池化有两种操作,最大池化和平均池化。假设池化的大小是2 _ 2。最大池化直接以2 _ 2大小的滑动窗口在输入的特征图上去最大值。平均池化同理但是取得是平均值。这样特征图变小可以减少训练的参数量。池化层中平均池化是有两个参数可以训练的,一个是偏置的值还一个是对平均结果乘一个系数值。最大池化没有参数(这里还不太确定,但应该是没有吧???但好像也可以有,比如加上一个偏置)。

结构

在这里插入图片描述
在这里插入图片描述

代码

https://github.com/xmy0916/DLNetwork
网络结构部分:

class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.relu = nn.ReLU()
        self.maxpool1 = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.maxpool2 = nn.MaxPool2d(2, 2)

        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.maxpool1(x)
        x = self.conv2(x)
        x = self.relu(x)
        x = self.maxpool2(x)
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

conv1特征图可视化:
在这里插入图片描述