此页面由 Cloud Translation API 翻译。
Switch to English

tf.Graph

TensorFlow 1版 GitHub上查看源代码

甲TensorFlow计算,表示为数据流图。

用在笔记本电脑

使用教程

图表是使用tf.function s到代表函数的计算。每个曲线图中包含了一组tf.Operation对象,其表示计算的单元;和tf.Tensor对象,其表示数据的操作之间流动的单位。

直接使用图形(不推荐)

tf.Graph可以被构造并直接使用,无需一个tf.function ,正如在TensorFlow 1必需的,但是这已被废弃,则建议使用tf.function代替。如果直接使用的曲线图,还需要其它弃用TensorFlow 1类执行图形,诸如tf.compat.v1.Session

其默认图可以与注册tf.Graph.as_default上下文管理。然后,操作将被添加到该图形,而不是被急切地执行。例如:

 g = tf.Graph()
with g.as_default():
  # Define operations and tensors in `g`.
  c = tf.constant(30.0)
  assert c.graph is g
 

tf.compat.v1.get_default_graph()可用于获取默认曲线图。

重要提示:本类不是线程安全的图构造。所有的操作都应该从一个单独的线程来创建,或者必须提供外部同步。除非另有说明,所有的方法不是线程安全的。

一个Graph实例支持由名称标识的“集合”任意数量。为了方便构建大图时,集合可存储相关对象的群体:例如, tf.Variable使用集合(名为tf.GraphKeys.GLOBAL_VARIABLES对于那些图的施工过程中产生的所有变量)。呼叫者可以通过指定一个新的名称来定义额外的集合。

building_function 如果此图显示了一个函数返回true。
collections 返回已知该图的集合名称。
finalized 如果此图已经敲定。
graph_def_versions 该图的GraphDef版本信息。

有关每个版本的含义的详情,请参阅GraphDef

seed 该曲线图的曲线图中,水平的随机种子。
version 返回随着OPS被添加到图中的版本号。

请注意,这是毫无关系的tf.Graph.graph_def_versions

方法

add_to_collection

查看源代码

房屋value与给定集合中的name

需要注意的是集不能套,所以有可能的值添加到集合几次。

ARGS
name 对收缴的关键。该GraphKeys类包含集合许多标准名称。
value 该值添加到集合。

add_to_collections

查看源代码

房屋value中所给予的集合names

需要注意的是集不能套,所以有可能的值添加到集合几次。此功能可以确保在重复names会被忽略,但它不会检查的预先存在的隶属value在任何藏品的names

names可以是任何可迭代的,但如果names是一个字符串,它被视为一个单一的集合名称。

ARGS
names 对于藏品的键添加到。该GraphKeys类包含集合许多标准名称。
value 该值添加到集合。

as_default

查看源代码

返回一个上下文管理器,使这个Graph的默认图形。

如果你想在同一进程中创建多个图表这种方法应该被使用。为了方便起见,全局默认的图形设置,并且所有OP将被添加到该图,如果你不明确创建一个新的图形。

使用此方法与with关键字来指定一个块的范围内创建的OPS应该被添加到该图表。在这种情况下,一旦范围with退出,先前默认的图形再次被设置为默认值。有一个栈,所以它的确定有多个嵌套层次as_default电话。

默认的图形是当前线程的属性。如果您创建一个新的线程,并希望使用默认的图形在该线程,你必须明确地添加with g.as_default():在该线程的功能。

下面的代码示例是等效的:

 # 1. Using Graph.as_default():
g = tf.Graph()
with g.as_default():
  c = tf.constant(5.0)
  assert c.graph is g

# 2. Constructing and making default:
with tf.Graph().as_default() as g:
  c = tf.constant(5.0)
  assert c.graph is g
 

如果急于执行启用此背景下管理器下创建OPS将被添加到图形,而不是急切地执行。

返回
上下文管理者使用该图形作为默认的图形。

as_graph_def

查看源代码

返回序列化GraphDef这个图的表示。

串行化GraphDef可以导入到另一个Graph (使用tf.import_graph_def )或与所使用的C ++会话API

此方法是线程安全的。

