我无法给出AlexNet或VGG Net的正确参数数量 .
例如,要计算VGG Net的 conv3-256 层参数的数量,答案是0.59M =(3 * 3)(256 * 256),即(内核大小)(两个通道数的乘积)关节层),但是这样,我无法获得 138M 参数 .
conv3-256
138M
那么请你告诉我计算的错误,或者告诉我正确的计算程序?
如果您参考具有16层的VGG网络(表1,列D),则 138M 指的是该网络的 total number of parameters ,即包括所有卷积层,但也包括完全连接的层 .
观察由3 x conv3-256 层组成的第3个卷积阶段:
第一个有N = 128个输入平面,F = 256个输出平面,
另外两个有N = 256个输入平面和F = 256个输出平面 .
对于这些层中的每一层,卷积核为3x3 . 在参数方面,这给出了:
128x3x3x256(权重)256(偏差)=第一个参数295,168,
256x3x3x256(权重)256(偏差)=另外两个参数的590,080个参数 .
如上所述,您必须对所有层执行此操作,但也必须对完全连接的层执行此操作,并将这些值相加以获得最终的138M数 .
UPDATE :各层之间的细分给出:
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转换层) .
Details about fc1
如上所述,在馈送完全连接的层之前的空间分辨率是7x7像素 . 这是因为这个VGG Net在卷积之前使用了空间填充,详见本文第2.1节:
[...] conv的空间填充 . 层输入使得在卷积之后保留空间分辨率,即,对于3×3转换,填充是1个像素 . 层 .
使用这样的填充,并使用224x224像素输入图像,分辨率随着以下层逐渐减少:112x112,56x56,28x28,14x14和7x7在具有512个特征映射的最后卷积/池化阶段之后 .
这给出了一个传递给 fc1 的特征向量,其维数为:512x7x7 .
fc1
在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
我知道这是一个旧帖子,我认为@deltheil接受的答案包含一个错误 . 如果没有,我很乐意纠正 . 卷积层不应该有偏差 . 即128x3x3x256(权重)256(偏差)= 295,168应为128x3x3x256(权重)= 294,9112
谢谢
以下是如何计算每个cnn层中的参数数量:一些定义n - 过滤器的宽度m - 过滤器的高度k - 输入要素图的数量L - 输出要素图的数量然后是参数数量#=(n * m * k 1)* L,其中第一个贡献来自权重,第二个贡献来自偏差 .
下面的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层 .
使用上面的,和
Note:
您可以简单地将相应的激活形状列相乘以获得激活大小
CONV3:表示3 * 3的滤波器将在输入上进行卷积!
MAXPOOL3-2:表示第3个汇聚层,2 * 2过滤器,stride = 2,padding = 0(在汇集层中非常标准)
Stage-3:表示它堆叠了多个CONV层!相同的填充= 1,stride = 1,滤波器3 * 3
Cin:表示来自输入层的a.k.a通道的深度!
Cout:表示a.k.a Channels 传出的深度(您可以不同地配置它 - 以了解更复杂的功能!),
Cin和Cout是您堆叠在一起以了解不同比例的多个要素的过滤器数量,例如您可能想要学习垂直边缘的第一层,以及45度的水平边缘和边缘,blah blah!,64种可能的不同过滤器每种不同的边缘!!
n:没有深度的输入尺寸,在INPUT图像的情况下n = 224!
p:每层的填充
s:用于每一层的步幅
f:过滤器尺寸,即CONV为3 * 3,MAXPOOL层为2 * 2!
在MAXPOOL5-2之后,您只需压缩音量并将其与第一个FC层连接 .
We get the table:
Finally, if you add all the weights calculated in the last column, you end up with 138,357,544(138 million) parameters to train for VGG-15!
5 回答
如果您参考具有16层的VGG网络(表1,列D),则
138M
指的是该网络的 total number of parameters ,即包括所有卷积层,但也包括完全连接的层 .观察由3 x
conv3-256
层组成的第3个卷积阶段:第一个有N = 128个输入平面,F = 256个输出平面,
另外两个有N = 256个输入平面和F = 256个输出平面 .
对于这些层中的每一层,卷积核为3x3 . 在参数方面,这给出了:
128x3x3x256(权重)256(偏差)=第一个参数295,168,
256x3x3x256(权重)256(偏差)=另外两个参数的590,080个参数 .
如上所述,您必须对所有层执行此操作,但也必须对完全连接的层执行此操作,并将这些值相加以获得最终的138M数 .
UPDATE :各层之间的细分给出:
特别是对于完全连接的层(fc):
(x)参见本文第3.2节:首先将完全连接的层转换为卷积层(第一个FC层转换为7×7转换层,最后两个FC层转换为1×1转换层) .
Details about fc1
如上所述,在馈送完全连接的层之前的空间分辨率是7x7像素 . 这是因为这个VGG Net在卷积之前使用了空间填充,详见本文第2.1节:
[...] conv的空间填充 . 层输入使得在卷积之后保留空间分辨率,即,对于3×3转换,填充是1个像素 . 层 .
使用这样的填充,并使用224x224像素输入图像,分辨率随着以下层逐渐减少:112x112,56x56,28x28,14x14和7x7在具有512个特征映射的最后卷积/池化阶段之后 .
这给出了一个传递给
fc1
的特征向量,其维数为:512x7x7 .在CS231n讲义中也给出了VGG-16网络计算的重大细分 .
我知道这是一个旧帖子,我认为@deltheil接受的答案包含一个错误 . 如果没有,我很乐意纠正 . 卷积层不应该有偏差 . 即128x3x3x256(权重)256(偏差)= 295,168应为128x3x3x256(权重)= 294,9112
谢谢
以下是如何计算每个cnn层中的参数数量:
一些定义
n - 过滤器的宽度
m - 过滤器的高度
k - 输入要素图的数量
L - 输出要素图的数量
然后是参数数量#=(n * m * k 1)* L,其中第一个贡献来自权重,第二个贡献来自偏差 .
下面的VGG-16架构位于original paper as highlighted by @deltheil in (table 1, column D),我从那里引用
使用上面的,和
Note:
您可以简单地将相应的激活形状列相乘以获得激活大小
CONV3:表示3 * 3的滤波器将在输入上进行卷积!
MAXPOOL3-2:表示第3个汇聚层,2 * 2过滤器,stride = 2,padding = 0(在汇集层中非常标准)
Stage-3:表示它堆叠了多个CONV层!相同的填充= 1,stride = 1,滤波器3 * 3
Cin:表示来自输入层的a.k.a通道的深度!
Cout:表示a.k.a Channels 传出的深度(您可以不同地配置它 - 以了解更复杂的功能!),
Cin和Cout是您堆叠在一起以了解不同比例的多个要素的过滤器数量,例如您可能想要学习垂直边缘的第一层,以及45度的水平边缘和边缘,blah blah!,64种可能的不同过滤器每种不同的边缘!!
n:没有深度的输入尺寸,在INPUT图像的情况下n = 224!
p:每层的填充
s:用于每一层的步幅
f:过滤器尺寸,即CONV为3 * 3,MAXPOOL层为2 * 2!
在MAXPOOL5-2之后,您只需压缩音量并将其与第一个FC层连接 .
We get the table:
Finally, if you add all the weights calculated in the last column, you end up with 138,357,544(138 million) parameters to train for VGG-15!