代码地址
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特征图可视化: