首页 > 解决方案 > ValueError: 层序的输入 0 与层不兼容。我该如何解决这个问题?

问题描述

我有自己的数据集,由大小为 100x100 的图像组成,而不是通常的 28x28(在 MNIST 中)。我正在尝试从我的数据集上的 tensorflow 主页运行 DCGAN 的代码,但我失败了。

我知道问题与尺寸有关,如果有人可以解释缺少的内容,我将不胜感激。我读过生成器的输出必须与鉴别器的输入匹配,但我不知道如何做到这一点。如果有人可以解释我必须调整的内容,将不胜感激?

这是鉴别器的代码:

def make_discriminator_model():
    model = tf.keras.Sequential()
    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same',input_shape=[100, 100, 1]))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Flatten())
    model.add(layers.Dense(1))

    return model

这是生成器的代码

def make_generator_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(25*25*256, use_bias=False, input_shape=(100,)))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Reshape((25, 25, 256)))
    assert model.output_shape == (None, 25, 25, 256) # Note: None is the batch size

    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
    assert model.output_shape == (None, 25, 25, 128)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    assert model.output_shape == (None, 50, 50, 64)
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
    assert model.output_shape == (None, 100, 100, 1)

    return model

我收到的错误是“ValueError:层顺序的输入 0 与层不兼容:输入形状的预期轴 -1 具有值 4,但接收到形状为 [100, 100] 的输入”。

标签: pythontensorflowkerasdeep-learning

解决方案


问题在于这条线

model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same',input_shape=[100, 100, 1]))

RGB 通道值的输入通道值应为 3 而不是 1。

将 input_shape 替换为

input_shape=[100, 100, 3]

推荐阅读