首页 文章

在梯度值张量流上停止条件

提问于
浏览
3

我想基于损失函数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()以获得渐变的输出(除了我需要的所有其他东西) . 我甚至不确定这是否是正确的方法,或者我应该采取不同的方式 . 我做了一些尝试,但每次都失败了 . 希望有人有一些提示 . 先感谢您!

编辑:英语更正

编辑2:回答 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)

谁能证实这一点?

1 回答

  • 2

    您的行 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
    

相关问题