Reputation: 11
im trying to do an CAE proposed here on the MNIST database, but whit a bottleneck of size 2. https://www.researchgate.net/figure/The-structure-of-proposed-Convolutional-AutoEncoders-CAE-for-MNIST-In-the-middle-there_fig1_320658590 When i do model summary, i got an error in the convolutional layers, the shapes dont match.
Model: "model_11"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_20 (InputLayer) (None, 28, 28, 1) 0
_________________________________________________________________
conv2d_58 (Conv2D) (None, 14, 14, 32) 6304
_________________________________________________________________
conv2d_59 (Conv2D) (None, 7, 7, 64) 100416
_________________________________________________________________
conv2d_60 (Conv2D) (None, 4, 4, 128) 73856
_________________________________________________________________
flatten_15 (Flatten) (None, 2048) 0
_________________________________________________________________
dense_38 (Dense) (None, 1152) 2360448
_________________________________________________________________
dense_39 (Dense) (None, 2) 2306
_________________________________________________________________
dense_40 (Dense) (None, 1152) 3456
_________________________________________________________________
reshape_16 (Reshape) (None, 3, 3, 128) 0
_________________________________________________________________
conv2d_transpose_31 (Conv2DT (None, 6, 6, 64) 401472
_________________________________________________________________
conv2d_transpose_32 (Conv2DT (None, 12, 12, 32) 401440
_________________________________________________________________
conv2d_transpose_33 (Conv2DT (None, 24, 24, 1) 25089
=================================================================
Total params: 3,374,787
Trainable params: 3,374,787
Non-trainable params: 0
_________________________________________________________________
Here is the full code
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_images = x_train.reshape(x_train.shape[0], 28, 28)
input_img = Input(shape=(28, 28, 1))
encoded = Convolution2D(32, 14, 14, activation = "relu", border_mode="same",subsample = (2,2))(input_img)
encoded = Convolution2D(64, 7, 7, activation = "relu", border_mode="same",subsample = (2,2))(encoded)
encoded = Convolution2D(128, 3, 3, activation = "relu", border_mode="same",subsample = (2,2))(encoded)
encoded = Flatten()(encoded)
encoded = Dense(1152)(encoded)
encoded = Dense(2)(encoded)
decoded = Dense(1152)(encoded)
decoded = Reshape((3,3,128))(decoded)
decoded = Deconvolution2D(64, 7, 7, activation = "relu",border_mode="same", subsample = (2,2))(decoded)
decoded = Deconvolution2D(32, 14, 14, activation = "relu",border_mode="same",subsample = (2,2))(decoded)
decoded = Deconvolution2D(1, 28, 28, activation = "relu",border_mode="same",subsample = (2,2))(decoded)
autoencoder = Model(input=input_img, output=decoded)`
Upvotes: 0
Views: 165
Reputation: 484
It seems keras issue with padding (Not certain but after quick search) So how about add below 2 lines
decoded = Flatten()(decoded)
decoded = Dense(3136)(decoded)
decoded = Reshape((7,7,64))(decoded)
final code is like below
encoded = Convolution2D(32, 14, 14, activation =
"relu", border_mode="same",subsample = (2,2))(input_img)
encoded = Convolution2D(64, 7, 7, activation = "relu", border_mode="same",subsample = (2,2))(encoded)
encoded = Convolution2D(128, 3, 3, activation = "relu", border_mode="valid",subsample = (2,2))(encoded)
encoded = Flatten()(encoded)
encoded = Dense(1152)(encoded)
encoded = Dense(2)(encoded)
decoded = Dense(1152)(encoded)
decoded = Reshape((3,3,128))(decoded)
decoded = Flatten()(decoded)
decoded = Dense(3136)(decoded)
decoded = Reshape((7,7,64))(decoded)
# decoded = Deconvolution2D(64, 7, 7, activation = "relu",border_mode="same", subsample = (2,2))(decoded)
decoded = Deconvolution2D(32, 14, 14, activation = "relu",border_mode="same",subsample = (2,2))(decoded)
decoded = Deconvolution2D(1, 28, 28, activation = "relu",border_mode="same",subsample = (2,2))(decoded)
autoencoder = Model(input=input_img, output=decoded)
Upvotes: 1