ValueError:“Concatenate”层需要输入匹配的形状,concat轴除外。获取输入形状:[(无、36、36、128)等

2024-05-16 20:40:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

知道我遗漏了什么吗? 在u6=concatenate([u6,c4])上出现异常

我正在使用python 3.9.1,我的导入主要涉及Keras使用TensorFlow后端。我还尝试删除了一些MaxPooling,但没有帮助,还更改了一些MaxPooling变量

我的图像输入是:input_img = Input((300, 300, 1), name="img")


Tags: inputsizeblockkernelfiltersdropoutsamepadding
1条回答
网友
1楼 · 发布于 2024-05-16 20:40:36

您的问题是图像的维度不是2的幂,例如,具有256或512这样的维度不会产生此问题,这是因为在您的网络中,您的池层生成了一半大小的图像,当你用300除以2,你得到的是一个系列:150和75,75不能被2除,所以当你试着除以75,你得到的是37号,当你做下面这个级别的转换,你得到的是36号

我不知道这是否足够清楚:如果您尝试对奇数像素的图像进行最大化,图像将变为300->;150->;75->;37->;18岁和18岁以上;36 STOP、36和37不相等,网络无法连接

因此,快速解决方案是:调整图像大小,使其尺寸为2的幂,比如512,或者至少是一个可以被8整除的尺寸(因为您有4个maxpooling)

相关问题 更多 >