尽管目前似乎很流行,但你可能想根据其全局范数剪切整个梯度:
optimizer = tf.train.AdamOptimizer(1e-3)
gradients, variables = zip(*optimizer.compute_gradients(loss))
gradients, _ = tf.clip_by_global_norm(gradients, 5.0)
optimize = optimizer.apply_gradients(zip(gradients, variables))
可以分别剪裁每个梯度矩阵来改变它们的相对比例:
optimizer = tf.train.AdamOptimizer(1e-3)
gradients, variables = zip(*optimizer.compute_gradients(loss))
gradients = [
None if gradient is None else tf.clip_by_norm(gradient, 5.0)
for gradient in gradients]
optimize = optimizer.apply_gradients(zip(gradients, variables))
在 TensorFlow 2 中,一个 tape 计算梯度,优化器来自 Keras,我们不需要存储更新操作因为它会自动运行而无需将其传递给会话:
optimizer = tf.keras.optimizers.Adam(1e-3)
# ...
with tf.GradientTape() as tape:
loss = ...
variables = ...
gradients = tape.gradient(loss, variables)
gradients, _ = tf.clip_by_global_norm(gradients, 5.0)
optimizer.apply_gradients(zip(gradients, variables))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
,然后通过optimizer.run()
来运行一次迭代,但是在这种情况下使用optimizer.run()
似乎无法正常工作? 答:Styrke,感谢您的发布。您知道下一步实际运行优化器的步骤吗?通常情况下,您可以通过以下方式实例化优化器:optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
,然后运行一次迭代的方法是sess.run(optimizer)
,但是在这种情况下使用optimizer.run()
似乎不起作用? - applecideroptimizer.apply_gradients(capped_gvs)
需要被赋值给某个变量,比如x = optimizer.apply_gradients(capped_gvs)
,然后在会话中你可以这样进行训练:x.run(...)
。 - applecidertf.clip_by_global_norm
,正如@danijar所建议的那样。 - gdelab