如何在 VGG16 中将卷积层理解为另一个相同的卷积层?

数据挖掘 机器学习 深度学习 神经网络 卷积神经网络 vgg16
2022-03-14 22:58:01

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: 使用 643x3x64 kernel扫描Conv1_1_feature_map224x224x64 ,然后得到Conv1_2_feature_map224x224x64 ??

如果是,你能解释一下有什么好处吗?我无法清楚地理解这个流程的含义。目前尚不清楚为什么Conv1(3)->Conv1(3)->Pool1(2)Conv1(3)->Pool1. 根据我的感觉,另一个相同大小的 Conv看起来只是让前一层的输出更加模糊/模糊,不像 Pooling 层集中前一层的输出特征。

2个回答

解决您的问题:

不清楚为什么Conv1(3)->Conv1(3)->Pool1(2)优于Conv1(3)->Pool1

..很多神经网络设计是一个反复试验的过程,更多的是艺术而不是科学。因此,您对 Conv1(3)->Pool1 的建议进行了一次实验,但未能获得所需的准确度,并进行了更多实验以得到 Conv1(3)->Conv1(3)->Pool1(2) 的准确度他们需要的。

很少有真正的科学解释为什么 Conv1(3)->Conv1(3)->Pool1(2) 优于 Conv1(3)->Pool1,但一般来说,我们需要尽可能多的权重来捕获所有数据的可变性尽可能,但不会更多(否则我们会过度拟合。)

如果我有问题的意思,第一个卷积接受大小的输入224*224*3意味着高度和宽度都是224,深度的大小或激活图的数量,这里的通道等于三。该层的输出将是与输入具有相同高度和宽度的激活图224,因为它是相同的卷积。将传递给下一层的该层的激活图数量等于64因为您64在该层中有过滤器。关键是每个过滤器的大小3*3*3都适合输入。每个过滤器的输出是一个大小为 224*224*1 的激活图。过滤器的输出汇集在一起​​并构造大小的输出,224*224*64这意味着下一层的输入将具有64渠道,其实深度在这里。因此,第二个卷积层的过滤器的大小3*3*224与前一层的整个输入相匹配。换句话说,您将有 64 个大小的过滤器,3*3*64每个过滤器都有一个大小的输出224*224*1看看这里绝对可以帮助你。


网络作者的目的VGG是制作一个深度足以在ImageNet数据集上表现良好的网络。CNNs有很多超参数,它们的设置不是基于表现良好的数学东西。我的意思是没有证据表明哪个超参数比其他参数更好。它们是根据经验找到的。它们实际上是获得的。这篇论文的作者试图表明,如果你对卷积层使用相同的超参数,只是让网络越来越深,它比 更深AlexNet,你将获得良好的性能,而无需关心不同的超参数集。为了理解做什么,这里ConvNets已经有一个答案可以帮助你,它包含对不同层的解释CNNs. 他们已经通过经验达到了卷积层和架构的这种设置,并且他们的想法是只使用没有复杂超参数的深度网络。