gpt4 book ai didi

python - 梯度值 tensorflow 的停止条件

转载 作者:行者123 更新时间:2023-11-28 17:26:58 25 4
gpt4 key购买 nike

我想根据损失函数 w.r.t. 的梯度值实现停止条件。权重。例如,假设我有这样的东西:

optimizer = tf.train.AdamOptimizer()
grads_and_vars = optimizer.compute_gradients(a_loss_function)
train_op = optimizer.apply_gradients(grads_and_vars)

然后我想用这样的东西运行图表:

for step in range(TotSteps):
output = sess.run([input], feed_dict=some_dict)
if(grad_taken_in_some_way < some_treshold):
print("Training finished.")
break

我不确定我应该将什么传递给 sess.run() 以便将梯度作为输出(除了我需要的所有其他东西)。我什至不确定这是否是正确的方法,或者我应该以不同的方式来做。我做了一些尝试,但每次都失败了。希望有人有一些提示。提前致谢!

编辑:英文更正

EDIT2:Iballes 的回答正是我想要做的。不过,我不确定如何对所有梯度进行标准化和求和。由于我的 CNN 中有不同的层和不同形状的不同权重,如果我只是按照您的建议进行操作,我会在 add_n() 操作中遇到错误(因为我试图将具有不同形状的矩阵加在一起)。所以我可能应该做类似的事情:

grad_norms = [tf.nn.l2_normalize(g[0], 0) for g in grads_and_vars]      
grad_norm = [tf.reduce_sum(grads) for grads in grad_norms]
final_grad = tf.reduce_sum(grad_norm)

谁能证实这一点?

最佳答案

你的行 output = sess.run([input], feed_dict=some_dict) 让人觉得你对 sess.run 命令有一点误解。您所说的 [input] 应该是 sess.run 命令要获取的张量列表。因此,它是输出而不是输入。为了解决您的问题,我们假设您正在执行类似 output = sess.run(loss, feed_dict=some_dict) 的操作(以监控训练损失)。

此外,我假设您想使用梯度的范数(梯度本身是一个多维量)来制定您的停止标准。因此,您要做的是在每次执行图形时获取梯度的范数。为此,你必须做两件事。 1)将梯度范数添加到计算图中。 2) 在训练循环中每次调用 sess.run 时获取它。

广告 1) 您已通过

将渐变添加到图形中
optimizer = tf.train.AdamOptimizer()
grads_and_vars = optimizer.compute_gradients(a_loss_function)

现在张量在 grads_and_vars 中保持梯度(图中每个训练变量对应一个)。让我们取每个梯度的范数,然后求和:

grad_norms = [tf.nn.l2_loss(g) for g, v in grads_and_vars]
grad_norm = tf.add_n(grad_norms)

这就是你的梯度范数。

广告 2) 在您的循环中,通过告诉 sess.run 命令获取梯度范数和损失。

for step in range(TotSteps):
l, gn = sess.run([loss, grad_norm], feed_dict=some_dict)
if(gn < some_treshold):
print("Training finished.")
break

关于python - 梯度值 tensorflow 的停止条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38099074/

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