ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: `[(None, 36, 36, 128), (None, 37, 37, 128)]`
def conv2d_block(input_tensor, n_filters, kernel_size=3, batchnorm=True): # first layer x = Conv2D(filters=n_filters, kernel_size=(kernel_size, kernel_size), kernel_initializer="he_normal", padding="same")(input_tensor) if batchnorm: x = BatchNormalization()(x) x = Activation("relu")(x) # second layer x = Conv2D(filters=n_filters, kernel_size=(kernel_size, kernel_size), kernel_initializer="he_normal", padding="same")(x) if batchnorm: x = BatchNormalization()(x) x = Activation("relu")(x) return x def get_unet(input_img, n_filters=16, dropout=0.5, batchnorm=True): # contracting path c1 = conv2d_block(input_img, n_filters=n_filters*1, kernel_size=3, batchnorm=batchnorm) p1 = MaxPooling2D((2, 2)) (c1) p1 = Dropout(dropout*0.5)(p1) c2 = conv2d_block(p1, n_filters=n_filters*2, kernel_size=3, batchnorm=batchnorm) p2 = MaxPooling2D((2, 2)) (c2) p2 = Dropout(dropout)(p2) c3 = conv2d_block(p2, n_filters=n_filters*4, kernel_size=3, batchnorm=batchnorm) p3 = MaxPooling2D((2, 2)) (c3) p3 = Dropout(dropout)(p3) c4 = conv2d_block(p3, n_filters=n_filters*8, kernel_size=3, batchnorm=batchnorm) p4 = MaxPooling2D(pool_size=(2, 2)) (c4) p4 = Dropout(dropout)(p4) c5 = conv2d_block(p4, n_filters=n_filters*16, kernel_size=3, batchnorm=batchnorm) # expansive path u6 = Conv2DTranspose(n_filters*8, (3, 3), strides=(2, 2), padding='same') (c5) u6 = concatenate([u6, c4]) u6 = Dropout(dropout)(u6) c6 = conv2d_block(u6, n_filters=n_filters*8, kernel_size=3, batchnorm=batchnorm) u7 = Conv2DTranspose(n_filters*4, (3, 3), strides=(2, 2), padding='same') (c6) u7 = concatenate([u7, c3]) u7 = Dropout(dropout)(u7) c7 = conv2d_block(u7, n_filters=n_filters*4, kernel_size=3, batchnorm=batchnorm) u8 = Conv2DTranspose(n_filters*2, (3, 3), strides=(2, 2), padding='same') (c7) u8 = concatenate([u8, c2]) u8 = Dropout(dropout)(u8) c8 = conv2d_block(u8, n_filters=n_filters*2, kernel_size=3, batchnorm=batchnorm) u9 = Conv2DTranspose(n_filters*1, (3, 3), strides=(2, 2), padding='same') (c8) u9 = concatenate([u9, c1], axis=3) u9 = Dropout(dropout)(u9) c9 = conv2d_block(u9, n_filters=n_filters*1, kernel_size=3, batchnorm=batchnorm) outputs = Conv2D(1, (1, 1), activation='sigmoid') (c9) model = Model(inputs=[input_img], outputs=[outputs]) return model
Any idea on what I’m missing? The exception comes up on u6 = concatenate([u6, c4])
I’m using python 3.9.1
, my imports involve mainly Keras
using a TensorFlow
backend. I’ve also tried removing some of the MaxPooling, but that didn’t help, as well as changing some of the MaxPulling variables.
My image input is: input_img = Input((300, 300, 1), name="img")
Advertisement
Answer
Your problem is that the images does not have a dimension as a power of 2, for example having a dimension like 256 or 512 will not create this problem, this happens because in your network you have pooling layers that generate images of half the size, and when you divide more times 300 for 2 you get the series: 150 and 75 and 75 is not divisible for 2, so when you try to divide 75 you get size 37 and when you do the traspose of the level beneath you get size 36.
i don’t know if it was clear enough: you are trying to do the maxpooling of an image with an odd number of pixel, the image will go 300 -> 150 -> 75 -> 37 -> 18 and the get dubled 18 -> 36 STOP, 36 and 37 are not equal and the network can’t concatenate
So, fast solution: resize the images to have a dimension as a power of 2, like 512, or at the very least a size divisible for 8 ( because you have 4 maxpooling)