【问题标题】:Update of the weights after Gradient Descent in TensorFlowTensorFlow 中梯度下降后权重的更新
【发布时间】:2018-08-28 05:23:51
【问题描述】:

我是 tensorflow 和神经网络的新手。我试图理解,执行梯度下降函数后如何更新权重?示例代码如下。

with graph.as_default():

    weights = tf.Variable(
    tf.truncated_normal([image_size * image_size, num_labels]))
    biases = tf.Variable(tf.zeros([num_labels]))

    logits = tf.matmul(train_dataset, weights) + biases
    loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=train_labels, logits=logits))
    loss=loss+tf.multiply(beta, nn.l2_loss(weights))

    optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 

with tf.Session(graph=graph) as session:
    tf.global_variables_initializer().run()
    _, l, predictions = session.run([optimizer, loss, train_prediction])

如果我理解正确,当运行“session.run()”时,变量权重和偏差将被更新。它会在“GradientDescentOptimizer”具有计数的任何值的上下文中更新,还是只是另一组“截断正常”值?

如果正则化应用如下,

loss=loss+tf.multiply(beta, nn.l2_loss(weights))

那么,张量流如何知道在正则化权重的上下文中更新权重的正确变量是什么?我没有得到 TF 的工作。

【问题讨论】:

    标签: python tensorflow neural-network


    【解决方案1】:

    看看下面来自Tensorflow official website 的图片,它解释了图表和会话的概念:

    根据文档:

    • 调用 tf.constant() 会创建一个生成值的操作,并将其添加到默认图表中。
    • 调用 tf.matmul(x, y) 创建一个将 tf.Tensor 对象 x 和 y 的值相乘的操作,将其添加到默认图中,并返回一个表示相乘结果的 tf.Tensor
    • 调用 tf.train.Optimizer.minimize 会将运算和张量添加到计算梯度的默认图形中,并返回一个运算,运行时会将这些梯度应用于一组变量。

    运行“session.run()”时,变量权重和偏差 会更新。

    实际上他们的计算值没有更新。例如,看看下面的例子:

    a = tf.Variable(2)
    with tf.Session() as sess:
        sess.run(a.initializer)
        print(sess.run(a))
    

    在此示例中,不会发生更新。

    再看上图,从图中可以看出,当我们往前走的时候,我们明白了哪些参数需要更新,所以往后看,根据损失更新的参数是SGD optimizer

    【讨论】:

      【解决方案2】:

      最初weightsbiases 使用随机值初始化。当您运行 session.run([...]) 时,它将评估 optimizerlosstrain_prediction 以及这三个可能依赖的所有变量。

      例如,optimizer 依赖于 lossloss 依赖于 train_labelslogitslogits 依赖于 weightsbiases 等等......

      当它到达终点时(计算所有变量),它会根据gradient descent算法更新weightsbiases(要了解tensorflow是如何做到的,你需要了解梯度下降算法首先。看看这个link)。它被称为“完成 1 epoch”。在您的情况下,您只使用了 1 个epoch,因此只有一次通过。精度也不会那么好。要进一步优化它,请像下面这样使用它:

      epochs=100

      with tf.Session(graph=graph) as session::
           tf.global_variables_initializer().run()
           for i in range(epochs):
               _, l, predictions = session.run([optimizer, loss, train_prediction])
      

      这样,session.run(...) 将运行 100 次,在每次迭代中根据 loss 更新 weightsbiases

      Tensorflow 将更新所有使用 tf.Variable(). 初始化的变量

      【讨论】:

        猜你喜欢
        • 2022-06-21
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        • 1970-01-01
        • 2016-03-20
        • 2018-08-18
        • 1970-01-01
        • 2022-01-02
        相关资源
        最近更新 更多