AlexNet是2012年ILSVRC 2012(ImageNet Large Scale Visual Recognition Challenge)竞赛的冠军网络。由Hinton和他的学生Alex Krizhevsky设计的。论文原文
中文版
网络结构
AlexNet论文中所示的网络结构如下:
因为Alex使用在训练模型时使用了两块GPU,所以上下两部分结构是一样的,解读一部分就可以了。
AlexNet的特色
1.首次使用GPU进行加速训练
2.激活函数使用了ReLU函数,而不是Sigmoid函数或者Tanh激活函数。
3.使用了LRN局部响应归一化
4.在全连接层的前两层中使用了Dropout,随机失活神经元,以此来减少过拟合。
详解
AlexNet模型共有5个卷积层,3个全连接层,前两个卷积层和第五个卷积层有pool池化层,其他两个卷积层没有池化。
1.输入
AlexNet的输入是(1 * 3 * 227 * 227)
2.Conv1-第一卷积层
in_channels = 3
out_channels = 96
kernel_size = 11
stride = 4
输出h/w:(227-11)/4 + 1 = 55
2.pool2-第一池化层
输入h/w = 55
in_channels = 96
out_channels = 96
kernel_size = 3
stride = 2
输出h/w:(55-3)/2 + 1 = 27
3.Conv2-第二卷积层
输入h/w = 27
in_channels = 96
out_channels = 256
kernel_size = 5
padding = 2
stride = 1
输出h/w:(27-5+2*2)/1 + 1 = 27
4.pool2-第二池化层
输入h/w = 27
in_channels = 256
out_channels = 128
kernel_size = 3
stride = 2
输出h/w:(27-3)/2 + 1 = 13
5.Conv2-第三卷积层
输入h/w = 13
in_channels = 128
out_channels = 192
kernel_size = 3
padding = 1
stride = 1
输出h/w:(13-3+1*2)/1 + 1 = 13
6.Conv2-第四卷积层
输入h/w = 13
in_channels = 192
out_channels = 384
kernel_size = 3
padding = 1
stride = 1
输出h/w:(13-3+1*2)/1 + 1 = 13
7.Conv2-第五卷积层
输入h/w = 13
in_channels = 384
out_channels = 256
kernel_size = 3
padding = 1
stride = 1
输出h/w:(13-3+1*2)/1 + 1 = 13
8.pool2-第三池化层
输入h/w = 13
in_channels = 256
out_channels = 256
kernel_size = 3
stride = 2
输出h/w:(13-3)/2 + 1 = 6
9.Linear-第一全连接层
输入特征图单元数:66256,
输出特征图单元数:4096
全连接参数个数: 66256*4096
每个6 * 6 * 256尺寸的滤波器对第六层的输入数据进行卷积运算生成一 个运算结果,通过一个神经元输出这个运算结果;共有4096个6 * 6 * 256尺寸的滤波器对输入数据进行卷积,通过4096个神经元的输出运算结果;然后通过ReLU激活函数以及dropout运算输出4096个本层的输出结果值。采用的滤波器的尺寸(66256)和待处理的feature map的尺寸(66256)相同,即滤波器中的每个系数只与feature map中的一个像素值相乘;而采用的滤波器的尺寸和待处理的feature map的尺寸不相同,每个滤波器的系数都会与多个feature map中像素相乘。因此第6层被称为全连接层。
10.Linear-第二全连接层
输入特征图单元数:4096,
输出特征图单元数:4096
全连接参数个数: 40964096
第6层输出的4096个数据与第7层的4096个神经元进行全连接,然后经由ReLU和Dropout进行处理后生成4096个数据。
11.Linear-第三全连接层(输出层)
输入特征图单元数:4096,
输出特征图单元数:1000
全连接参数个数: 40961000
第7层输入的4096个数据与第8层的1000个神经元进行全连接,经过训练后输出被训练的数值。
AlexNet 实现
使用fashion-MNIST数据集,因此padding与原网络略有差异
net = nn.Sequential(
nn.Conv2d(1, 96, kernel_size=11, stride=4, padding = 1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(96, 256, kernel_size=5, padding=2),
nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(256, 384, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Flatten(),
nn.Linear(6400,4096),
nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096,4096),
nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096,10))
完整代码:AlexNet-github
参考:机器之心