我正在按照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数组的代码转换的某个地方,但是我对代码应该在不同的地方迷失了。