VGG16 结构是:
Img->
Conv1(3)->Conv1(3)->Pool1(2) ==>
Conv2(3)->Conv2(3)->Pool2(2) ==>
Conv3(3)->Conv3(3)->Conv3(3)->Pool3(2) ==>
Conv4(3)->Conv4(3)->Conv4(3)->Pool4(2) ==>
Conv5(3)->Conv5(3)->Conv5(3) ====> FC
流程: http ://ethereon.github.io/netscope/#/gist/dc5003de6943ea5a6b8b
在 keras 代码中https://github.com/keras-team/keras/blob/master/keras/applications/vgg16.py
# Block 1
x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)
x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)
....
看起来只是将Conv1_1结果传递给Conv1_2,其余的也是。
我可以理解这一点:
Img->
Conv1(3)->Pool1(2) ==>
Conv2(3)->Pool2(2) ==>
Conv3(3)->Pool3(2) ==>
Conv4(3)->Pool4(2) ==>
Conv5(3) ====> FC
但不明白为什么 Conv1_1 可以连接到同一层 - Conv1_2 :
例如:
- 图片:224x224x3
- 内核:3x3
深度:3(通道)
Conv1_1:使用 64 个 kenels。所以有 64 个
3x3x3 kernel用来扫描 224x224x3(with padding 1) ,然后得到Conv1_1_feature_map224x224x64 。
在这里,是不是意味着:
- Conv1_2: 使用 64
3x3x64 kernel扫描Conv1_1_feature_map224x224x64 ,然后得到Conv1_2_feature_map224x224x64 ??
如果是,你能解释一下有什么好处吗?我无法清楚地理解这个流程的含义。目前尚不清楚为什么Conv1(3)->Conv1(3)->Pool1(2) 比Conv1(3)->Pool1. 根据我的感觉,另一个相同大小的 Conv看起来只是让前一层的输出更加模糊/模糊,不像 Pooling 层集中前一层的输出特征。