【问题标题】:Getting a ValueError for 2 inputs into a DCGAN with Tensorflow/Keras使用 Tensorflow/Keras 将 2 个输入的 ValueError 输入 DCGAN
【发布时间】:2020-12-16 01:37:08
【问题描述】:

所以我正在尝试按照 DCGAN 指南在 tensorflow https://www.tensorflow.org/tutorials/generative/dcgan 上生成图像,并且我已经非常接近地复制了代码,只需将数据集更改为我想要使用的数据集。每当我尝试训练模型时,我都会收到此错误 -

ValueError: Layersequential_1 需要 1 个输入,但它接收到 2 个输入张量。收到的输入:[, ]

具体是 train_step 函数中的这一行导致错误,

real_output = discriminator(images, training=True)

当它在 train 函数中被调用时

train(normalizedData, epochs)

判别器函数的定义是这样的,在代码前面:

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

    model.add(layers.Conv2D(128, (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

discriminator = make_discriminator_model()

这是上下文的其余部分。

@tf.function
def train_step(images):
    noise = tf.random.normal([batch_size, noise_dim])

    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
        generated_images = generator(noise, training=True)

        real_output = discriminator(images, training=True)
        fake_output = discriminator(generated_images, training=True)

        gen_loss = generator_loss(fake_output)
        disc_loss = discriminator_loss(real_output, fake_output)

    gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)
    gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)

    generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))
    discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))

def train(dataset, epochs):
    for epoch in range(epochs):
        start = time.time()

        for image_batch in dataset:
            train_step(image_batch)

        display.clear_output(wait=True)
        generate_and_save_images(generator,
                                 epoch + 1,
                                 seed)

        if (epoch + 1) % 15 == 0:
            checkpoint.save(file_prefix = checkpoint_prefix)

        print('Time for epoch {} is {} sec'.format(epoch + 1, time.time()-start))

    display.clear_output(wait=True)
    generate_and_save_images(generator,
                             epochs,
                             seed)

def generate_and_save_images(model, epoch, test_input):

    predictions = model(test_input, training=False)

    fig = plt.figure(figsize=(4,4))

    for i in range(predictions.shape[0]):
        plt.subplot(4,4,i+1)
        plt.imshow(predicitons[i, :, :, 0] * 127.5 + 127.5, cmap='gist_rainbow')
        plt.axis('off')

    plt.savefig('image_at_epoch_{:04d}.png'.format(epoch))
    plt.show()
    
        
train(normalizedData, epochs)

我在这里看到了关于这个值错误的这个问题的不同变体,从我收集的信息来看,顺序层正在输入一个列表而不是一个元组?

感谢您的宝贵时间和您能提供的任何帮助。

【问题讨论】:

    标签: python machine-learning keras tensorflow2.0 dcgan


    【解决方案1】:

    错误是告诉你你输入到鉴别器的形状是[<tf.Tensor 'images:0' shape=(256, 28, 28, 3) dtype=float32>, <tf.Tensor 'images_1:0' shape=(256,) dtype=int32>],但是你定义的鉴别器有input_shape=[28, 28, 1]

    检查您在real_output = discriminator(images, training=True) 行输入鉴别器的images,确保images 与鉴别器的输入形状具有相同的形状,例如(256、28、28、3)

    【讨论】:

      【解决方案2】:

      我在 GAN 教程teasorflow doc https://www.tensorflow.org/tutorials/generative/dcgan 中遇到了同样的问题,请使用 tf.reshape 来重塑日期集

      discriminator(tf.reshape(images, (1, 28, 28, 1)), training=True)
      

      它对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-14
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 2018-08-23
        • 2019-07-31
        相关资源
        最近更新 更多