gpt4 book ai didi

python - tf 2.0 : RuntimeError: GradientTape. gradient 在非持久化磁带上只能调用一次

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:23 25 4
gpt4 key购买 nike

在 tf 2.0 中的 DC Gan 示例 tensorflow 2.0 guide , 有两个渐变带 。见下文。

@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))

如您所见,有两条渐变带。我想知道使用单个磁带有什么区别并将其更改为以下内容

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

with tf.GradientTape() as 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 = tape.gradient(gen_loss, generator.trainable_variables)
gradients_of_discriminator = 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))

这给了我以下错误:

RuntimeError: GradientTape.gradient can only be called once on non-persistent tapes.

我想知道为什么需要两盘磁带。截至目前,关于 tf2.0 API 的文档还很少。谁能解释或指出正确的文档/教程?

最佳答案

来自documentation GradientTape:

By default, the resources held by a GradientTape are released as soon as GradientTape.gradient() method is called. To compute multiple gradients over the same computation, create a persistent gradient tape. This allows multiple calls to the gradient() method as resources are released when the tape object is garbage collected.

可以使用 with tf.GradientTape(persistent=True) as tape 创建持久渐变,并且可以/应该使用 del tape 手动删除(感谢此 @ zwep,@Crispy13)。

关于python - tf 2.0 : RuntimeError: GradientTape. gradient 在非持久化磁带上只能调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56072634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com