ARGS
from_version 可选的。如果设置,返回GraphDef只含有添加到该图,由于其节点version性能有给定值。
add_shapes 如果为真,增加了一个“_output_shapes”列表ATTR与它的每一个输出的推断形状的每个节点。

返回
GraphDef协议缓冲器。

加薪
ValueError 如果graph_def会过大。

as_graph_element

查看源代码

返回对象称为由obj ,作为一个OperationTensor

此功能将验证obj表示该曲线图的一个元素,并且如果它不给出信息的错误消息。

此功能是规范的方式来获得/从会话API在外部参数参考验证允许的类型中的一个的对象。

这种方法可以同时从多个线程调用。

ARGS
obj 一个Tensor ,一个Operation ,或张或操作的名称。也可以是具有任何对象_as_graph_element()返回这些类型中的一个的值的方法。注: _as_graph_element将被称为图形的锁内,因此不能修改图形。
allow_tensor 如果为真, obj可以指Tensor
allow_operation 如果为真, obj可指Operation

返回
TensorOperation相对应的图形obj

加薪
TypeError 如果obj是不是一个类型的,我们支持在尝试转换为类型。
ValueError 如果obj是一个合适的类型,但无效。例如,一个无效的字符串。
KeyError 如果obj是未在图中的对象。

clear_collection

查看源代码

清除集合中的所有值。

ARGS
name 对收缴的关键。该GraphKeys类包含集合许多标准名称。

colocate_with

查看源代码

返回一个上下文管理器指定的运算与colocate。

例如:

 a = tf.Variable([1.0])
with g.colocate_with(a):
  b = tf.constant(1.0)
  c = tf.add(a, b)
 

bc将始终与同一位置a ,无论身在何处a最终放置。

如果opNone那么ignore_existing必须是True和新范围重置所有托管和设备的限制。

ARGS
op 运到colocate用,或所有已创建OPS None
ignore_existing 如果为真,只适用于该运算的托管环境中,而不是在堆栈上应用的所有托管属性。如果opNone ,此值必须为True

加薪
ValueError 如果op是没有,但ignore_existing是假。

产量:

上下文管理器指定用来colocate新创建的OPS运算。

container

查看源代码

返回一个上下文管理器,指定要使用的资源容器。

状态操作,如变量和队列,可保持在设备上它们的状态,以便它们可以被多个进程共享。资源容器是在这些状态操作跟踪字符串名称。这些资源可以被释放或清除tf.Session.reset()

例如:

 with g.container('experiment0'):
  # All stateful Operations constructed in this context will be placed
  # in resource container "experiment0".
  v1 = tf.Variable([1.0])
  v2 = tf.Variable([2.0])
  with g.container("experiment1"):
    # All stateful Operations constructed in this context will be
    # placed in resource container "experiment1".
    v3 = tf.Variable([3.0])
    q1 = tf.queue.FIFOQueue(10, tf.float32)
  # All stateful Operations constructed in this context will be
  # be created in the "experiment0".
  v4 = tf.Variable([4.0])
  q1 = tf.queue.FIFOQueue(20, tf.float32)
  with g.container(""):
    # All stateful Operations constructed in this context will be
    # be placed in the default resource container.
    v5 = tf.Variable([5.0])
    q3 = tf.queue.FIFOQueue(30, tf.float32)

# Resets container "experiment0", after which the state of v1, v2, v4, q1
# will become undefined (such as uninitialized).
tf.Session.reset(target, ["experiment0"])
 

ARGS
container_name 容器名称的字符串。

返回
用于定义状态OPS资源容器上下文的经理,得到的容器名称。

control_dependencies

查看源代码

返回一个上下文管理器指定控制的依赖。

通过使用with关键字指定范围内构建的所有操作都应该有控制的依赖control_inputs 。例如:

 with g.control_dependencies([a, b, c]):
  # `d` and `e` will only run after `a`, `b`, and `c` have executed.
  d = ...
  e = ...
 

