【发布时间】:2019-02-18 16:29:40
【问题描述】:
我很难理解 keras.layers.Conv2DTranspose 的输出形状
这是原型:
keras.layers.Conv2DTranspose(
filters,
kernel_size,
strides=(1, 1),
padding='valid',
output_padding=None,
data_format=None,
dilation_rate=(1, 1),
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None
)
在文档 (https://keras.io/layers/convolutional/) 中,我读到:
If output_padding is set to None (default), the output shape is inferred.
在代码(https://github.com/keras-team/keras/blob/master/keras/layers/convolutional.py)中,我读到:
out_height = conv_utils.deconv_length(height,
stride_h, kernel_h,
self.padding,
out_pad_h,
self.dilation_rate[0])
out_width = conv_utils.deconv_length(width,
stride_w, kernel_w,
self.padding,
out_pad_w,
self.dilation_rate[1])
if self.data_format == 'channels_first':
output_shape = (batch_size, self.filters, out_height, out_width)
else:
output_shape = (batch_size, out_height, out_width, self.filters)
和(https://github.com/keras-team/keras/blob/master/keras/utils/conv_utils.py):
def deconv_length(dim_size, stride_size, kernel_size, padding, output_padding, dilation=1):
"""Determines output length of a transposed convolution given input length.
# Arguments
dim_size: Integer, the input length.
stride_size: Integer, the stride along the dimension of `dim_size`.
kernel_size: Integer, the kernel size along the dimension of `dim_size`.
padding: One of `"same"`, `"valid"`, `"full"`.
output_padding: Integer, amount of padding along the output dimension, can be set to `None` in which case the output length is inferred.
dilation: dilation rate, integer.
# Returns
The output length (integer).
"""
assert padding in {'same', 'valid', 'full'}
if dim_size is None:
return None
# Get the dilated kernel size
kernel_size = kernel_size + (kernel_size - 1) * (dilation - 1)
# Infer length if output padding is None, else compute the exact length
if output_padding is None:
if padding == 'valid':
dim_size = dim_size * stride_size + max(kernel_size - stride_size, 0)
elif padding == 'full':
dim_size = dim_size * stride_size - (stride_size + kernel_size - 2)
elif padding == 'same':
dim_size = dim_size * stride_size
else:
if padding == 'same':
pad = kernel_size // 2
elif padding == 'valid':
pad = 0
elif padding == 'full':
pad = kernel_size - 1
dim_size = ((dim_size - 1) * stride_size + kernel_size - 2 * pad + output_padding)
return dim_size
我知道 Conv2DTranspose 是一种 Conv2D,但相反。
由于将 kernel_size = (3, 3)、strides = (10, 10) 和 padding = "same" 的 Conv2D 应用到 200x200 图像将输出 20x20 图像, 我假设将 kernel_size = (3, 3)、strides = (10, 10) 和 padding = "same" 的 Conv2DTranspose 应用于 20x20 图像将输出 200x200 图像。
此外,将 kernel_size = (3, 3)、strides = (10, 10) 和 padding = "same" 的 Conv2D 应用到 195x195 图像也会输出 20x20 图像。
所以,我知道在应用具有 kernel_size = (3, 3)、strides = (10, 10) 和 padding = "same" 的 Conv2DTranspose 时,输出形状存在某种歧义(用户可能希望输出到是 195x195 或 200x200 或许多其他兼容的形状)。
我假设“输出形状是推断出来的”。表示根据层的参数计算默认输出形状,并且我假设有一种机制可以指定与默认输出形状不同的输出形状,如果需要的话。
这个说的,我不太明白
“output_padding”参数的含义
参数“padding”和“output_padding”的交互作用
keras.conv_utils.deconv_length函数中的各种公式
有人能解释一下吗?
非常感谢,
朱利安
【问题讨论】:
-
我坚信“output_padding”正是您正在寻找的用于创建不同输出大小的参数。
-
是的我怀疑,现在我想要的是(1)“output_padding”参数的具体含义(2)参数“padding”和“output_padding”之间的相互作用(3)一个解释keras.conv_utils.deconv_length函数中的各种公式
-
这没有帮助吗? keras.io/layers/convolutional 它似乎包含大量相关文档。
-
@MandyShaw 这个文档(我在我的问题中提到)提供了转置卷积的高级一般概念。它没有提供我需要的详细解释,这就是我首先在 SO 上发布的原因。
-
好的,很抱歉没有提供帮助。