Мне трудно понять форму вывода 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/), Iчитать:
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, но в обратном порядке.
Поскольку применение Conv2D с kernel_size = (3, 3), шагами = (10, 10) и padding = "same" к изображению 200x200 приведет к 20x20image, я предполагаю, что применение Conv2DTranspose с kernel_size = (3, 3), strides = (10, 10) и padding = "same" к изображению 20x20 приведет к выводу изображения 200x200.
Кроме того, применениеConv2D с kernel_size = (3, 3), strides = (10, 10) и padding = "same" для изображения 195x195 также выведет изображение 20x20.
Итак, я понимаю, чтоНеоднозначность выходной формы при применении Conv2DTranspose с kernel_size = (3, 3), strides = (10, 10) и padding = "same«(пользователь может захотеть, чтобы выходные данные были 195x195, или 200x200, или многими другими совместимыми формами.)
Я предполагаю, что« выходная форма выведена. »означает, что выходная форма по умолчанию вычисляется в соответствии с параметрамислой, и я предполагаю, что есть механизм для задания формы вывода, отличной от значения по умолчанию, если необходимо.
При этом я не очень понимаю
значение параметра "output_padding"
взаимодействия между параметрами "padding" и "output_padding"
различные формулы в функцииkeras.conv_utils.deconv_length
Может кто-нибудь объяснить это?
Большое спасибо,
Julien