# 网络架构(图截原文
- 在两个GPU上跑
- 卷积层 C2、C4、C5中的卷积核只和位于同一GPU的上一层的FeatureMap相连,C3的卷积核与两个GPU的上一层的FeautureMap都连接
网络架构讲解的很清楚:卷积神经网络经典回顾之AlexNet - 知乎 (zhihu.com)
手撕 CNN 经典网络之 AlexNet(理论篇) - 知乎 (zhihu.com) 这篇讲的更好,以下所有📒都是摘自这个🔗
第一层讲解 C1
这一层要做:
conv→ReLU→LRN→Pooling
输入 : 227*227*3
操作:
(卷积)96@11*11*3 padding=0 stride=4
计算输出:(227-11+2*0+4)/4 = 55
输出:55*55*96
**(ReLu)**卷积层输出的特征图输入到ReLu函数
(LRN)
- 对局部神经元创建竞争机制,s.t.响应比较大的值变得相对更大,并抑制其他反馈比较小的神经元,增强模型的泛化能力
- LRN的输出:55*55*96(输出不变)
- 输出分为2组,每组大小:55*55*48,分别位于单个GPU上
(池化)
- 输入:55*55*96(分为两组: 55*55*48**)**
- 使用3*3,stride=2的池化单元
- (重叠池化)stride<pooling_size
- ++根据公式计算输出++:
(55-3+2*0+2)/2=27
27*27*96(输出两组:27*27*48)
++小结论吧:pool_size=3 stride=2 的池化层,池化以后输出尺寸的长宽各减少一半++
第二层讲解 C2
该层的处理流程是:卷积-->ReLU-->局部响应归一化(LRN)-->池化。
我的理解是,图中只画出了一次卷积之后的输出结果。
卷积 :两组输入均是27x27x48,各组分别使用128个5x5x48的卷积核进行卷积,padding=2,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(27+2*2-5)/1+1=27,得到每组输出是27x27x128。
ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。
局部响应归一化:使用参数k=2,n=5,α=0.0001,β=0.75进行归一化。每组输出仍然是27x27x128。
池化 :使用3x3,stride=2的池化单元进行最大池化操作(max pooling)。注意这里使用的是重叠池化,即stride小于池化单元的边长。根据公式:(27+2*0-3)/2+1=13,每组得到的输出为13x13x128。
它这边的池化也好理解,pool_size=3,stride=2,padding=0,输出的图像,高宽各减少一半,通道数不变。所以只画出了卷积的结果,也算情有可原。
第三层 C3
该层的处理流程是: 卷积-->ReLU
卷积 :输入是13x13x256,使用384个3x3x256的卷积核进行卷积,padding=1,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到输出是13x13x384。
ReLU :将卷积层输出的FeatureMap输入到ReLU函数中。将输出其分成两组,每组FeatureMap大小是13x13x192,分别位于单个GPU上。
(我脑子累了,只能粘贴粘贴📒了,没办法画了)
第四层 C4
该层的处理流程是:卷积-->ReLU
卷积 :两组输入均是13x13x192,各组分别使用192个3x3x192的卷积核进行卷积,padding=1,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到每组FeatureMap输出是13x13x192。(分析的是一个组的情况)
ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。
第五层 C5
该层的处理流程是:卷积-->ReLU-->池化
卷积 :两组输入均是13x13x192,各组分别使用128个3x3x192的卷积核进行卷积,padding=1,stride=1,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(13+2*1-3)/1+1=13,得到每组FeatureMap输出是13x13x128。(用单个组的说)
ReLU:将卷积层输出的FeatureMap输入到ReLU函数中。
池化 :使用3x3,stride=2的池化单元进行最大池化操作(max pooling)。注意这里使用的是重叠池化,即stride小于池化单元的边长。根据公式:(13+2*0-3)/2+1=6,每组得到的输出为6x6x128。
(都在描述单个组,蒽,清清楚楚了)
(然后这边,pool_size=3,stride=2 池化之后的窗口 减半)
第六层 FC6
该层的流程为:(卷积)全连接 -->ReLU -->Dropout (卷积)
全连接 :输入为6×6×256(这里的输入是因为C5→FC6 两个GPU交互了 所以把第三维合并作为输入),使用4096个6×6×256的卷积核(注意这里的卷积核大小与输入图像完全相同 所以1个卷积核输出1个值)进行卷积,由于卷积核尺寸与输入的尺寸完全相同,即卷积核中的每个系数只与输入尺寸的一个像素值相乘一一对应,根据公式:(input_size + 2 * padding - kernel_size) / stride + 1=(6+2*0-6)/1+1=1,得到输出是1x1x4096 。++既有4096个神经元,该层被称为全连接层(6!)++。
ReLU:这4096个神经元的运算结果通过ReLU激活函数中。
Dropout :随机的断开全连接层某些神经元的连接,通过不激活某些神经元的方式防止过拟合。4096个神经元也被均分到两块GPU上进行运算。
第七层 FC7
该层的流程为:(卷积)全连接 -->ReLU -->Dropout
全连接:输入为4096个神经元,输出也是4096个神经元(作者设定的)。
ReLU:这4096个神经元的运算结果通过ReLU激活函数中。
Dropout:随机的断开全连接层某些神经元的连接,通过不激活某些神经元的方式防止过拟合。
4096个神经元也被均分到两块GPU上进行运算。
(这些层的流程设计 还真是需要扒论文 谢谢这个博主)
第八层 输出层
该层的流程为:(卷积)全连接 -->Softmax
全连接:输入为4096个神经元,输出是1000个神经元。这1000个神经元即对应1000个检测类别。
Softmax:这1000个神经元的运算结果通过Softmax函数中,输出1000个类别对应的预测概率值。
FLOPS 不看 (看不懂
是谁、在哪儿、啥时候
AlexNet是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。
AlexNet的作者是多伦多大学的Alex Krizhevsky等人。Alex Krizhevsky是Hinton的学生。网上流行说 Hinton、LeCun和Bengio是神经网络领域三巨头,LeCun就是LeNet5的作者(Yann LeCun)。
鉴于当时的硬件资源限制,由于AlexNet结构复杂、参数很庞大,难以在单个GPU上进行训练。因此AlexNet采用两路GTX 580 3GB GPU并行训练。也就是说把原先的卷积层平分成两部分FeatureMap分别在两块GPU上进行训练(例如卷积层55x55x96分成两个FeatureMap:55x55x48)
创新点:
- 激活函数ReLU
- 局部响应归一化
- Dropout
- 重叠池化
- 双GPU
- 端到端的训练
©手撕 CNN 经典网络之 AlexNet(理论篇) - 知乎 (zhihu.com)
原文:
ImageNet Classification with Deep Convolutional Neural Networks (neurips.cc)