在Tensorflow中,图形定义块中的哪些语句只是为了构建图形而不是在训练期间执行?例如:
with tf.Graph().as_default():
weightsLayer1 = tf.Variable(tf.truncated_normal([nInputUnits, nOutputUnits]))
weightsLayer1 = tf.div(weightsLayer1, tf.sqrt(tf.to_float(nInputUnits)))
biasesLayer1 = tf.Variable(tf.zeros([nUnitsHiddenLayer1]))
layer1output = tf.tanh(tf.matmul(images_placeholder, weightsLayer1) + biasesLayer1)
直观地说,定义weightsLayer1
和biasesLayer1
的行只是在启动时执行一次,因为它们初始化权重和偏差。但是,我假设行计算layer1output
在每个训练步骤执行,因为layer1output
在下游用于计算损失,优化程序将其最小化。那么,Tensorflow在训练期间如何知道只执行最后一行而不是之前的行(这会重新初始化权重和偏差)?
答案 0 :(得分:2)
您作为用户实际上告诉 tensorflow要运行哪些操作。在训练期间,您通常会告诉tensorflow执行优化程序提供的操作。这看起来像这样:
opt = tf.train.GradientDescentOptimizer(0.01)
train_step = opt.minimize(loss) #
for i in range(100):
sess.run(train_step, feed_dict=...)
调用opt.minimize
将计算图添加到梯度w.r.t.可训练变量以及使用渐变更新变量的操作。 train_step
实际上是使用tf.group
分组的这些更新操作。如果您(用户)运行train_step
,tensorflow会计算出为执行这些所需操作而需要运行的计算图的哪些部分。
同样,如果您执行类似sess.run(fetches=loss, feed_dict=...)
的操作,则要求tensorflow执行图表中计算loss
所需的所有操作。
最后,weightsLayer1 = tf.Variable(tf.truncated_normal([nInputUnits, nOutputUnits]))
中的初始化操作通常由sess.run(tf.initialize_all_variables())
运行。
编辑:重新阅读你的问题之后,我想更清楚一个方面。您提供的图形定义代码实际上不执行任何操作。当且仅当您启动会话并请求执行图形的某些部分时,才会执行Tensorflow操作。如上所述,这包括初始化操作。