Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以修改现有的TensorFlow计算图?_Python_Tensorflow - Fatal编程技术网

Python 是否可以修改现有的TensorFlow计算图?

Python 是否可以修改现有的TensorFlow计算图?,python,tensorflow,Python,Tensorflow,TensorFlow图通常是从输入到输出逐步建立,然后执行。查看Python代码,操作的输入列表是不可变的,这表明不应该修改输入。这是否意味着无法更新/修改现有图?TensorFlow类是一个仅附加的数据结构,这意味着可以在执行部分图后向图中添加节点,但不能删除或修改现有节点。由于TensorFlow在调用时只执行必要的子图,因此在图中具有冗余节点不会导致执行时间开销(尽管它们将继续消耗内存) 要删除图中的所有节点,可以使用新图创建会话: with tf.Graph().as_default()

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

TensorFlow类是一个仅附加的数据结构,这意味着可以在执行部分图后向图中添加节点,但不能删除或修改现有节点。由于TensorFlow在调用时只执行必要的子图,因此在图中具有冗余节点不会导致执行时间开销(尽管它们将继续消耗内存)

要删除图中的所有节点,可以使用新图创建会话:

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.

是的,
tf.Graph
是以@mrry所说的只附加的方式构建的

但有解决办法


从概念上讲,您可以通过克隆现有的图来修改它,并在此过程中执行所需的修改。从r1.1开始,Tensorflow提供了一个名为
tf.contrib.graph\u editor
的模块,它将上述思想作为一组方便的函数来实现。

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

  • 不能修改现有操作,所有操作都是最终的,不可更改
  • 可以复制op,修改其输入或属性,并将新op添加回图形
  • 必须重新创建依赖于新/复制op的所有下游op。是的,图形的重要部分将被复制,这不是问题
  • 守则:

    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
    

    “尽管它们将继续消耗内存”-当python运行时对会话进行垃圾收集时,该内存是否已释放?变量数据(例如,神经网络的权重)将随会话一起释放,这是内存的大部分所在,但图形定义(实际操作定义,不包含数据)将一直保留图形对象,直到它被释放或图形被重置。只有当您继续附加新的图形操作时,这才成为问题,这通常是一种不好的做法。遵循的一个好规则是,在会话打开后永远不要创建图形操作,如果您这样做,您更有可能没有做错。TF 2.0更改太糟糕了。关于这些方法的文档很差。有没有办法使用tf.函数中的图形对tensorflow 2.3执行相同的操作?