43

我无法给出AlexNetVGG Net的正确参数数量。

比如要计算conv3-256VGG Net的一层参数个数,答案是0.59M = (3*3)*(256*256),即(kernel size) * (两层通道数的乘积联合层),但是这样,我无法获得138M参数。

那么你能告诉我我的计算哪里出了问题,或者告诉我正确的计算程序吗?

4

5 回答 5

65

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

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

  • 第一个有 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 网络在卷积之前使用了空间填充,如本文第 2.1 节所述:

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

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

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

于 2015-01-30T19:02:08.157 回答
47

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
于 2016-05-02T07:17:16.143 回答
5

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

2.1 架构

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

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

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

最后一层是soft-max层。

使用上述,和

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

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

笔记:

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

  • CONV3:表示将在输入上卷积一个 3*3 的滤波器!

  • MAXPOOL3-2:意思是,第 3 个池化层,带有 2*2 过滤器,stride=2,padding=0(池化层非常标准)

  • Stage-3 :意味着它有多个 CONV 层堆叠!具有相同的 padding=1, , stride=1, 和 filter 3*3

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

  • Cout:意味着深度又名通道传出(您可以以不同的方式配置它 - 以学习更复杂的功能!),

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

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

  • p:每一层的填充

  • s:每层使用的步幅

  • f:过滤器大小,即 3*3 用于 CONV,2*2 用于 MAXPOOL 层!

  • 在 MAXPOOL5-2 之后,您只需将音量变平并将其与第一个 FC 层接口。!

我们得到表格: 在此处输入图像描述

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

于 2019-01-21T18:27:33.553 回答
2

下面是如何计算每个 cnn 层中的参数数量:
一些定义
n--过滤器的宽度
m--过滤器的高度
k-输入特征图
的数量 L-输出特征图
的数量 然后参数数量 #= (n*m *k+1)*L,其中第一个贡献来自权重,第二个贡献来自偏差。

于 2018-11-09T02:57:59.280 回答
1

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

谢谢

于 2017-07-05T11:26:35.400 回答