Tensorflow:值分配操作的优先级

时间:2017-06-28 18:11:26

标签: python machine-learning tensorflow deep-learning

我试着更深入地了解Tensorflow计算图的运算方式。假设我们有以下代码:

A = tf.truncated_normal(shape=(1, ), stddev=0.1)
B = tf.Variable([0.3], dtype=tf.float32)
C = A * B
grads = tf.gradients(C, [A, B])
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

for i in range(1000):
    results = sess.run([C, grads], {A: [2], B:[5]})

我得到的结果是10,渐变5用于A,2用于B,如预期的那样。我想要确定的是,当我们像对A和B那样为张量提供值时,计算图中定义的默认值生成机制会被覆盖,是吗?

例如,这里,每当我们在for循环中运行sess.run行时,不会为A生成正常的随机值,并且它会被2覆盖,0.3会被替换为5。在这种情况下,计算图如何表现?

对于一般情况,我的以下理解是正确的:每次调用sess.run时,用于计算获取列表中的值所需的节点都是通过拓扑排序确定的,并且所有的张量都会被覆盖的值覆盖。 feed_dict参数,打破它们对计算图的其余部分的依赖性。 (例如,如果张量A等待要评估的B值,并且如果我们在feed_dict中向A注入一个值,则A对B的依赖性被打破,我相信这在计算图中反映为好吧,不知何故)。然后,根据计算图的最终形式,执行前向和后向计算。

1 个答案:

答案 0 :(得分:2)

我认为只需要进行两次小修正:

  1. 而不是做两次传递 - 首先确定要执行的最小图形,然后“打破”它可以在一次传递中完成 - 一个查找执行sess.run操作所需的最小图形给出饲料字典中的内容。换句话说,每当你发现新节点时(通过op的依赖向后移动),你检查它是否在feed_dict中提供,如果它是真的 - 你假设这是一个给定的叶子节点。

  2. 在TF中没有“反向计算”这样的东西,一切都是正向计算。 tf.gradients(或最小化)调用只是构造一个前向图,它在功能上等同于向后传递期间许多其他库中会发生的情况。虽然TF中没有严格的前向/后向分离 - 你可以随意破解,混合并随意做任何你想做的事情 - 最后这些只是相互依赖的节点,一个方向数据流。