您的位置:首页 > 理论基础 > 计算机网络

卷积神经网络的参数计算

2018-01-08 22:39 996 查看

前言

这篇文章会简单写一下卷积神经网络上参数的计算方法,然后计算各个常见神经网络的参数。一个是加强对网络结构的了解,另一方面对网络参数的量级有一个大概的认识,也可以当作备忘录,免得想知道的时候还要再算。

参数计算方法

全连接的参数计算就不说了,比较简单。

首先,简单说一下卷积网络的参数计算。下图中是一个32x32x3的输入,然后用一个5x5x3的卷积对其中某个位置的计算,这里算的是一个点积,所以输出是一个单独的标量的值。



因为卷积的操作是通过一个滑动窗口实现的,那么通过卷积操作,我们就得到了一个28x28x1的输出。



如果我有6个上面说的filter,那么,我就会得到一个28x28x6的输出。



这就是一个最基础的卷积操作,那么这里用到的参数是多少呢?我们只需要把每个filter的参数累加起来,当然,不要忘了加上bias:5x5x3x6 + 6 = 456

另外一个需要计算的就是进行卷积以后的输出的大小,从下面的图上看就很好理解了,用公式直接算就好了。其中N是输入图像的size,F是filter的size,stride是滑动的步长。



然后从上图中最后一个例子可以看到,stride大于1的时候不一定能整除,这个时候,就需要在原图像上加上一层padding层,这样图像的大小就变化了,然后再用前面的公式算就行了。



然后还有一个maxpooling操作,这个会改变输入输出,但是不会有参数。所以使用和计算卷积一样的公式算就行了。



LeNet

首先计算一下最简单的LeNet。网络结构如下:

网络层(操作)输入filterstridepadding输出计算公式参数量
Input32x32x132x32x10
Conv132x32x15x5x61028x28x65x5x1x6+6156
MaxPool128x28x62x22014x14x60
Conv214x14x65x5x161010x10x165x5x6x16+162416
MaxPool210x10x162x2205x5x160
FC15x5x161205x5x16x120+12048120
FC212084120x84+8410164
FC3848484x10+10850
参数总量: 61706

参数内存消耗: 241.039KB

AlexNet

Alexnet的结构图有些奇怪。但其实是因为要把网络拆分到两个GPU上,才画成了两层,两层的结构是一样的,下面计算的时候的结构相当于合并以后的网络。



网络层(操作)输入filterstridepadding输出计算公式参数量
Input227x227x3227x227x30
Conv1227x227x311x11x964055x55x9611x11x3x96+9634944
MaxPool155x55x963x32027x27x960
Norm127x27x9627x27x960
Conv227x27x965x5x2561227x27x2565x5x96x256+256614656
MaxPool227x27x2563x32013x13x2560
Norml213x13x25613x13x2560
Conv313x13x2563x3x3841113x13x3843x3x256x384+384885120
Conv413x13x3843x3x3841113x13x3843x3x384x384+3841327488
Conv513x13x3843x3x2561113x13x2563x3x384x256+256884992
MaxPool313x13x2563x3206x6x2560
FC66x6x25640966x6x256x4096+409637752832
FC7409640964096x4096+409616781312
FC8409610004096x1000+10004097000
参数总量: 62378344

参数内存消耗: 237.9545MB

VGG

VGG常见有16层和19层的,这里以16层为例,下面是模型结构图。



网络层(操作)输入filterstridepadding输出计算公式参数量
Input224x224x3224x224x30
Conv3-64224x224x33x3x6411224x224x643x3x3x64 + 641792
Conv3-64224x224x643x3x6411224x224x643x3x64x64 + 6436928
MaxPool2224x224x642x220112x112x640
Conv3-128112x112x643x3x12811112x112x1283x3x64x128 + 12873856
Conv3-128112x112x1283x3x12811112x112x1283x3x128x128 + 128147584
MaxPool2112x112x1282x22056x56x1280
Conv3-25656x56x1283x3x2561156x56x2563x3x128x256 + 256295168
Conv3-25656x56x2563x3x2561156x56x2563x3x256x256 + 256590080
Conv3-25656x56x2563x3x2561156x56x2563x3x256x256 + 256590080
MaxPool256x56x2562x22028x28x2560
Conv3-51228x28x2563x3x5121128x28x5123x3x256x512 + 5121180160
Conv3-51228x28x5123x3x5121128x28x5123x3x512x512 + 5122359808
Conv3-51228x28x5123x3x5121128x28x5123x3x512x512 + 5122359808
MaxPool228x28x5122x22014x14x5120
Conv3-51214x14x5123x3x5121114x14x5123x3x512x512 + 5122359808
Conv3-51214x14x5123x3x5121114x14x5123x3x512x512 + 5122359808
Conv3-51214x14x5123x3x5121114x14x5123x3x512x512 + 5122359808
MaxPool214x14x5122x2207x7x5120
FC17x7x51240967x7x512x4096 + 4096102764544
FC2409640964096*4096 + 409616781312
FC3409610004096*1000 + 10004097000
参数总量: 138357544

参数内存消耗: 527.7921MB

GoogleNet

googlenet 提出了inception的概念,用于增加网络深度和宽度,提高深度神经网络性能。下面是googlenet的网络结构:



inception的结构如下:



可以看出,inception的结构是多个卷积堆叠,组合而成的。

还有,从上面的网络结构中,可以看到一共有三个输出的分类层:



这个是为了解决深层网络训练的时候梯度消失的问题,所以在中间加入了几个全连接层辅助训练。

最后,贴一个论文上给出的模型的结构图:



在这个图上,已经给出了参数的数量和使用的内存,不过我还是说一下inception模块的计算方法和一些注意事项。

首先是输入,输入的size应该为224x224x3

注意第一层的卷积,没有注明padding,直接算的话,结果是不对的,这里的padding计算方法和tensorflow中卷积方法padding参数设置为’SAME’是一样的。简单来说,就是ceil(size/kernel_size),这个对于下面的计算也是一样的,总之,就是要填适当的0,使得输出结果和上图相对应就是了。

3.在上图中5~10列对应inception module中的各个卷积操作,对应的值是输出的feature的数量,对于maxpool操作,他的padding为2,stride为1。

4.当一个inception模块计算完后,它的输出为各个卷积操作输出的结果连接起来,也就是如果输出分别为28x28x64、28x28x128、28x28x32、28x28x32,那么最终输出就是28x28x(63+128+32+32)。

下面的图给出了inception module内部计算的输出结果。



可以看出googlenet的参数量要比vgg少很多,但是效果确更优秀。

Resnet

关于resnet,我就不打算计算参数了,因为实在量很大,而且实际上,resnet的基本结构也比较简单,计算方法和前面的没什么差别。这里就简单贴一下结构图好了。



可以看出来,如果没有中间一条条连线,其实就是一个很深的普通的卷积网络,中间的连线可以保证梯度可以传递到低层,防止梯度消失的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: