“concat”模式只能合并具有匹配输出形状的图层,除了 concat 轴

数据挖掘 深度学习 喀拉斯 张量流 卷积神经网络 卡格尔
2022-03-12 07:47:23

我有一个正在尝试调试的函数,它会产生以下错误消息:

ValueError:“concat”模式只能合并具有匹配输出形状的图层,除了 concat 轴。图层形状:[(None, 128, 80, 256), (None, 64, 80, 80)]

我正在运行一个名为Dstl Satellite Imagery Feature Detection的 Kaggle 竞赛的内核(内核可在此处获得

这是我在将张量列表合并为单个张量时遇到问题的函数:

 def get_unet():
    inputs = Input((8, ISZ, ISZ))
    conv1 = Convolution2D(32, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(inputs)
    conv1 = Convolution2D(32, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2), dim_ordering="th")(conv1)

    conv2 = Convolution2D(64, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(pool1)
    conv2 = Convolution2D(64, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2), dim_ordering="th")(conv2)

    conv3 = Convolution2D(128, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(pool2)
    conv3 = Convolution2D(128, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(conv3)
    pool3 = MaxPooling2D(pool_size=(2, 2), dim_ordering="th")(conv3)

    conv4 = Convolution2D(256, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(pool3)
    conv4 = Convolution2D(256, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(conv4)
    pool4 = MaxPooling2D(pool_size=(2, 2), dim_ordering="th")(conv4)

    conv5 = Convolution2D(512, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(pool4)
    conv5 = Convolution2D(512, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(conv5)

    up6 = merge([UpSampling2D(size=(2, 2), dim_ordering="th")(conv5), conv4], mode='concat', concat_axis=1)
    conv6 = Convolution2D(256, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(up6)
    conv6 = Convolution2D(256, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(conv6)

    up7 = merge([UpSampling2D(size=(2, 2), dim_ordering="th")(conv6), conv3], mode='concat', concat_axis=1)
    conv7 = Convolution2D(128, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(up7)
    conv7 = Convolution2D(128, 3, 3, activation='relu', border_mode='same')(conv7)

    up8 = merge([UpSampling2D(size=(2, 2), dim_ordering="th")(conv7), conv2], mode='concat', concat_axis=1)
    conv8 = Convolution2D(64, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(up8)
    conv8 = Convolution2D(64, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(conv8)

    up9 = merge([UpSampling2D(size=(2, 2), dim_ordering="th")(conv8), conv1], mode='concat', concat_axis=1)
    conv9 = Convolution2D(32, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(up9)
    conv9 = Convolution2D(32, 3, 3, activation='relu', border_mode='same', dim_ordering="th")(conv9)

    conv10 = Convolution2D(N_Cls, 1, 1, activation='sigmoid', dim_ordering="th")(conv9)

    model = Model(input=inputs, output=conv10)
    model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=[jaccard_coef, jaccard_coef_int, 'accuracy'])
    return model

我正在keras使用TensorFlow后端运行。我的想法是软件版本存在一些兼容性问题(即原始代码已使用一年多)。或者,也许我需要以某种方式重塑数据。

什么可能导致此错误?

这是完整的错误:

Traceback (most recent call last):

  File "<ipython-input-1-e8f13915ac9b>", line 1, in <module>
    runfile('/Users/aaron/temp/tmp/kaggle_dstl_v3.py', wdir='/Users/aaron/temp/tmp')

  File "/Users/aaron/anaconda3/envs/kaggle-dstl-env/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "/Users/aaron/anaconda3/envs/kaggle-dstl-env/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/Users/aaron/temp/tmp/kaggle_dstl_v3.py", line 513, in <module>
    model = train_net()

  File "/Users/aaron/temp/tmp/kaggle_dstl_v3.py", line 416, in train_net
    model = get_unet()

  File "/Users/aaron/temp/tmp/kaggle_dstl_v3.py", line 294, in get_unet
    up8 = merge([UpSampling2D(size=(2, 2), dim_ordering="th")(conv7), conv2], mode='concat', concat_axis=1)

  File "/Users/aaron/anaconda3/envs/kaggle-dstl-env/lib/python3.6/site-packages/keras/legacy/layers.py", line 458, in merge
    name=name)

  File "/Users/aaron/anaconda3/envs/kaggle-dstl-env/lib/python3.6/site-packages/keras/legacy/layers.py", line 111, in __init__
    node_indices, tensor_indices)

  File "/Users/aaron/anaconda3/envs/kaggle-dstl-env/lib/python3.6/site-packages/keras/legacy/layers.py", line 191, in _arguments_validation
    'Layer shapes: %s' % (input_shapes))

ValueError: "concat" mode can only merge layers with matching output shapes except for the concat axis. Layer shapes: [(None, 128, 80, 256), (None, 64, 80, 80)]
1个回答

首先,您的代码已经过时是正确的,因为某些正在使用的函数已被弃用(例如 Convolution2D 现在是 Conv2D,请参见此处)。

但是,错误清楚地表明您正在尝试连接两个尺寸不匹配的张量。沿特定轴连接两个张量时,除了被连接的一个之外,所有其他维度必须相同在您的情况下,您尝试沿轴 = 1 连接,但最后一个维度不同(第一个张量为 256,第二个张量为 80)。

我建议您将 U-Net 代码基于较新的实现(link1link2link3)。

这些实现取代了您的

merge([UpSampling2D(size=(2, 2), dim_ordering="th")(conv5), conv4], mode='concat', concat_axis=1)

层与

up_conv5 = UpSampling2D(size=(2, 2), data_format="channels_last")(conv5)
ch, cw = get_crop_shape(conv4, up_conv5)
crop_conv4 = Cropping2D(cropping=(ch,cw), data_format="channels_last")(conv4)
up6   = concatenate([up_conv5, crop_conv4], axis=concat_axis)`

它还裁剪前一层的高度和宽度以正确执行连接(裁剪的形状通过辅助函数确定)。