阅读(4.8k) 书签 (0)

TensorFlow定义张量连接到CheckNumericsOp

2018-09-07 13:51 更新

#版权所有2015 TensorFlow作者.版权所有.

#根据Apache许可证2.0版(“许可证”)许可;

#你不能使用这个文件,除非符合许可证.

#您可以获得许可证的副本

#http      ://www.apache.org/licenses/LICENSE-2.0

#除非适用法律要求或书面同意软件

根据许可证分发的#分发在“按原样”基础上,

#无明示或暗示的任何形式的担保或条件.

#查看有关权限的特定语言的许可证

#许可证下的限制.

# =============================================== =============================

“”“将所有的 half, float and double 张量连接到CheckNumericsOp.”“”

from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

from tensorflow.python.framework import dtypes

from tensorflow.python.framework import ops

from tensorflow.python.ops import array_ops

from tensorflow.python.ops import control_flow_ops

def verify_tensor_all_finite(t, msg, name=None):

  """Assert that the tensor does not contain any NaN's or Inf's.

  Args:

    t: Tensor to check.

    msg: Message to log on failure.

    name: A name for this operation (optional).

  Returns:

    Same tensor as `t`.

  """

  with ops.name_scope(name, "VerifyFinite", [t]) as name:

    t = ops.convert_to_tensor(t, name="t")

    with ops.colocate_with(t):

      verify_input = array_ops.check_numerics(t, message=msg)

      out = control_flow_ops.with_dependencies([verify_input], t)

  return out

def add_check_numerics_ops():

  """Connect a `check_numerics` to every floating point tensor.

  `check_numerics` operations themselves are added for each `half`, `float`,

  or `double` tensor in the graph. For all ops in the graph, the

  `check_numerics` op for all of its (`half`, `float`, or `double`) inputs

  is guaranteed to run before the `check_numerics` op on any of its outputs.

  Returns:

    A `group` op depending on all `check_numerics` ops added.

  """

  check_op = []

  # This code relies on the ordering of ops in get_operations().

  # The producer of a tensor always comes before that tensor's consumer in

  # this list. This is true because get_operations() returns ops in the order

  # added, and an op can only be added after its inputs are added.

  for op in ops.get_default_graph().get_operations():

    for output in op.outputs:

      if output.dtype in [dtypes.float16, dtypes.float32, dtypes.float64]:

        message = op.name + ":" + str(output.value_index)

        with ops.control_dependencies(check_op):

          check_op = [array_ops.check_numerics(output, message=message)]

  return control_flow_ops.group(*check_op)