138M
是指该网络的参数总数,即包括所有卷积层和全连接层。观察由3个conv3-256
层组成的第3个卷积阶段:
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
的详细信息
如上所述,在将输入传递给全连接层之前,空间分辨率为7×7像素。这是因为该VGG Net在卷积之前使用了空间填充,详见论文第2.1节:
[...]卷积层输入的空间填充使得在卷积之后空间分辨率得以保留,即对于3×3的卷积层来说,填充应为1个像素。
通过这样的填充,并且使用224×224像素的输入图像,在最后一个卷积/池化阶段之后,分辨率会按以下方式降低:512个特征映射的112×112、56×56、28×28、14×14和7×7。
这给出了一个具有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
使用上述内容,以及2.1 架构
在训练过程中,我们的ConvNets的输入是固定大小的224 × 224 RGB图像。我们唯一的预处理是从每个像素中减去在训练集上计算得出的平均RGB值。
图像通过一堆卷积(conv.)层传递,其中我们使用具有非常小的感受野的滤波器:3×3(这是捕捉左/右、上/下、中心概念的最小尺寸)。卷积步幅固定为1像素;对于3×3 conv.层,卷积层输入的空间填充使得空间分辨率在卷积后保持不变,即对于3×3 conv.层,填充为1像素。空间池化由五个最大池化层执行,这些层遵循一些卷积层(并非所有卷积层都跟随最大池化)。最大池化在2×2像素窗口上执行,步幅为2。
一堆卷积层(在不同的架构中具有不同的深度)后面是三个全连接(FC)层:前两个分别具有4096个通道,第三个执行1000路ILSVRC分类,因此包含1000个通道(每个类别一个)。
最后一层是软最大化层。
注意:
你可以简单地将相应的激活形状列相乘以获取激活大小。
CONV3:意味着一个3*3的过滤器将在输入上进行卷积!
MAXPOOL3-2:意味着第三个池化层,使用2*2的过滤器,步幅为2,填充为0(在池化层中非常标准)。
阶段-3:意味着它有多个堆叠的CONV层!具有相同的填充=1,步幅=1和过滤器3*3。
Cin:表示来自输入层的深度,也称为通道!
Cout:表示深度,即出站(您可以以不同方式配置它,以学习更复杂的功能!),
Cin和Cout是您堆叠在一起以在不同比例上学习多个特征的过滤器数量,例如在第一层中,您可能希望学习垂直边缘、水平边缘和45度的边缘等等,64种不同类型的边缘过滤器!!
n:输入维度,不包括深度,例如输入图像的n=224!
p:每层的填充
s:每层使用的步幅
f:过滤器大小,例如CONV的3*3和MAXPOOL层的2*2!
在MAXPOOL5-2之后,您只需将卷积体展平并将其与第一个FC层接口即可!
最后,如果您将最后一列中计算的所有权重相加,您将得到138,357,544(1.38亿)个参数,用于训练VGG-15!
以下是计算每个CNN层参数数量的方法:
一些定义
n--过滤器宽度
m--过滤器高度
k--输入特征图数
L--输出特征图数
那么参数数量 #= (n*m*k+1)*L,其中第一个部分来自权重,第二个部分来自偏置。
S
代表什么?下采样的Stride
吗?@runDOSrun - nn0p