TensorFlow中梯度下降后权重的更新

时间:2018-08-28 05:23:51

标签: python tensorflow neural-network

我是张量流和神经网络的新手。我想了解的是,执行“梯度下降”功能后如何更新权重?示例代码如下。

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”具有计数值的情况下进行更新,还是只是另一组“ truncated_normal”值?

如果按如下所示应用正则化,

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

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

2 个答案:

答案 0 :(得分:2)

看看Tensorflow official website中的以下图片,它解释了有关Graph和Session的概念:

enter image description here

根据文档:

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

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

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

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

在此示例中,不会进行任何更新。

再次查看上面的图片,正如您在前进时所看到的那样,我们了解需要更新哪些参数,因此,向后看,参数会根据损耗SGD optimizer进行更新。

答案 1 :(得分:1)

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

例如,optimizer取决于lossloss取决于train_labelslogitslogits取决于weights和{ {1}},依此类推...

当到达末尾(计算所有变量)时,它将根据biases算法更新weightsbiases(要了解tensorflow的工作方式,您将首先需要了解梯度下降算法。请查看此link)。它称为“正在完成1 gradient descent”。在您的情况下,您仅使用了1个epoch,因此只有一遍。准确性也不会那么好。要进一步优化它,请按以下方式使用它:

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]) 将运行100次,并根据session.run(...)在每次迭代中更新weightsbiases

Tensorflow将更新所有使用loss初始化的变量。