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

Eri*_*ric 40 machine-learning computer-vision neural-network vgg-net

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

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

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

del*_*eil 59

如果您参考具有16层的VGG Net(表1,列D),则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
Run Code Online (Sandbox Code Playgroud)

特别是对于完全连接的层(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)
Run Code Online (Sandbox Code Playgroud)

(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.


Ray*_*Ray 43

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
Run Code Online (Sandbox Code Playgroud)

  • 嗨,@雷。你能告诉我如何获得`TOTAL memory: 24M`吗? (2认同)

anu*_*anu 5

下面的 VGG-16 架构位于原始论文中,由 @deltheil 在(表 1,D 列)中突出显示 ,我从那里引用

\n\n
\n

2.1 架构

\n\n

在训练期间,ConvNet 的输入是固定大小的 224 \xc3\x97 224\n RGB 图像。我们所做的唯一预处理是从每个像素中减去在训练集上计算的平均 RGB\n 值。

\n\n

图像通过一堆卷积层,\n 其中我们使用具有非常小的感受野的滤波器: 3 \xc3\x97 3 (这是捕获左/右概念的最小尺寸) ,上/下,\n 中心)。卷积步幅固定为1像素;转换的空间\n 填充。层输入使得空间分辨率在卷积后保留,即对于 3 \xc3\x97 3\n 卷积,填充为 1 像素。层。空间池化由五个最大池化层执行,这些层位于一些卷积之后。层(并非所有的 conv.\n 层后面都有最大池化)。最大池化在 2\n \xc3\x97 2 像素窗口上执行,步幅为 2。

\n\n

一堆卷积层(在不同的架构中具有不同的深度)后面是三个全连接 (FC) 层:前两个层各有 4096 个通道,第三个执行 1000 路 ILSVRC 分类,因此包含 1000 个通道(每个类别一个\n)。

\n\n

最后一层是 soft-max 层。

\n
\n\n

使用上述内容,并且

\n\n
    \n
  • 寻找层激活形状的公式!
  • \n
\n\n

\n\n
    \n
  • 计算每层对应权重的公式:
  • \n
\n\n

\n\n

笔记:

\n\n
    \n
  • 您可以简单地将相应的激活形状列相乘即可获得激活大小

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

  • \n
  • MAXPOOL3-2:表示第三个池化层,具有 2*2 过滤器,stride=2,padding=0(池化层中相当标准的)

  • \n
  • Stage-3:意味着它有多个 CONV 层堆叠!具有相同的 padding=1、stride=1 和过滤器 3*3

  • \n
  • Cin :表示来自输入层的深度,又称通道!

  • \n
  • Cout:表示深度,又称通道传出(您可以以不同的方式配置它 - 以学习更复杂的功能!),

  • \n
\n\n

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

\n\n
    \n
  • n:没有深度的输入维度,例如在输入图像的情况下 n=224!

  • \n
  • p:每层的填充

  • \n
  • s:每层使用的步幅

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

  • \n
  • 在 MAXPOOL5-2 之后,您只需将体积展平并将其与第一个 FC 层连接即可!

  • \n
\n\n

我们得到表: \n在此输入图像描述

\n\n

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

\n