【问题标题】:stopping condition on gradient value tensorflow梯度值张量流的停止条件
【发布时间】:2016-06-29 12:07:59
【问题描述】:

我想根据损失函数 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)

谁能证实这一点?

【问题讨论】:

    标签: python machine-learning neural-network tensorflow


    【解决方案1】:

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

    另外,我想您想使用梯度的 norm 制定停止标准(梯度本身是一个多维量)。因此,您要做的是在每次执行图形时获取梯度的范数。为此,您必须做两件事。 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)
    

    你有你的梯度规范。

    Ad 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
    

    【讨论】:

    • 对@AndreaPavone 的回答有什么想法吗?
    • 这正是我想做的。不过,我不确定如何对所有梯度进行规范和求和。由于我的 CNN 中有不同的层和不同形状的不同权重,如果我按照您的建议进行操作,我会在 add_n() 操作中出错(因为我试图将不同形状的矩阵相加)。已编辑问题中的更多详细信息。谢谢!
    • 哦,我对 tensorflow 函数名称感到困惑。我想做的是grad_norms = [tf.nn.l2_loss(g) for g, v in grads_and_vars]。我最初的答案使用了一个函数tf.nn.l2_norm,它不存在,我确实不的意思是tf.nn.l2_normalize。函数tf.nn.l2_loss 采用向量的平方 L2 范数,因此无论该张量的维度如何,都会产生一个标量。然后可以将这些标量加在一起以计算整体梯度的 L2 范数。 (在答案中更正了。)
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多