How to create a decoder with varying input shape but fixed output shape?


I was playing around with autoencoders for mnist recently and this question appeared.
"Is it possible to create a model with varying input shape but fixed output shape?"


Regularly decoder input will be e.g keras.layers.InputLayer(input_shape=(7, 7, 1)), you will have some UpSampling layers in the model to bring shape from (7,7,1) up to (28, 28, 1).

But what if decoder Input has unspecified shape?

Imagine convolutional decoder with input layer keras.layers.InputLayer(input_shape=(None, None, 1)). Input shapes for decoder maybe be different, however, decoder’s output always has a fixed shape (28, 28, 1). How to build a model that will determine how to do UpSampling depending on input shape it received?

Let me know if this question does not make any sense. I will delete it;)


Conv and MaxPool layers can operate on variable size input. Dense layers need to know the size. So before them you can put a GlobalMaxPooling or similar layer. For example:

image_1 = np.random.random((1, 500, 600, 3))
image_2 = np.random.random((1, 200, 300, 3))
y = np.ones((1, 28, 28, 1))

inputs = Input(shape=(None, None, 3))
l = inputs
l = Conv2D(128, 7, activation='relu', padding='same')(l)
l = MaxPooling2D(2)(l)
l = GlobalMaxPooling2D()(l)
l = Dense(14*14, activation='relu')(l)
l = Reshape((14, 14, 1))(l)
outputs= UpSampling2D((2, 2))(l)
model = Model(inputs=inputs, outputs=outputs)
model.compile(loss='mse', optimizer='adam'), y), y)

The model will accept variable size images, and has an output of shape (28, 28, 1). Model summary:

Model: "model"
 Layer (type)                Output Shape              Param #   
 input_1 (InputLayer)        [(None, None, None, 3)]   0         
 conv2d (Conv2D)             (None, None, None, 128)   18944     
 max_pooling2d (MaxPooling2D  (None, None, None, 128)  0         
 global_max_pooling2d (Globa  (None, 128)              0         
 dense (Dense)               (None, 196)               25284     
 reshape (Reshape)           (None, 14, 14, 1)         0         
 up_sampling2d (UpSampling2D  (None, 28, 28, 1)        0         

Answered By – AndrzejO

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published