Tensorflow:值赋值操作的优先级

我试图更深入地了解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]})

如预期的那样,我得到A和B的结果10和梯度5。 我想确定的是,当我们像A和B那样向张量输入值时,它们在计算图中定义的默认值生成机制将被覆盖,是吗?

例如,在这里,没有为A生成正常的随机值,只要我们在for循环中运行sess.run行,它就会被2所覆盖,而0.3被B替换为5。 计算图在这种情况下如何表现正确?

对于一般情况,我的理解是否正确:每次我们调用sess.run ,用于计算提取列表中值的所需节点由拓扑排序确定,所有张量将被feed_dict参数中提供的值覆盖,从而打破它们依赖于其余的计算图。 (例如,如果张量A等待B的值被评估,并且如果我们在feed_dict中给A注入一个值,那么A对B的依赖就会被破坏,我相信这也反映在计算图中)。 然后,根据计算图的最终形式,执行向前和向后计算。


我相信只需要两个小小的更正:

  • 而不是进行两遍 - 首先确定要执行的最小图,然后“分解”它可以一次完成 - 找一个执行sess.run操作所需的最小图,并给出 feed字典中的内容。 换句话说,每当你发现新的节点(当你通过你的op的依赖回退时),你检查它是否在feed_dict中提供,如果它是真的 - 你认为这是给定的,叶节点。

  • 在TF中没有“向后计算”这样的东西,一切都是正向计算。 tf.gradients(或最小化)调用简单地构造一个前向图 ,这个函数的功能等同于在后向传递期间许多其他库中会发生的情况。 虽然TF中没有严格的向前/向后分离,并且您可以随意使用图表进行混乱和做任何事情 - 最终,这些只是相互依赖的节点,只有一个方向的数据流。

  • 链接地址: http://www.djcxy.com/p/32107.html

    上一篇: Tensorflow: The priority of value assigning operations

    下一篇: Confused on how tensorflow feed