是否可以修改现有的TensorFlow计算图?
python
tensorflow
5
0

TensorFlow图通常从输入到输出逐渐构建,然后执行。查看Python代码,操作的输入列表是不可变的,这表明不应修改输入。这是否意味着无法更新/修改现有图形?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

除了@zaxily和@mrry所说的以外,我还想提供一个示例,说明如何实际对图形进行修改。简而言之:

  1. 一个无法修改现有操作,所有操作都是最终操作且不可更改
  2. 可以复制一个操作,修改其输入或属性,然后将新操作添加回图形中
  3. 必须重新创建所有依赖于新的/复制的操作的下游操作。是的,该图的重要部分将被复制复制,这不是问题

编码:

import tensorflow
import copy
import tensorflow.contrib.graph_editor as ge
from copy import deepcopy

a = tf.constant(1)
b = tf.constant(2)
c = a+b

def modify(t): 
    # illustrate operation copy&modification
    new_t = deepcopy(t.op.node_def)
    new_t.name = new_t.name+"_but_awesome"
    new_t = tf.Operation(new_t, tf.get_default_graph())
    # we got a tensor, let's return a tensor
    return new_t.outputs[0]

def update_existing(target, updated):
    # illustrate how to use new op
    related_ops = ge.get_backward_walk_ops(target, stop_at_ts=updated.keys(), inclusive=True)
    new_ops, mapping = ge.copy_with_input_replacements(related_ops, updated)
    new_op = mapping._transformed_ops[target.op]
    return new_op.outputs[0]

new_a = modify(a)
new_b = modify(b)
injection = new_a+39 # illustrate how to add another op to the graph
new_c = update_existing(c, {a:injection, b:new_b})

with tf.Session():
    print(c.eval()) # -> 3
    print(new_c.eval()) # -> 42
收藏
评论

TensorFlow tf.Graph类是仅追加的数据结构,这意味着您可以在执行图的一部分后将节点添加到图,但不能删除或修改现有节点。由于TensorFlow在您调用Session.run()时仅执行必要的子图,因此在图中具有冗余节点不会增加执行时间成本(尽管它们将继续消耗内存)。

要删除图中的所有节点,可以创建一个带有新图的会话:

with tf.Graph().as_default():  # Create a new graph, and make it the default.
  with tf.Session() as sess:  # `sess` will use the new, currently empty, graph.
    # Build graph and execute nodes in here.
收藏
评论

是的,正如@mrry所说, tf.Graph是按仅追加方式构建的。

但是有一种解决方法

从概念上讲,您可以通过克隆现有图形来进行修改,并在此过程中执行所需的修改。从r1.1开始,Tensorflow提供了一个名为tf.contrib.graph_editor的模块,该模块将上述思想实现为一组便捷功能。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号