xanjay
xanjay

Reputation: 571

ValueError: Error when checking target: expected activation_7 to have shape (154, 154, 1) but got array with shape (200, 200, 3)

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

Answers (1)

Ioannis Nasios
Ioannis Nasios

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

Related Questions