Tensorflow:构建图形后执行哪些图形语句?

Tensorflow: Which graph statements are executed after the graph is built?

在 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)

直觉上,我假设定义 weightsLayer1biasesLayer1 的行只在启动时执行一次,因为它们初始化了权重和偏差。但是,我假设在每个训练步骤执行计算 layer1output 的行,因为 layer1output 用于下游计算损失,优化器将其最小化。那么,Tensorflow 如何知道在训练期间只执行最后一行而不执行前面的行(这将重新初始化权重和偏差)?

作为用户,您实际上是在告诉 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()) 完成 运行。

编辑:重新阅读你的问题后,我想更清楚一个方面。您提供的图表 definition 代码实际上没有执行任何操作。当且仅当您启动会话并请求执行部分图形时,才会执行 Tensorflow 操作。如上所述,这包括初始化操作。