TensorFlow model.fit:预期形状=(无,100,3),找到的形状=(100,3)

z2acfund  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(184)

我是TensorFlow和ML的新手,我正在尝试创建一个GAN,它将生成一个3维数组(输出形状为100,3)。
我有以下鉴别器模型:

def make_discriminator_model():
    model = tf.keras.Sequential()

    model.add(layers.LeakyReLU(input_shape=(100, 3), name="Input"))

    model.add(layers.Flatten(name="Flatten"))
    model.add(layers.Dense(1, name="Output"))

    return model

当使用这种模型时,它工作正常:

if __name__ == "__main__":
    # generate fake data to test the discriminator with
    noise = tf.random.normal([1, 100])
    generator = make_generator_model()
    fake_data = generator(noise, training=False)

    # create the discriminator
    discriminator = make_discriminator_model()
    # test with fake data
    decision = discriminator(fake_data)
    print(decision)

输出:tf.Tensor([[0.0120331]], shape=(1, 1), dtype=float32)
然而,当使用model.fit进行训练时,我得到的是ValueError: Input 0 of layer "sequential_1" is incompatible with the layer: expected shape=(None, 100, 3), found shape=(100, 3)

if __name__ == "__main__":
    generator = make_generator_model()
    discriminator = make_discriminator_model()

    # constants
    seed = tf.random.normal([1, 100])
    epochs = 5

    # generate fake data
    fake_data = generator(seed, training=False)

    # load dataset
    dataset = all_data(max_size=10_000)
    # split dataset into training (80%) and testing (20%)
    training_dataset = dataset[:8000]
    test_dataset = dataset[8000:]

    # use optimizer and loss function
    discriminator.compile(
        loss=losses.Hinge(),
        optimizer="adam",
        metrics=tf.metrics.BinaryAccuracy(threshold=0.0)
    )

    discriminator.summary()

    # convert training data into a Dataset
    input_dataset = tf.data.Dataset.from_tensor_slices(training_dataset[:6000])
    input_validation = tf.data.Dataset.from_tensor_slices(training_dataset[6000:])
    # train discriminator
    discriminator.fit(input_dataset, epochs=epochs, validation_data=input_validation)

我知道它需要None, 100, 3的形状,并得到100, 3的形状,但我不明白为什么它在使用model.fit时要在形状的前面添加None

h9vpoimq

h9vpoimq1#

前导None代表批次维度。透过指定input_shape=(100, 3),您是在告诉模型,它应该预期一个未知样品数目的批次,其中每个样品的形体都是(100,3)
然而,您输入给它的是(100,3)形状的Tensor,它将其解释为“一批100个形状为(3,)的样本“并发出抱怨。如果100实际上是一批样本中的样本数,则您需要指定input_shape=(3,)。否则,如果(100,3)是样本形状,并且批中确实只有一个样本,你需要在第一维展开Tensor,使之成为(1,100,3)

相关问题