Python Keras UNet Conv2DTranspose零维数组错误

Python Keras UNet Conv2DTranspose零维数组错误,python,keras,keras-layer,unity3d-unet,Python,Keras,Keras Layer,Unity3d Unet,我有一个相当简单/标准的Unet体系结构,如下所示: radar_input_layer = layers.Input(shape=(tdata.shape[1],tdata.shape[2],tdata.shape[3])) print(radar_input_layer.shape) c1 = layers.Conv2D(neurons, (3,3), activation='relu', kernel_initializer='he_normal',padding='s

我有一个相当简单/标准的Unet体系结构,如下所示:

radar_input_layer = layers.Input(shape=(tdata.shape[1],tdata.shape[2],tdata.shape[3]))

    print(radar_input_layer.shape)

    c1 = layers.Conv2D(neurons, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(radar_input_layer)
    c1 = layers.Dropout(0.5)(c1)
    c1 = layers.Conv2D(neurons, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(c1)
    p1 = layers.MaxPooling2D((2,2))(c1)

    print(p1.shape)

    c2 = layers.Conv2D(neurons * 2, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(p1)
    c2 = layers.Dropout(0.5)(c2)
    c2 = layers.Conv2D(neurons * 2, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(c2)
    p2 = layers.MaxPooling2D((2,2))(c2)

    print(p2.shape)

    c3 = layers.Conv2D(neurons * 4, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(p2)
    c3 = layers.Dropout(0.5)(c3)
    c3 = layers.Conv2D(neurons * 4, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(c3)
    p3 = layers.MaxPooling2D((2,2))(c3)

    print(p3.shape)

    c4 = layers.Conv2D(neurons * 8, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(p3)
    c4 = layers.Dropout(0.5)(c4)
    c4 = layers.Conv2D(neurons * 8, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(c4)
    p4 = layers.MaxPooling2D((2,2))(c4)

    print(p4.shape)

    c5 = layers.Conv2D(neurons * 16, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(p4)
    c5 = layers.Dropout(0.5)(c5)
    c5 = layers.Conv2D(neurons * 16, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(c5)

    print(c5.shape)
    u1 = layers.Conv2DTranspose(neurons * 8, (2,2), strides=(2,2), padding='same')(c5)

    print(u1.shape)
    print(c4.shape)

    u1 = np.concatenate([u1,c4])
    c6 = layers.Conv2D(neurons * 8, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(u1)
    c6 = layers.Dropout(0.5)(c6)
    c6 = layers.Conv2D(neurons * 8, (3,3), activation='relu', kernel_initializer='he_normal',padding='same')(c6)

    ...
我已将我的tdata和#神经元定义为:

tdata = np.zeros([100,450,552,2])
neurons = 16
正如示例测试数据集一样,在上面的tdata示例中,通道=最后一个(即100个样本、450行、552列)

结果如下:

(?, 225, 276, 16)
(?, 112, 138, 32)
(?, 56, 69, 64)
(?, 28, 34, 128)
(?, 28, 34, 256)
(?, ?, ?, 128)
(?, 56, 69, 128)
Traceback (most recent call last):
ValueError: zero-dimensional arrays cannot be concatenated

因此,在连接u1和c4时,问题被挂起。更具体地说,问题在于u1没有被定义为具有实际形状(?,?,128),而它应该是(?,56,69128)。为什么本例中的尺寸标注不完整,如何修复?

请确保您有Keras或Tensorflow的更新版本。 我从你的代码中得到以下输出

(None, 450, 552, 2)
(None, 225, 276, 16)
(None, 112, 138, 32)
(None, 56, 69, 64)
(None, 28, 34, 128)
(None, 28, 34, 256)
(None, 56, 68, 128)
(None, 56, 69, 128)