在多个电话control_dependencies()可以被嵌套,在这种情况下,一个新的Operation将会对联盟控制的依赖control_inputs从所有激活的上下文。

 with g.control_dependencies([a, b]):
  # Ops constructed here run after `a` and `b`.
  with g.control_dependencies([c, d]):
    # Ops constructed here run after `a`, `b`, `c`, and `d`.
 

你可以通过无以清除控制依赖关系:

 with g.control_dependencies([a, b]):
  # Ops constructed here run after `a` and `b`.
  with g.control_dependencies(None):
    # Ops constructed here run normally, not waiting for either `a` or `b`.
    with g.control_dependencies([c, d]):
      # Ops constructed here run after `c` and `d`, also not waiting
      # for either `a` or `b`.
 
 # WRONG
def my_func(pred, tensor):
  t = tf.matmul(tensor, tensor)
  with tf.control_dependencies([pred]):
    # The matmul op is created outside the context, so no control
    # dependency will be added.
    return t

# RIGHT
def my_func(pred, tensor):
  with tf.control_dependencies([pred]):
    # The matmul op is created in the context, so a control dependency
    # will be added.
    return tf.matmul(tensor, tensor)
 

还要注意的是,虽然根据本范围内创建OPS的执行将触发依赖的执行,根据本范围内创建了OPS可能仍然会从正常tensorflow曲线修剪。例如,在下面的代码段的相关性从未执行:

   loss = model.loss()
  with tf.control_dependencies(dependencies):
    loss = loss + tf.constant(1)  # note: dependencies ignored in the
                                  # backward pass
  return tf.gradients(loss, model.variables)
 

这是因为,评估所述梯度曲线不需要评估所述直传创建的常数(1)的运算。

ARGS
control_inputs 的列表OperationTensor ,其必须在运行在上下文中定义的操作之前执行或计算对象。也可None明确控制的依赖。

返回
上下文管理者指定控制范围内构建的所有操作的依赖关系。

加薪
TypeError 如果control_inputs不是列表OperationTensor的对象。

create_op

查看源代码

创建一个Operation在该图。 (不建议使用参数)

这是创建一个低级别的界面Operation 。大多数程序不会直接调用此方法,而是使用Python运算构造,如tf.constant()其OPS添加到默认图表。

ARGS
op_type Operation类型来创建。这对应于OpDef.name字段定义该操作的原。
inputs 清单Tensor的对象,这将是输入的Operation
dtypes (可选)的列表DType对象,这将是类型的操作产生张量。
input_types (可选)列表DType原来决心是类型的张量的操作消耗的。缺省情况下,使用基本DType中的每个输入的inputs 。该预期参考类型的输入操作都必须指定input_types明确。
name (可选)字符串名称的操作。如果没有指定的基础上,则生成一个名字op_type
attrs (可选)。A字典其中键是属性名称(字符串),值是各自attr的属性NodeDef原,将表示该操作(一个AttrValue原)。
op_def (可选)的OpDef原描述op_type的操作都会有。
compute_shapes (可选)已过时。有没有影响(形状总是计算)。
compute_device (可选。)如果为True,设备功能将被执行,以计算该行动的设备属性。

加薪
TypeError 如果任何输入不是Tensor
ValueError 如果与现有的设备分配托管冲突。

返回
一个Operation对象。

device

查看源代码

返回一个上下文管理器指定默认的设备来使用。

所述device_name_or_function参数可以是一个设备的名称字符串,设备功能,或无:

  • 如果它是一个设备名称字符串,在此上下文中构建的所有操作将被分配给该设备具有该名称,除非由一个嵌套重写device()上下文。
  • 如果它是一个函数,它会被当作从操作对象设备名称字符串的函数,每次创建一个新的运行时调用。操作将被分配给设备与返回的名称。
  • 如果是无,所有device()从包封上下文调用将被忽略。

有关设备名称字符串的有效语法信息,请参阅文档DeviceNameUtils

例如:

 with g.device('/device:GPU:0'):
  # All operations constructed in this context will be placed
  # on GPU 0.
  with g.device(None):
    # All operations constructed in this context will have no
    # assigned device.

# Defines a function from `Operation` to device string.
def matmul_on_gpu(n):
  if n.type == "MatMul":
    return "/device:GPU:0"
  else:
    return "/cpu:0"

