如何在 TensorFlow 2.0 中 运行 apply_gradients 多个 trainable_weights
how to run apply_gradients for more than one trainable_weights in TensorFlow 2.0
我已经使用 TensorFlow2.0 构建了一个类似深度学习模型的编码器-解码器,出于某种原因,编码器和解码器是两个单独的模型,我想用 [=30= 优化这两个模型]() 功能。 TensorFlow document 没有为这个案例提供太多信息。它表明 grads_and_vars 应该是 "List of (gradient, variable) pairs".我尝试了两种方法,如下所示:
第一种方法:
optimizer.apply_gradients(zip(grads, self._encoder.trainable_weights, self._decoder.trainable_weights))
第二种方法:
optimizer.apply_gradients([zip(grads, self._encoder.trainable_weights), zip(grads, self._decoder.trainable_weights)])
而且都不起作用。正确的做法是什么?
您可以尝试像下面代码这样的训练循环,参考自DCGAN tutorial。
with tf.GradientTape() as enc_tape, tf.GradientTape() as dec_tape:
feature_space = encoder(images, training=True)
recovered_image = decoder(feature_space, training=True)
#Some custom loss function...
loss = tf.keras.losses.MSE(recovered_image, images)
gradients_of_encoder = enc_tape.gradient(loss , encoder.trainable_variables)
gradients_of_decoder = dec_tape.gradient(loss, decoder.trainable_variables)
enc_optimizer.apply_gradients(zip(gradients_of_encoder , encoder.trainable_variables))
dec_optimizer.apply_gradients(zip(gradients_of_decoder , decoder.trainable_variables))
我已经使用 TensorFlow2.0 构建了一个类似深度学习模型的编码器-解码器,出于某种原因,编码器和解码器是两个单独的模型,我想用 [=30= 优化这两个模型]() 功能。 TensorFlow document 没有为这个案例提供太多信息。它表明 grads_and_vars 应该是 "List of (gradient, variable) pairs".我尝试了两种方法,如下所示:
第一种方法:
optimizer.apply_gradients(zip(grads, self._encoder.trainable_weights, self._decoder.trainable_weights))
第二种方法:
optimizer.apply_gradients([zip(grads, self._encoder.trainable_weights), zip(grads, self._decoder.trainable_weights)])
而且都不起作用。正确的做法是什么?
您可以尝试像下面代码这样的训练循环,参考自DCGAN tutorial。
with tf.GradientTape() as enc_tape, tf.GradientTape() as dec_tape:
feature_space = encoder(images, training=True)
recovered_image = decoder(feature_space, training=True)
#Some custom loss function...
loss = tf.keras.losses.MSE(recovered_image, images)
gradients_of_encoder = enc_tape.gradient(loss , encoder.trainable_variables)
gradients_of_decoder = dec_tape.gradient(loss, decoder.trainable_variables)
enc_optimizer.apply_gradients(zip(gradients_of_encoder , encoder.trainable_variables))
dec_optimizer.apply_gradients(zip(gradients_of_decoder , decoder.trainable_variables))