ailun0x0e
ailun0x0e

Reputation: 49

Reshape layer after a dense layer in Keras

I am trying to understand why there is a mismatch dimensionality between a Dense Layer and a Reshape Layer. Shouldn't this snippet code be correct? The dimensionality of the Dense Layer output will be image_resize^2 * 128, why is there a conflict in the reshape?

input_shape = (28,28,1)
inputs = Input(shape=input_shape)
image_size = 28
image_resize = image_size // 4
x = Dense(image_resize * image_resize * 128)(inputs)
x = Reshape((image_resize, image_resize, 128))(x)

This is the error that shows up:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/venv/lib/python3.7/site-packages/keras/engine/base_layer.py", line 474, in __call__
    output_shape = self.compute_output_shape(input_shape)
  File "/Users/venv/lib/python3.7/site-packages/keras/layers/core.py", line 398, in compute_output_shape
    input_shape[1:], self.target_shape)
  File "/Users/venv/lib/python3.7/site-packages/keras/layers/core.py", line 386, in _fix_unknown_dimension
    raise ValueError(msg)
ValueError: total size of new array must be unchanged

Upvotes: 0

Views: 1941

Answers (2)

Dr. Snoopy
Dr. Snoopy

Reputation: 56357

Dense layers act on the last dimension of the input data, if you want to give image input to a Dense layer, you should first flatten it:

x = Flatten()(x)
x = Dense(image_resize * image_resize * 128)(x)
x = Reshape((image_resize, image_resize, 128))(x)

Then the Reshape will work.

Upvotes: 1

razimbres
razimbres

Reputation: 5015

Your input is 784 and enters Dense layer with 7*7*128

So you will have and output of 784*7*7*128 in Reshape, not 7*7*128

Upvotes: 0

Related Questions