自定义列步骤的张量输入错误?

2024-04-26 08:03:16 发布

您现在位置:Python中文网/ 问答频道 /正文

按照教程on the tensorflow website,我正在一个GAN设置中训练两个网络。我的问题出现在尝试使用不同的训练数据时,以及尝试分批训练时。你知道吗

我感兴趣的数据是13x1浮点数数组,通过将数据复制到生成器的样本输出中,这些浮点数已经转换为(1,13)张量。下面的代码适用于1批数据,但只要我尝试在更大的数据批上进行训练,它就会失败。你知道吗

def make_generator_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(128, activation='relu', input_shape=(100,)))
    model.add(layers.LeakyReLU())
    model.add(layers.Dense(100, activation='relu'))
    model.add(layers.Dense(13, activation='relu'))
    return model

generator = make_generator_model()

def make_discriminator_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(128, activation='relu', input_shape=(13,)))
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dense(1, activation='sigmoid'))
    return model

generator = make_generator_model()
discriminator = make_discriminator_model()

cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)

def discriminator_loss(real_output, fake_output):
    real_loss = cross_entropy(tf.ones_like(real_output), real_output)
    fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)
    return real_loss + fake_loss

def generator_loss(fake_output):
    return cross_entropy(tf.ones_like(fake_output), fake_output)

generator_optimizer = tf.keras.optimizers.Adam(1e-4)
discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)

mb_size = 512

@tf.function
def train_step(inp):
    noise = tf.random.normal([mb_size, noise_dim])
    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
        generated_names = generator(noise, training=True)
        print(generated_names)
        real_output = discriminator(inp, training=True)
        fake_output = discriminator(generated_names, 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))

此函数在mb_size=1时起作用,但当我将其提高时(例如,如上所述,提高到512),就会出现以下错误:

Traceback (most recent call last):
  File "gan.py", line 137, in <module>
    train(data, epochs)
  File "gan.py", line 123, in train
    train_step(mb)
  File "/home/drv/.local/lib/python2.7/site-packages/tensorflow/python/eager/def_function.py", line 414, in __call__
    self._initialize(args, kwds, add_initializers_to=initializer_map)
  File "/home/drv/.local/lib/python2.7/site-packages/tensorflow/python/eager/def_function.py", line 357, in _initialize
    *args, **kwds))
  File "/home/drv/.local/lib/python2.7/site-packages/tensorflow/python/eager/function.py", line 1349, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "/home/drv/.local/lib/python2.7/site-packages/tensorflow/python/eager/function.py", line 1652, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "/home/drv/.local/lib/python2.7/site-packages/tensorflow/python/eager/function.py", line 1545, in _create_graph_function
    capture_by_value=self._capture_by_value),
  File "/home/drv/.local/lib/python2.7/site-packages/tensorflow/python/framework/func_graph.py", line 715, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "/home/drv/.local/lib/python2.7/site-packages/tensorflow/python/eager/def_function.py", line 307, in wrapped_fn
    return weak_wrapped_fn().__wrapped__(*args, **kwds)
  File "/home/drv/.local/lib/python2.7/site-packages/tensorflow/python/framework/func_graph.py", line 705, in wrapper
    raise e.ag_error_metadata.to_exception(type(e))
ValueError: in converted code:

    gan.py:109 train_step *
        real_output = discriminator(inp, training=True)
    /home/drv/.local/lib/python2.7/site-packages/tensorflow/python/keras/engine/base_layer.py:586 __call__
        self.name)
    /home/drv/.local/lib/python2.7/site-packages/tensorflow/python/keras/engine/input_spec.py:101 assert_input_compatibility
        ' input tensors. Inputs received: ' + str(inputs))

    ValueError: Layer sequential_1 expects 1 inputs, but it received 512 input tensors. Inputs received: [<tf.Tensor 'inp:0' shape=(1, 13) dtype=float32>, ..., <tf.Tensor 'inp_511:0' shape=(1, 13) dtype=float32>]

我相信问题出在我将用于图像数组的代码转换成13x1数组的过程中,但我不知道代码应该在哪里不同。你知道吗


Tags: inpyhomeoutputmodeltftensorflowline