with g.device(matmul_on_gpu):
  # All operations of type "MatMul" constructed in this context
  # will be placed on GPU 0; all other operations will be placed
  # on CPU 0.
 

ARGS
device_name_or_function 在上下文中使用的设备名称或功能。

产量:

上下文管理者指定默认的设备来使用新创建的欢声笑语。

加薪
RuntimeError 如果设备范围不正确嵌套。

finalize

查看源代码

完成对此图表,使其成为只读。

打完电话后g.finalize()没有新的操作可以被添加到g 。这种方法被用来确保任何操作,使用时加入的曲线图,当它在多个线程之间共享,例如tf.compat.v1.train.QueueRunner

get_all_collection_keys

查看源代码

返回此图中使用集合的列表。

get_collection

查看源代码

返回值与给定集合中的列表name

这是从不同的get_collection_ref()如果它在它每次被调用时返回一个新的列表中存在,它总是返回实际收藏列表。

ARGS
name 对收缴的关键。例如, GraphKeys类包含了许多收藏标准名称。
scope (可选)的字符串。如果提供,结果列表进行过滤,只包括项,它们的name属性匹配scope使用re.match 。没有一个项目name ,如果一个范围提供永远不会返回属性。的选择re.match意味着一个scope没有特殊的前缀令牌过滤器。

返回
值与给定的集合中的列表name ,如果没有价值已经被添加到收藏列表为空。该列表包含在它们被收集在该命令的值。

get_collection_ref

查看源代码

返回值与给定集合中的列表name

如果集合存在,这将返回列表本身,它可以就地修改来更改集合。如果集合不存在,则创建一个空列表,返回列表。

这是从不同的get_collection()如果它存在,从来没有创建一个空的集合,它总是返回集合列表的副本。

ARGS
name 对收缴的关键。例如, GraphKeys类包含了许多收藏标准名称。

返回
值与给定的集合中的列表name ,如果没有价值已经被添加到收藏列表为空。

get_name_scope

查看源代码

返回当前名称范围。

例如:

 with tf.name_scope('scope1'):
  with tf.name_scope('scope2'):
    print(tf.compat.v1.get_default_graph().get_name_scope())
 

将打印字符串scope1/scope2

返回
表示当前名称范围的字符串。

get_operation_by_name

查看源代码

返回Operation与给定的name

这种方法可以同时从多个线程调用。

ARGS
name 该名Operation返回。

返回
Operation与给定name

加薪
TypeError 如果name不是一个字符串。
KeyError 如果name不对应的操作在这个图。

get_operations

查看源代码

返回在图形操作的列表。

您可以修改的地方,列表中的操作,但修改,如插入/删除具有已知图形操作的列表没有影响。

这种方法可以同时从多个线程调用。

返回
操作的列表。

get_tensor_by_name

查看源代码

返回Tensor与给定的name

这种方法可以同时从多个线程调用。

ARGS
name 该名Tensor返回。

返回
Tensor与给定name

加薪
TypeError 如果name不是一个字符串。
KeyError 如果name不对应于该图的张量。

gradient_override_map

查看源代码

实验:用于覆盖梯度功能的上下文管理。

此上下文管理器可以被用于覆盖将上下文的范围内被用于OPS梯度函数。

例如:

 @tf.RegisterGradient("CustomSquare")
def _custom_square_grad(op, grad):
  # ...

with tf.Graph().as_default() as g:
  c = tf.constant(5.0)
  s_1 = tf.square(c)  # Uses the default gradient for tf.square.
  with g.gradient_override_map({"Square": "CustomSquare"}):
    s_2 = tf.square(s_2)  # Uses _custom_square_grad to compute the
                          # gradient of s_2.
 

ARGS
op_type_map 对应的字典运算类型字符串替代运算类型字符串。

返回
要使用的,用于设置替代运算类型A上下文管理器用于在该上下文中创建一个或多个op。

加薪
TypeError 如果op_type_map不是一个字典映射字符串的字符串。

is_feedable

查看源代码

返回True当且仅当tensor是可供给。

is_fetchable

查看源代码

返回True当且仅当tensor_or_op是可提取。

