Reputation: 571
I'm trying to build CNN Autoencoder. Each training image(color) has size of 200*200. I got the error while compiling: ValueError: Error when checking target: expected activation_7 to have shape (154, 154, 1) but got array with shape (200, 200, 3)
with following code. How can the code can modified to work ?
autoencoder = Sequential()
autoencoder.add(Conv2D(64, (3, 3), input_shape=(200, 200, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2)))
autoencoder.add(Conv2D(32, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2)))
autoencoder.add(Conv2D(32, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2))) # encoded
autoencoder.add(Conv2D(32, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))
autoencoder.add(Conv2D(32, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))
autoencoder.add(Conv2D(64, (3, 3)))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))
autoencoder.add(Conv2D(1, (3, 3)))
autoencoder.add(Activation('sigmoid'))
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
Upvotes: 1
Views: 54
Reputation: 8537
As i see it, there are two main issues with your code above.
First is dimension decrease, from (200,200) to (154,154) witch can easily be solved by padding='same' to every Conv2D layer like this:
autoencoder = Sequential()
autoencoder.add(Conv2D(64, (3, 3), input_shape=(200, 200, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2)))
autoencoder.add(Conv2D(32, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2)))
autoencoder.add(Conv2D(32, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(MaxPooling2D(pool_size=(2, 2))) # encoded
autoencoder.add(Conv2D(32, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))
autoencoder.add(Conv2D(32, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))
autoencoder.add(Conv2D(64, (3, 3), padding='same'))
autoencoder.add(Activation('relu'))
autoencoder.add(UpSampling2D((2,2)))
autoencoder.add(Conv2D(1, (3, 3), padding='same'))
autoencoder.add(Activation('sigmoid'))
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
Second issue is with your target. What you are trying to predict here with output (200,200,1)
at your last Conv2D
layer, with sigmoid activation
and binary_crossentropy loss
is a grayscale image. If this is what you want you have to train your model with y_train being 1 channel images (200,200,1) otherwise you can change your output to (200,200,3) like this:
change:
autoencoder.add(Conv2D(1, (3, 3), padding='same'))
to:
autoencoder.add(Conv2D(3, (3, 3), padding='same'))
Upvotes: 2