如何在 keras conv 层中进行零填充?
Posted
技术标签:
【中文标题】如何在 keras conv 层中进行零填充?【英文标题】:How to do zero padding in keras conv layer? 【发布时间】:2017-12-14 05:56:54 【问题描述】:我正在尝试从科学文章中实现模型,该文章说他们正在使用零填充。是否可以在keras Conv2D 中配置此填充?
我看到的填充的唯一可能值是
填充:“有效”或“相同”之一(不区分大小写)。
是否可以用零或其他常量值填充?
【问题讨论】:
这里有更详细的keras padding layer的解释***.com/a/39371113/11239773 【参考方案1】:“相同”表示零填充。目前无法以有效的方式填充其他常量。
【讨论】:
你怎么知道的?更可能的“相同”意味着填充相同的值,不是吗? “相同”一词指的是结果的形状,而不是其值。也就是说,返回的张量与输入的形状相同。 看起来“相同”的工作方式与在前面的 ZeroPadding2D 图层中使用“有效”时的工作方式不同。请在此处查看我的实验:***.com/questions/60323897/…【参考方案2】:当您使用padding='valid'
时,没有填充。
当您将padding='same'
与strides=1
一起使用时,输入将补零,以便输出的宽度和高度与输入相同。如文档中所述,“相同”在后端与 strides
!= 1 略有不一致。
如果您想手动设置填充值,也许最简单的方法是在Conv2D
之前添加一个ZeroPadding2D
层。
例如,ZeroPadding2D(padding=((1,2),(3,4)))
将在左侧添加 1 个维度,在右侧添加 2 个维度,在顶部添加 3 个维度,在底部添加 4 个维度。 ZeroPadding2D(5)
将在所有 4 个边框上添加 5 个维度。
(顺便说一句,这是一个后端函数spatial_2d_padding
的包装层)
【讨论】:
【参考方案3】:看看spatial_2d_padding
函数。它用零填充张量。
【讨论】:
确实如此。这对于需要非标准填充的情况是理想的。卷积层具有padding='same'
选项,该选项将自动填充零以保持与输入相同的形状。但是,如果您想要卷积层本身不提供的东西,或者在其他情况下,这是正确的功能。
使用示例?【参考方案4】:
https://keras.io/layers/convolutional/
ZeroPadding2D=>
keras.layers.ZeroPadding2D(padding=(1, 1), data_format=None) 用于 2D 输入(例如图片)的零填充层。
该层可以在图像张量的顶部、底部、左侧和右侧添加零的行和列。
参数
填充:整数,或 2 个整数的元组,或 2 个整数的 2 个元组的元组。 如果是 int:相同的对称填充应用于高度和宽度。 如果 2 个整数的元组:解释为高度和宽度的两个不同的对称填充值:(symmetric_height_pad, symmetric_width_pad)。 If tuple of 2 tuples of 2 ints: 解释为 ((top_pad, bottom_pad), (left_pad, right_pad))
data_format:字符串,“channels_last”或“channels_first”之一。输入中维度的排序。 “channels_last”对应于具有形状(批次、高度、宽度、通道)的输入,而“channels_first”对应于具有形状(批次、通道、高度、宽度)的输入。它默认为在 ~/.keras/keras.json 的 Keras 配置文件中找到的 image_data_format 值。如果您从未设置它,那么它将是“channels_last”。
【讨论】:
【参考方案5】:我认为 padding='same' 意味着如果我们在隐藏层中,stride 找到的空单元格将填充上一层的值而不是零,只有输入层才会被填充用零。
【讨论】:
以上是关于如何在 keras conv 层中进行零填充?的主要内容,如果未能解决你的问题,请参考以下文章
keras.layers.Conv2D的默认内核大小,零填充和步幅是什么?
keras.layers.Conv2D 的默认内核大小、零填充和步幅是多少?