如何在 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。它只接受两个填充值,即valid
和same
。我无法理解这一点。据我所知,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
层中指定。
valid
和 same
实际上只是常用填充的简写 - 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 层表现异常