VGG16 struct is:
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
The flow : http://ethereon.github.io/netscope/#/gist/dc5003de6943ea5a6b8b
In keras code 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)
....
It looks like just pass Conv1_1
result to Conv1_2
, and the rest too.
I can understand this:
Img->
Conv1(3)->Pool1(2) ==>
Conv2(3)->Pool2(2) ==>
Conv3(3)->Pool3(2) ==>
Conv4(3)->Pool4(2) ==>
Conv5(3) ====> FC
But don't understand why Conv1_1 can connect to a same layer - Conv1_2 :
For example:
- Img: 224x224x3
- kernel:3x3
depth:3 (channel)
Conv1_1: use 64 kenels. So there are 64
3x3x3 kernel
used to scan 224x224x3(with padding 1) , then getConv1_1_feature_map
224x224x64 .
Here, does it mean:
- Conv1_2: use 64
3x3x64 kernel
to scanConv1_1_feature_map
224x224x64 , then getConv1_2_feature_map
224x224x64 ??
If it is, could you explain what is the benifit ? I can't understand the meaning of this flow clearly. It is not clear that why Conv1(3)->Conv1(3)->Pool1(2)
is better than Conv1(3)->Pool1
. On my feeling, another same size Conv looks like just make previous layer output more blurred/ambiguous, doesn't like Pooling layer concentrate previous Layer's output feature.
Conv1(3)->Conv1(3)->Pool1(2)
is better thanConv1(3)->Pool1
. On my feeling, another same size Conv looks like just make previous layer output more blurred/ambiguous, doesn't like Pooling layer concentrate previous Layer's output feature. – Mithril Jan 26 '18 at 07:01