AlexNet网络结构参数计算

文章目录

  • 前言
  • 一、CNN网络性能参数计算方法
  • 二、简化AlexNet网络参数计算
  • 二、真实的AlexNet网络参数计算
  • 总结


前言

CS231n中详细介绍了AlexNet网络结构,又参考了EECS 498-007 / 598-005,有两个问题不解:

  • CS231n和EECS 498-007 / 598-005介绍的AlexNet网络结构为何不同?
  • 按照EECS 498-007 / 598-005介绍的网络参数计算方法,为何算出的参数量和网上的博客不同?

到现在第一个问题还未解决。第二个有了我自己的理解。


一、CNN网络性能参数计算方法

CNN中有关性能重要的三个参数

  • memory,内存使用量,主要是保存feature map
  • params,参数量,包括w和b
  • Flop,浮点数计算次数,这里有两个注意点,一是乘法次数和加法次数相同(算上偏置项),二是有些设备加法和乘法可以同时完成,所以我们只计算乘法数量就可以了。

对CONV层
以batch_size=1为例(即送进去一张图片),如果前一层feature map的维度是Ct-1 * Ht-1 * Wt-1 , 当前层输出feature map维度为Ct * Ht * Wt,那么有:
当前层的memory = Ct * Ht * Wt(这是参数个数,转化为字节乘4,乘4是假设使用32位float存储)
当前层的params = Ct * (filter_size * filter_size * Ht-1 +1)
当前层的Flop = Ct * Ht * Wt * filter_size * filter_size * Ht-1

对Maxpool层
以batch_size=1为例(即送进去一张图片),如果前一层feature map的维度是C* H * W , 当前层输出feature map维度也为C * H * W:
当前层的memory = C * H * W
当前层的params = 0
当前层的Flop = C * H * W * filter_size * filter_size

二、简化AlexNet网络参数计算

参考CS231n的简化AlexNet网络结构,接下来的计算就按照这个逻辑去计算。
AlexNet网络结构参数计算_第1张图片计算出来的网络参数如下图所示,这是我在Excel里面敲的并计算的:
请注意,CONV层的偏置都算上了,FC层的偏置我都没算,对于FC层,与W相比,b少的可怜。
AlexNet网络结构参数计算_第2张图片下面问题来了,参考知乎,AlexNet网络的性能参数:
AlexNet网络结构参数计算_第3张图片
可以看到,只有第一层网络的params和FLOPS是和他一致的,其他不一致的层基本上都差个2倍。
下面就来解释原因。

二、真实的AlexNet网络参数计算

AlexNet的网络结构如下:
AlexNet网络结构参数计算_第4张图片CS231n上提出:

Historical note: Trained on GTX 580 GPU with only 3 GB of memory.Network spread across 2 GPUs, half the neurons (feature maps) on each GPU.

Alex被分到两个GPU上训练,部分层只跟同一个GPU中的上一层连接,如CONV2,CONV4,CONV5,所以参数在计算的时候要分两个去算,然后乘2.
CONV1
不变,跟excel里面计算一样。
CONV2
每个GPU:
params = 128 * (5 * 5 * 48+1) /1000= 153.728K ——>153.728K * 2 = 307K
FLOPS = 128 * 27 * 27 * 5 * 5 * 48 /1e6 = 111.9744M ——>111.9744M * 2 = 223M
CONV3
每个GPU:
params = 192 * (3 * 3 * 256 +1)/1000 = 442.56K——>442.56K * 2 = 884K
FLOPS = 192 * 13 *13 * 3 * 3 * 256/1e6 = 74.760192M ——>74.760192M * 2 = 149M
CONV4
每个GPU:
params = 192 * (3 * 3 * 192 + 1)/1000 = 331.968K 两个就是663K
FLOPS = 192 * 13 * 13 * 3 * 3 * 192 / 1e6 = 56M 两个就是112M
CONV5
每个GPU:
params = 128 * (3 * 3 * 192 +1)/1000 = 221K 两个就是442K
FLOPS = 128 * 13 * 13 * 3 * 3 * 192 /1e6 = 37.38M 两个就是74M
通过计算,发现除了CONV4的params和知乎那个图片不同之外,其他都一样,参考博客对于CONV4的params计算,我和他一致,应该是知乎错了
其他层的计算和之前的Excel计算一样。

总结

前面的计算不需要纠结于具体的数值,有一些数值只是估算,在其对应单位下与真实值差个1不影响对计算过程和对CNN参数量分布的理解,实际上现在实现AlexNet不需要分多个GPU去训练了。

你可能感兴趣的:(CV,深度学习,cnn,网络)