I was running into the same question too, and from a quick search, I was surprised by the lack of thorough explanation of what this is. Here I’m trying my best:
On tensorflow doc, “same” results in padding evenly to the left/right or up/down of the input. When padding=“same” and strides=1, the output has the same size as the input.
- Normally for transpose convolution, we have
output_size = stride * (input_size - 1) + Kernel - 2 * padding
. As a side note, padding controls how much space is added around the output. There is some further explanation here. - The doc says
“The output has the same size as the input”
This is inconsistent with what I observed. I ran an experiment below. The behavior I saw was it’s trying to keep output_size = stride * input_size
Experiment:
import tensorflow as tf
t = tf.constant([
[
[0, 1],
[5, 6],
]
], dtype=tf.float32)
t = tf.expand_dims(t, axis=-1) # Now t has shape (1, 2, 2, 1)
# Needs 4d input, channels_last is chosen. That's why we need an input of (1,2,2,1)
conv = tf.keras.layers.Conv2DTranspose(
filters=1,
kernel_size=3,
strides=(2, 2),
padding='same',
data_format='channels_last',
dilation_rate=(1, 1),
activation=None,
use_bias=False,
kernel_initializer='he_normal',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
)(t)
conv.shape
I see (1,4,4,1) as output. I tried inputs with other shapes, such as (2,3), (3,3), the behavior output_size = stride * input_size
is consistent. I was inspired by ChatGPT o1-preview, so please do point out if there’s any incorrectness here (I couldn’t find more detailed explanation on this though)
@ai_curious I saw a nice response from you in 2021. As of 2024, the output padding part has been removed from the TensorFlow API