我是张量流和神经网络的新手。我想了解的是,执行“梯度下降”功能后如何更新权重?示例代码如下。
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的工作。
答案 0 :(得分:2)
看看Tensorflow official website中的以下图片,它解释了有关Graph和Session的概念:
根据文档:
运行“ session.run()”时,变量权重和偏差 将被更新。
实际上,它们的计算值没有更新。例如,看下面的例子:
a = tf.Variable(2)
with tf.Session() as sess:
sess.run(a.initializer)
print(sess.run(a))
在此示例中,不会进行任何更新。
再次查看上面的图片,正如您在前进时所看到的那样,我们了解需要更新哪些参数,因此,向后看,参数会根据损耗SGD optimizer
进行更新。
答案 1 :(得分:1)
最初,weights
和biases
使用随机值进行初始化。运行session.run([...])
时,它将评估optimizer
,loss
和train_prediction
以及这三个变量可能依赖的所有变量。
例如,optimizer
取决于loss
,loss
取决于train_labels
和logits
,logits
取决于weights
和{ {1}},依此类推...
当到达末尾(计算所有变量)时,它将根据biases
算法更新weights
和biases
(要了解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(...)
在每次迭代中更新weights
和biases
。
Tensorflow将更新所有使用loss
初始化的变量。