name_scope

查看源代码

返回创建的操作层次名称上下文管理。

曲线图维持名字范围的堆栈。一个with name_scope(...):声明将一个新名称压入堆栈的上下文的生命期。

name参数将被解释如下:

  • 一个字符串(不以“/”结尾)将创建一个新的名称范围,这name被附加到上下文中创建的所有操作的前缀。如果name已经被使用过,它会进行调用唯一self.unique_name(name)
  • 作用域以前从捕获with g.name_scope(...) as scope:语句将作为“绝对”的名称范围,这使得它有可能重新进入现有的作用域处理。
  • 的值None或空字符串将重置当前名称范围顶层(空)名称范围。

例如:

 with tf.Graph().as_default() as g:
  c = tf.constant(5.0, name="c")
  assert c.op.name == "c"
  c_1 = tf.constant(6.0, name="c")
  assert c_1.op.name == "c_1"

  # Creates a scope called "nested"
  with g.name_scope("nested") as scope:
    nested_c = tf.constant(10.0, name="c")
    assert nested_c.op.name == "nested/c"

    # Creates a nested scope called "inner".
    with g.name_scope("inner"):
      nested_inner_c = tf.constant(20.0, name="c")
      assert nested_inner_c.op.name == "nested/inner/c"

    # Create a nested scope called "inner_1".
    with g.name_scope("inner"):
      nested_inner_1_c = tf.constant(30.0, name="c")
      assert nested_inner_1_c.op.name == "nested/inner_1/c"

      # Treats `scope` as an absolute name scope, and
      # switches to the "nested/" scope.
      with g.name_scope(scope):
        nested_d = tf.constant(40.0, name="d")
        assert nested_d.op.name == "nested/d"

        with g.name_scope(""):
          e = tf.constant(50.0, name="e")
          assert e.op.name == "e"
 

范围本身的名称可以通过捕获with g.name_scope(...) as scope: ,其存储在变量中的范围的名称scope 。此值可用于命名表示在一个范围执行所述OPS的整体结果的操作。例如:

 inputs = tf.constant(...)
with g.name_scope('my_layer') as scope:
  weights = tf.Variable(..., name="weights")
  biases = tf.Variable(..., name="biases")
  affine = tf.matmul(inputs, weights) + biases
  output = tf.nn.relu(affine, name=scope)
 
 [A-Za-z0-9.][A-Za-z0-9_.\-/]* (for scopes at the root)
[A-Za-z0-9_.\-/]* (for other scopes)
 

ARGS
name 一种范围的名称。

返回
能安装上下文管理器name作为一个新的名称范围。

加薪
ValueError 如果name是不是一个有效的范围名称,根据上述规则。

prevent_feeding

查看源代码

标志着给出tensor在该图unfeedable。

prevent_fetching

查看源代码

标记给定的op ,如该曲线图unfetchable。

switch_to_thread_local

查看源代码

制作设备,主机托管和依赖栈线程本地。

设备,主机托管和依赖堆都不是线程局部的,默认情况下。如果多个线程访问它们,则状态是共享的。这意味着,一个线程可能会影响到另一个线程的行为。

这种方法被调用后,堆栈成为本地线程。如果多个线程访问它们,则状态不共享。每个线程使用其自身的价值;线程没有通过突变这样的堆栈影响到其他线程。

每一个线程的堆栈的初始值设置为堆的当前值时switch_to_thread_local()首次调用。

unique_name

查看源代码

返回的一个独特的操作名称name

unique_name用于生成结构化的名,由分离"/" ,以帮助调试的曲线图时识别的操作。操作名称显示在由TensorFlow运行报告的错误消息,并且在各种可视化工具,如TensorBoard。

如果mark_as_used设置为True ,这是默认的,创建一个新的唯一名称和标记为使用。如果它被设置为False ,而不返回唯一的名称作为实际使用被标记。这是有用的,当主叫用户只是想知道要创建的名称将是什么。

ARGS
name 一个操作的名称。
mark_as_used 无论是为纪念这名被使用。

返回
的字符串将被传递给create_op()将被用于命名所创建的操作。