如何在 Conv2D 层中使用 keras 指定填充?

Posted

技术标签:

【中文标题】如何在 Conv2D 层中使用 keras 指定填充?【英文标题】:How to specify padding with keras in Conv2D layer? 【发布时间】:2019-09-05 18:18:05 【问题描述】:

我正在尝试使用 Keras 实现 AlexNet,并正在检查 MATLAB 中的网络设计,如下所示

可以看出,第二个卷积层有 256 个大小为 5x5 的过滤器、48 个通道和 [2 2 2 2] 的填充。如何使用 Keras 指定 [2 2 2 2] 的 padding?我通过了documentation of Conv2D。它只接受两个填充值,即validsame。我无法理解这一点。据我所知,valid 意味着零填充。如何使用第二个卷积层指定 [2 2 2 2] 填充?我将第一层创建为:

model.add(keras.layers.Conv2D(filters = 96, kernel_size = (11,11), 
 strides = (4,4), padding = "valid", input_shape=(227,227,3)))

另外,由于第二层有 48 个通道,我需要明确说明吗?

【问题讨论】:

【参考方案1】:

Conv2D 中没有指定特定的填充,而是在ZeroPadding2D 层中指定。

validsame 实际上只是常用填充的简写 - valid 表示您不填充输入,same 表示您添加填充以使输出长度与输入长度相同.

如果您想添加大小为 2 的特定填充:

model.add(keras.layers.ZeroPadding2D(padding=(2, 2)))
model.add(keras.layers.Conv2D(filters = 96, kernel_size = (11,11), strides = (4,4), padding = "valid"))

我还强烈建议您查看此keras implementation of alexnet。请注意,您还可以在 the keras convolutional docs 中找到用于填充层的文档(一直在底部)。

【讨论】:

用 2 2 2 2 填充然后在 Conv2D 中使用 padding=same 到底是什么意思? @SuhailGupta 同样会给你更多的填充,每次你通过一个卷积层你的输出会变小,除非你填充。如果你用 2 2 2 2 填充,你的输入会变大。然后它被传递到你的 conv 层,然后以我上面描述的方式相同/有效地影响它。 @SuhailGupta 你的 (2 2 2 2) 应该对应 ((top_pad, bottom_pad), (left_pad, right_pad)),和ZeroPadding2D(padding=(2, 2))一样。 不加[2 2 2 2] padding直接使用same会有什么不同? @SzymonMaszke 哦,你是对的,那是我的错,但其他一切都正常【参考方案2】:

valid 填充正确,请注意使用此参数层后宽度和高度会更小。

另一方面,填充 same 意味着将使用特定的填充大小来确保图像尺寸不会发生变化。

对于您的特定情况,如果您在输入图像的每一侧填充2 像素,您将获得与图层输出完全相同大小的图像。所以指定same 将执行与[2 2 2 2] 完全相同的填充。

如果你想要计算卷积层后输出大小的公式check first answer to this Quora question。

我很少(如果有的话)见过不同的填充方案,所以这些通常就足够了。

顺便说一句。 AlexNet 中的所有层都使用填充 same,除了第一个(如 cmets 中正确指出的另一个答案)。

【讨论】:

以上是关于如何在 Conv2D 层中使用 keras 指定填充?的主要内容,如果未能解决你的问题,请参考以下文章

项目小结训练BERT模型加入到深度学习网络层中——keras_bert库使用填坑指南

项目小结训练BERT模型加入到深度学习网络层中——keras_bert库使用填坑指南

具有 padding='SAME' 的 Tensorflow/Keras Conv2D 层表现异常

keras.layers.Conv2D的默认内核大小,零填充和步幅是什么?

卷积层(CNN)如何在 keras 中工作?

keras.layers.Conv2D 的默认内核大小、零填充和步幅是多少?