TensorFlow MNIST(权重和偏置变量)

3

我正在学习如何使用MNIST教程来使用Tensorflow,但是我在教程的某一点上遇到了困难。

这里提供的代码如下:

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 10])

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
saver = tf.train.Saver()
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

但是我实际上并不太理解变量"W"(权重)和"b"(偏移)在计算过程中是如何改变的?

在每个批次中,它们都被初始化为零,但之后呢?

我完全看不到代码中它们将如何改变。

非常感谢您提前的帮助!

1个回答

11

TensorFlow 变量会在多次run()调用中保持它们的状态。在您的程序中,它们将被初始化为零,然后在训练循环中逐步更新。

改变变量值的代码是由这行代码隐含地创建的:

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

在 TensorFlow 中,tf.train.Optimizer 是一个类,它创建用于更新变量的操作,通常基于某些张量(例如损失)相对于这些变量的梯度。默认情况下,当您调用Optimizer.minimize()时,TensorFlow会创建操作以更新所有变量,这些变量是该张量(在本例中为cross_entropy)所依赖的。

当您调用 sess.run(train_step) 时,这将运行包括这些更新操作的图表,并因此指示 TensorFlow 更新变量的值。


哇,非常感谢!我从今早开始就没明白这个问题!完全卡住了。非常感谢你! - Pusheen_the_dev
1
如果您查看基本优化器类的文档(https://www.tensorflow.org/versions/r0.11/api_docs/python/train.html#Optimizer),您将看到minimize()函数结合了两个操作。它计算权重和偏差的梯度,并将其应用于图中相应的权重和偏差。GradientDescentOptimizer是优化器的子类,实现了基本的SGD算法。 - Mad Wombat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接