我在学习使用Tensorflow进行MNIST教程,但在教程的一个点上卡住了。
以下是提供的代码:
from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tfmnist = 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”(偏置)是如何变化的?在每个批次中,它们都被初始化为零,但之后呢?我完全看不出代码中它们将如何变化?
非常感谢您的帮助!
回答:
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更新变量的值。