LeNet

LeNet

结构

LeNet最初是为Mnist,其结构较为简单,只有五层,其论文原图如下,论文参考为:Gradient-Based_Learning_Applied_to_Document_Recognition

LeNet

根据自己的理解得到如下结构,我采用的数据集是Cifar-10,大小为32*32(当然具体的参数可以自己修改的,但是总体是这个意思):

LeNet

借助pytorch可视化结果如下:

LeNet_2

其解释如下:

  • 首先是卷积部分,也就是卷积+池化的结构
  • 第一个卷积层采用20个大小为5*5的卷积核,stride为1,卷积结果得到20*28*28
    • 第一个池化层采用核大小为2*2的Max Pooling, stride为2,池化结果得到20*14*14
    • 第二个卷积层采用50个大小为5*5的卷积核,stride为2,卷积结果得到50*10*10
    • 第二个池化层采用核大小为2*2的Max Pooling,stride为2,池化结果得到50*5*5
  • 接下去是FC层
    • 第一个全连接层的神经元个数是500,之后接入ReLU激活函数增加非线性能力
    • 第二个全连接层的神经元个数为10个,之后输出到softmax函数中,计算每个类别的得分值,完成分类

代码实现

在上面的结构上,FC层中增加了一个drop层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class LeNet(torch.nn.Module):
def __init__(self):
super().__init__()
# Input: 3*32*32, conv1 output: 20*28*28
self.conv1 = torch.nn.Conv2d(3, 20, kernel_size = (5,5), stride = 1)
# 20*28*28->20*14*14
self.pool1 = torch.nn.MaxPool2d(2)
# 20*14*14->50*10*10
self.conv2 = torch.nn.Conv2d(20, 50, kernel_size = (5,5), stride = 1)
# 50*10*10->50*5*5
self.pool2 = torch.nn.MaxPool2d(2)
# 50*5*5->500
self.fc1 = torch.nn.Linear(1250, 500)
self.relu1 = torch.nn.ReLU()
self.fc2 = torch.nn.Linear(500, 10)
self.relu2 = torch.nn.ReLU()
self.dropout = torch.nn.Dropout(0.5)
def forward(self, x):
x = self.pool1(self.conv1(x))
x = self.pool2(self.conv2(x))
x = self.relu1(self.fc1(x.view(-1,1250)))
x = self.fc2(x)
return x

结果

该网络运行在Cifar-10数据集上的结果如下所示(batch_size = 256, epochs = 50):

loss
acc