与 tf.nn.conv2d_transpose 相比,为什么 tf.keras.layers.Conv2DTranspose 不需要 output_shape?
Why does tf.keras.layers.Conv2DTranspose need no output_shape compared to tf.nn.conv2d_transpose?
我在这里遗漏了一些基本的东西。但是我总是使用 tf.nn
API 进行转置卷积,我必须在其中指定输出形状,因为它是模棱两可的(Link)。
但是,对于 TF 2.0,我切换到 Keras 子类化,现在我想知道为什么我不必在更高级别 API 中指定转置卷积的输出形状。他们如何准确计算它?
tf.keras.layers.Conv2DTranpose
通过 tf.keras.backend.conv2d_transpose
.
后端到 tf.nn.conv2d_transpose
为了计算 tf.nn.conv2d_transpose
的 output_shape
参数,它使用函数 deconv_output_length
(定义为 here):
def deconv_output_length(input_length, filter_size, padding, stride):
"""Determines output length of a transposed convolution given input length.
Arguments:
input_length: integer.
filter_size: integer.
padding: one of "same", "valid", "full".
stride: integer.
Returns:
The output length (integer).
"""
if input_length is None:
return None
input_length *= stride
if padding == 'valid':
input_length += max(filter_size - stride, 0)
elif padding == 'full':
input_length -= (stride + filter_size - 2)
return input_length
我在这里遗漏了一些基本的东西。但是我总是使用 tf.nn
API 进行转置卷积,我必须在其中指定输出形状,因为它是模棱两可的(Link)。
但是,对于 TF 2.0,我切换到 Keras 子类化,现在我想知道为什么我不必在更高级别 API 中指定转置卷积的输出形状。他们如何准确计算它?
tf.keras.layers.Conv2DTranpose
通过 tf.keras.backend.conv2d_transpose
.
tf.nn.conv2d_transpose
为了计算 tf.nn.conv2d_transpose
的 output_shape
参数,它使用函数 deconv_output_length
(定义为 here):
def deconv_output_length(input_length, filter_size, padding, stride):
"""Determines output length of a transposed convolution given input length.
Arguments:
input_length: integer.
filter_size: integer.
padding: one of "same", "valid", "full".
stride: integer.
Returns:
The output length (integer).
"""
if input_length is None:
return None
input_length *= stride
if padding == 'valid':
input_length += max(filter_size - stride, 0)
elif padding == 'full':
input_length -= (stride + filter_size - 2)
return input_length