之前阅读论文《ImageNet Classification with Deep Convolutional Neural Networks》的时候,文中有提到模型的总参数数量为60millions
,即6000万。为了加深理解网络结构,给自己提了一个小问题:这个参数总量是怎么算出来的呢?
在动手之前,先google了一下,想看看之前有没有类似的工作,只在stackoverflow上找到了这个帖子:《How to calculate the number of parameters of AlexNet?》,题主给了自己的思路但不确定,回答中也没有靠谱的。所以决定,自己动手看看。
首先贴一下AlexNet的网络结构图:
总的来说,AlexNet由输入层,5个卷积层,3个全连接层组成(其中最后一个全连接层也是softmax输出层)。图中详细标出了输入大小以及各层的结构参数。特别需要注意的是:网络是分布在2个GPU上的,部分层只跟同一个GPU中的上一层连接(看起来,stackoverflow那个帖子中题主没有考虑这个问题)。
接下来梳理一下各层的参数情况:
- 输入层:图片大小:宽高通道(RGB)依次为W * H * C = 224 x 224 x 3, 即150528像素。
- 第1个隐层, 卷积层,使用96个11 x 11 x 3的卷积核,如图所示节点数量为:55(W) x 55(H) x 48(C) x 2 = 290400(注:这个地方的节点数与论文中提到的要高,有点奇怪。因为这层跟其他层计算方法一样,其他层的节点数跟论文中完全一致)。根据卷积层的参数 = 卷积核大小 x 卷积核的数量
+ 偏置数量(即卷积的核数量),本层参数数量为:
(11 * 11 * 3 * 96) + 96 = 34848, 注:参数分为2部分w和b,“+”前面一部分是w的数量, “+”后面那部分是b的数量,后面的层也按这个思路来计算。 - 第2个隐层,卷积层, 使用256个5x5x48卷积核,只跟同一个GPU的上一层连接,节点数量:27*27*128*2 = 186624,参数数量:(5*5*48*128+128)*2 = 307456,最后”*2″是因为网络层均匀分布在两个GPU上,先计算单个GPU上的参数,再乘以GPU数量2。
- 第3个隐层,卷积层,使用384个3x3x256卷积核,节点数量:13*13*192*2 = 64896,参数数量:3*3*256*384+384 = 885120。
- 第4个隐层,卷积层,使用384个3x3x192卷积核,只跟同一个GPU的上一层连接,节点数量:13*13*192*2 = 64896,参数数量:(3*3*192*192+192)*2 = 663936。
- 第5个隐层,卷积层,使用256个3x3x192卷积核,只跟同一个GPU的上一层连接,节点数量:13*13*128*2 = 43264,参数数量:(3*3*192*128+128)*2 = 442624。
- 第6个隐层,全连接层,节点数为4096。根据全连接层的参数数量 = 上一层节点数量(pooling之后的) x 下一层节点数量 + 偏置数量(即下一层的节点数量),参数数量为:(6*6*128*2)*4096+4096 = 37752832,可以看到这个参数数量远远大于之前所有卷积层的参数数量之和。也就是说AlexNet的参数大部分位于后面的全连接层。
- 第7个隐层,全连接层,节点数量为4096。参数数量为:4096*4096 + 4096= 16781312。
- 第8个隐层,全连接层,也是1000-way的softmax输出层,节点数量为1000。参数数量为: 4096*1000 + 1000 = 4097000。
最后,为了方便查看,汇总为表格如下,其中最后一行给出了Alex的参数总量。