如何计算卷积神经网络的参数个数?

时间:2015-01-30 08:51:15

标签: machine-learning neural-network computer-vision vgg-net

我无法提供AlexNetVGG Net的正确参数数量。

例如,要计算VGG Net的conv3-256层的参数数量,答案是0.59M =(3 * 3)*(256 * 256),即(内核大小)*(关节层中两个通道数的乘积),但是这样,我无法获得138M个参数。

那么请你告诉我计算的错误,或者告诉我正确的计算程序?

5 个答案:

答案 0 :(得分:55)

如果您使用16层(表1,D列)引用VGG Net,则138M指的是此网络的参数总数,即包括所有卷积层,但也是完全连接的。

查看由3 x conv3-256层组成的第3个卷积阶段:

  • 第一个有N = 128个输入平面,F = 256个输出平面,
  • 另外两个有N = 256个输入平面,F = 256个输出平面。

每个层的卷积内核为3x3。在参数方面,这给出了:

  • 128x3x3x256(权重)+ 256(偏见)=第一个参数295,168,
  • 256x3x3x256(权重)+ 256(偏见)=另外两个参数的590,080个参数。

如上所述,您必须对所有图层执行此操作,但也必须对完全连接的图层执行此操作,并将这些值相加以获得最终的138M编号。

-

更新:图层之间的细分给出:

conv3-64  x 2       : 38,720
conv3-128 x 2       : 221,440
conv3-256 x 3       : 1,475,328
conv3-512 x 3       : 5,899,776
conv3-512 x 3       : 7,079,424
fc1                 : 102,764,544
fc2                 : 16,781,312
fc3                 : 4,097,000
TOTAL               : 138,357,544

特别是对于完全连接的层(fc):

 fc1 (x): (512x7x7)x4,096 (weights) + 4,096 (biases)
 fc2    : 4,096x4,096     (weights) + 4,096 (biases)
 fc3    : 4,096x1,000     (weights) + 1,000 (biases)

(x)参见本文第3.2节:首先将完全连接的层转换为卷积层(第一个FC层转换为7×7转换层,最后两个FC层转换为1×1转换图层。

有关fc1

的详细信息

如果在馈送完全连接的层之前的空间分辨率之上精确到7x7像素。这是因为此VGG Net在卷积之前使用空间填充,详见本文第2.1节:

[...] conv的空间填充。层输入使得在卷积之后保留空间分辨率,即,对于3×3转换,填充是1个像素。层。

使用这样的填充,并使用224x224像素的输入图像,分辨率会随着以下层逐渐减小:112x112,56x56,28x28,14x14和7x7在最后一个具有512个特征映射的卷积/池化阶段之后。

这给出了一个传递给fc1的特征向量,其维度为:512x7x7。

答案 1 :(得分:42)

CS231n讲义中也给出了VGG-16网络计算的重大细分。

INPUT:     [224x224x3]    memory:  224*224*3=150K   weights: 0
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*3)*64 = 1,728
CONV3-64:  [224x224x64]   memory:  224*224*64=3.2M  weights: (3*3*64)*64 = 36,864
POOL2:     [112x112x64]   memory:  112*112*64=800K  weights: 0
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*64)*128 = 73,728
CONV3-128: [112x112x128]  memory:  112*112*128=1.6M weights: (3*3*128)*128 = 147,456
POOL2:     [56x56x128]    memory:  56*56*128=400K   weights: 0
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
CONV3-256: [56x56x256]    memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
POOL2:     [28x28x256]    memory:  28*28*256=200K   weights: 0
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [28x28x512]    memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [14x14x512]    memory:  14*14*512=100K   weights: 0
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
CONV3-512: [14x14x512]    memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
POOL2:     [7x7x512]      memory:  7*7*512=25K      weights: 0
FC:        [1x1x4096]     memory:  4096             weights: 7*7*512*4096 = 102,760,448
FC:        [1x1x4096]     memory:  4096             weights: 4096*4096 = 16,777,216
FC:        [1x1x1000]     memory:  1000             weights: 4096*1000 = 4,096,000

TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
TOTAL params: 138M parameters

答案 2 :(得分:1)

我知道这是一个老帖子,我认为@deltheil接受的答案包含一个错误。如果没有,我很乐意纠正。卷积层不应该有偏差。 即     128x3x3x256(权重)+ 256(偏差)= 295,168 应该     128x3x3x256(权重)= 294,9112

由于

答案 3 :(得分:1)

以下是计算每个cnn层中参数数量的方法:
  一些定义
  n--过滤器宽度
  m--过滤器的高度
  k-输入要素图的数量
  L--输出要素图的数量
  然后参数数量==(n * m * k + 1)* L,其中第一个贡献来自   权重,其次是偏见。

答案 4 :(得分:1)

下面的VGG-16建筑位于original paper as highlighted by @deltheil in (table 1, column D) 中,我从那里引用

  

2.1体系结构

     

在培训期间,对我们的ConvNets的输入是固定大小的224×224   RGB图像。我们唯一要做的预处理是减去平均RGB   在每个像素上根据训练集计算得出的值。

     

图像经过一叠卷积(转换)层,   我们使用接收场很小的滤镜:3×3(其中   是捕获左/右,上/下概念的最小尺寸,   中央)。卷积步幅固定为1个像素;空间   转换的填充图层输入使得空间分辨率为   卷积后保留,即3×3的填充为1像素   转换层。空间池由五个最大池进行   图层,其中包含一些转化图层(并非所有转化)   层之后是最大池)。最大池化执行2   ×2像素的窗口,步幅为2。

     

一叠卷积层(在   不同的架构),然后是三个全连接(FC)   层:前两个各有4096个通道,第三个执行   1000路ILSVRC分类,因此包含1000个通道(一个   每个课程)。

     

最后一层是soft-max层。

使用以上内容和

  • 找到层激活形状的公式!

  • 用于计算与每一层相对应的权重的公式:

注意:

  • 您可以简单地将各个激活形状列相乘以获得激活大小

  • CONV3:意味着3 * 3的过滤器将在输入上进行卷积!

  • MAXPOOL3-2:平均值,第3个池化层,带有2 * 2过滤器,步幅= 2,填充= 0(池化层中相当标准)

  • 第3阶段:表示它具有多个CONV层堆叠!具有相同的padding = 1,,stride = 1和过滤器3 * 3

  • Cin:表示来自输入层的深度(也就是通道)!

  • Cout:表示通道的深度,也称为通道(您可以对其进行其他配置-以了解更多复杂功能!)

Cin和Cout是您堆叠在一起以了解不同比例的多个特征的过滤器的数量,例如在第一层中,您可能想要学习垂直边缘,水平边缘和水平边缘,例如45度,等等!,64每种不同类型的边缘可能都有不同的滤镜!

  • n:没有尺寸的输入尺寸,在输入图像时为n = 224!

  • p:每层填充

  • s:用于每个图层的步幅

  • f:过滤器尺寸,即CONV为3 * 3,MAXPOOL层为2 * 2!

  • 在MAXPOOL5-2之后,您只需将卷展平并将其与第一个FC层连接。!

我们得到了表格: enter image description here

最后,如果将最后一列中计算的所有权重相加,最终将得到138,357,544(1.38亿)个参数来训练VGG-15!