我试图建立一个生成对抗网络。我在互联网上阅读了一些教程,一切都很顺利。为了使教程中的其中一个适应我正在处理的特定问题,我编写了以下代码:
# Define the generator model
def make_generator_model():
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(16, use_bias=False, input_shape=(4,)))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.LeakyReLU())
model.add(tf.keras.layers.Dense(8, use_bias=False))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.LeakyReLU())
model.add(tf.keras.layers.Dense(4, use_bias=False, activation='sigmoid'))
return model
对于判别器模型:
# Define the discriminator model
def make_discriminator_model():
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(8, use_bias=False, input_shape=(8,)))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.LeakyReLU())
model.add(tf.keras.layers.Dense(4, use_bias=False))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.LeakyReLU())
model.add(tf.keras.layers.Dense(1, use_bias=False, activation='sigmoid'))
return model
GAN模型:
# Define the CGAN model
def make_cgan_model(generator, discriminator):
z = tf.keras.layers.Input(shape=(4,))
c = tf.keras.layers.Input(shape=(4,))
x = generator(tf.keras.layers.concatenate([z, c]))
discriminator.trainable = False
validity = discriminator(tf.keras.layers.concatenate([x, c]))
return tf.keras.Model(inputs=[z, c], outputs=validity)
# Define the CGAN components
generator = make_generator_model()
discriminator = make_discriminator_model()
cgan = make_cgan_model(generator, discriminator)
想法是将鉴别器与生成器联系起来,因为最后的输出是第一个的输入。
一切似乎都正常,直到我运行最后一行,我将在这里重复错误:
...: cgan = make_cgan_model(generator, discriminator)
WARNING:tensorflow:Model was constructed with shape (None, 4) for input KerasTensor
(type_spec=TensorSpec(shape=(None, 4), dtype=tf.float32,
name='dense_12_input'), name='dense_12_input',
description="created by layer 'dense_12_input'"), but it was called
on an input with incompatible shape (None, 8).
ValueError Traceback (most recent call last)
<ipython-input-24-22e1d0bf219e> in <module>
31 generator = make_generator_model()
32 discriminator = make_discriminator_model()
---> 33 cgan = make_cgan_model(generator, discriminator)
<ipython-input-24-22e1d0bf219e> in make_cgan_model(generator, discriminator)
3 z = tf.keras.layers.Input(shape=(4,))
4 c = tf.keras.layers.Input(shape=(4,))
----> 5 x = generator(tf.keras.layers.concatenate([z, c]))
6
7 discriminator.trainable = False
~/.virtualenvs/cgan_tf/lib/python3.10/site-packages/keras/utils/traceback_utils.py in error_handler(*args, **kwargs)
68 # To get the full stack trace, call:
69 # `tf.debugging.disable_traceback_filtering()`
---> 70 raise e.with_traceback(filtered_tb) from None
71 finally:
72 del filtered_tb
~/.virtualenvs/cgan_tf/lib/python3.10/site-packages/keras/engine/input_spec.py in assert_input_compatibility(input_spec, inputs, layer_name)
275 None,
276 }:
--> 277 raise ValueError(
278 f'Input {input_index} of layer "{layer_name}" is '
279 f"incompatible with the layer: expected axis {axis} "
ValueError: Exception encountered when calling layer "sequential_4" (type Sequential).
Input 0 of layer "dense_12" is incompatible with the layer: expected axis -1 of input shape to have value 4, but received input with shape (None, 8)
Call arguments received by layer "sequential_4" (type Sequential):
• inputs=tf.Tensor(shape=(None, 8), dtype=float32)
• training=None
• mask=None
我试图找到一些关于这个的参考资料或解释,但我找不到。我不知道这意味着什么,所以任何关于我如何解决这个问题的澄清和指导将不胜感激!!!