Tensorflow运行程序报错 FailedPreconditionError

1 FailedPreconditionError错误现象

在运行tensorflow时出现报错,报错语句如下:

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value Variable
[[Node: Variable/read = _MklIdentity[T=DT_FLOAT, _kernel="MklOp", _device="/job:localhost/replica:0/task:0/device:CPU:0"](Variable, DMT/_0)]]

对报错原因进行直白翻译(信、雅、达精度严重缺失):

条件预处理时失败错误(参看上面的回溯):尝试使用未初始化的值变量。

2 FailedPreconditionError错误浅析

2.1 FailedPreconditionError的浅析

查看错误类源代码:

class FailedPreconditionError(OpError):
  """Operation was rejected because the system is not in a state to execute it.
  This exception is most commonly raised when running an operation
  that reads a @{tf.Variable}
  before it has been initialized.
  @@__init__
  """

  def __init__(self, node_def, op, message):
    """Creates a `FailedPreconditionError`."""
    super(FailedPreconditionError, self).__init__(node_def, op, message, FAILED_PRECONDITION)

注释意思可理解为:

因为系统未处于执行状态,所以操作被拒绝。

在@ {tf.Variable}初始化前运行读取操作时,通常会引发此异常。

2.2 global_variables_initializer的源代码

查看global_variables_initializer函数的源代码

def global_variables_initializer():
  """Returns an Op that initializes global variables.
  This is just a shortcut for `variables_initializer(global_variables())`
  Returns:
    An Op that initializes global variables in the graph.
  """
  if context.executing_eagerly():
    return control_flow_ops.no_op(name="global_variables_initializer")
  return variables_initializer(global_variables())

溯源,查看variable_initializer函数源代码。

def variables_initializer(var_list, name="init"):
  """Returns an Op that initializes a list of variables.
  After you launch the graph in a session, you can run the returned Op to
  initialize all the variables in `var_list`. This Op runs all the
  initializers of the variables in `var_list` in parallel.
  Calling `initialize_variables()` is equivalent to passing the list of
  initializers to `Group()`.
  If `var_list` is empty, however, the function still returns an Op that can
  be run. That Op just has no effect.
  Args:
    var_list: List of `Variable` objects to initialize.
    name: Optional name for the returned operation.
  Returns:
    An Op that run the initializers of all the specified variables.
  """
  if var_list and not context.executing_eagerly():
    return control_flow_ops.group(*[v.initializer for v in var_list], name=name)
  return control_flow_ops.no_op(name=name)

查看global_variables()函数源代码。

def global_variables(scope=None):
  """Returns global variables.
  Global variables are variables that are shared across machines in a
  distributed environment. The `Variable()` constructor or `get_variable()`
  automatically adds new variables to the graph collection
  `GraphKeys.GLOBAL_VARIABLES`.
  This convenience function returns the contents of that collection.
  An alternative to global variables are local variables. See
  @{tf.local_variables}
  Args:
    scope: (Optional.) A string. If supplied, the resulting list is filtered
      to include only items whose `name` attribute matches `scope` using
      `re.match`. Items without a `name` attribute are never returned if a
      scope is supplied. The choice of `re.match` means that a `scope` without
      special tokens filters by prefix.
  Returns:
    A list of `Variable` objects.
  """
  return ops.get_collection(ops.GraphKeys.GLOBAL_VARIABLES, scope)

2.3 全局变量初始化分析

2.3.1 变量

Tensorflow 变量是表示程序处理的共享持久状态的最佳方法。

我们通过tf.Variable类操作变量。tf.Variable表示可通过对其运行操作来改变其值的张量。

与tf.Tensor对象不同,tf.Variable存在于单个tf.Session().run()调用的上下文之外。

在TensorFlow内部,tf.Variable会存储持久性张量。具体operation( op )允许您读取和修改张量的值。这些修改在多个tf.Session()之间是可见的,因此对于一个tf.Variable,多个工作器可以看到相同的值。

2.3.2 变量集合

由于 TensorFlow 程序的未连接部分可能需要创建变量,因此能有一种方式访问所有变量有时十分受用。为此,TensorFlow 提供了集合,它们是张量或其他对象(如 tf.Variable 实例)的命名列表。

默认情况下,每个 tf.Variable 都放置在以下两个集合中:

  • tf.GraphKeys.GLOBAL_VARIABLES - 可以在多台设备间共享的变量,
  • tf.GraphKeys.TRAINABLE_VARIABLES - TensorFlow 将计算其梯度的变量。

如果您不希望变量可训练,可以将其添加到 tf.GraphKeys.LOCAL_VARIABLES 集合中。

2.3.3 初始化变量

变量必须先初始化后才可使用。

如果您在低级别 TensorFlow API 中进行编程(即您在显式创建自己的图和会话),则必须明确初始化变量。tf.contrib.slimtf.estimator.Estimator 和 Keras 等大多数高级框架在训练模型前会自动为您初始化变量。

显式初始化在其他方面很有用。它允许您在从检查点重新加载模型时不用重新运行潜在资源消耗大的初始化器,并允许在分布式设置中共享随机初始化的变量时具有确定性。

要在训练开始前一次性初始化所有可训练变量,请调用 tf.global_variables_initializer()。此函数会返回一个操作,负责初始化 tf.GraphKeys.GLOBAL_VARIABLES 集合中的所有变量。运行此操作会初始化所有变量。例如:

session.run(tf.global_variables_initializer())
# Now all variables are initialized.

如果您确实需要自行初始化变量,则可以运行变量的初始化器操作。例如:

session.run(my_variable.initializer)

您可以查询哪些变量尚未初始化。例如,以下代码会打印所有尚未初始化的变量名称:

print(session.run(tf.report_uninitialized_variables()))

请注意,默认情况下,tf.global_variables_initializer 不会指定变量的初始化顺序。因此,如果变量的初始值取决于另一变量的值,那么很有可能会出现错误。任何时候,如果您在并非所有变量都已初始化的上下文中使用某个变量值(例如在初始化某个变量时使用另一变量的值),最好使用 variable.initialized_value(),而非 variable

v = tf.get_variable("v", shape=(), initializer=tf.zeros_initializer())
w = tf.get_variable("w", initializer=v.initialized_value() + 1)

具体参考 Tensorflow的官方信息 --> 变量 https://www.tensorflow.org/programmers_guide/variables

备注:

在2017年03月02日之前,全局变量初始化函数initialize_all_variables();之后为global_variables_initializer()函数。

参考

处理FailedPreconditionError、该文针对FailedPreconditionError错误函数进行解读

TensorFlow定义错误的异常类型(详细)进入该文直接搜索FailedPreconditionError函数,可以看到源代码段

变量初始化的意义 该文从C/C++程序中的栈和堆上来说存储并采用示例分析证明

具体参考 Tensorflow的官方信息 --> 变量 https://www.tensorflow.org/programmers_guide/variables

tf.global_variables_initializer:https://devdocs.io/tensorflow~python/tf/global_variables_initializer

tensorflow/tensorflow/python/ops/variables.py:https://github.com/tensorflow/tensorflow/blob/r1.8/tensorflow/python/ops/variables.py

tensorflow中的参数初始化方法

FailedPreconditionError tensorflow

原文地址:https://www.cnblogs.com/gengyi/p/9833865.html

时间: 2024-10-09 04:46:39

Tensorflow运行程序报错 FailedPreconditionError的相关文章

[已解决]springBoot 中添加 dev-tools后,运行程序报错Unenhance strategy

发生条件:在pom.xml中增加dev-tools的依赖,程序启动后,调用程序接口报错 问题现象: ------------------------------------------------------------- Registered concrete types: 5 (approximate size: 630.7 kB) [interface java.util.Collection] : ArrayList<Object> [interface java.util.Map]

运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory

运行编译后的程序报错  error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory -------------------------------------------------------------------------------------------------------------------------------------

Window7中Eclipse运行MapReduce程序报错的问题

按照文档:http://www.micmiu.com/bigdata/hadoop/hadoop2x-eclipse-mapreduce-demo/安装配置好Eclipse后,运行WordCount程序报错: log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory). log4j:WARN Please initialize the log4j

WinDbg抓取程序报错dump文件的方法

程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点:程序已异常,在你未点出错窗口的确定或其他按,所有错误信息都还保留在PC的内存中,可以直接抓取Dump文件.当然,如果你知道 怎么样操作可以让程序崩溃,也可以用守株待兔的抓取方法抓Dump文件. b.程序在运行中的时候,窗口和进程突然消失,没有任何错误窗体 典型的现象:程序自动关闭 或者玩游戏时,游

debug运行下报错,但不影响运行ERROR: JDWP Unable to get JNI 1.2 environment, jvm-&gt;GetEnv() return code = -2(转)

eclipse 3.4+jdk1.6 编译正常通过,运行debug模式时报错 ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820] 查找该错误原因.发现是重定向输出的问题. 以下是网络资料原文 装jdk1.6了把,呵呵- 我也碰到过这

[Jenkins]运行shell报错:寻找匹配的 `&quot;&#39; 是遇到了未预期的文件结束符

这里有一个坑(至少对于我来说): 报错信息中的出错行,并不代表真实脚本中的出错行. jenkins执行的shell内容如下: 第1行echo 1个字符串,少1个双隐号 echo "233342 echo "12312" echo "34" 执行jenkins报错如下: /usr/local/tomcat/apache-tomcat-8.5.40/temp/jenkins5082891078041588552.sh:行4: 寻找匹配的 `"' 是遇

[Python] 运行Flask, 报错:UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xc4 in position 33: ordinal not in range(128)

运行时报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 33: ordinal not in range(128) Python2.7在Windows上一个bug!!! 解决方法: 参考官方patch: http://bugs.python.org/file19332/9291a.patch 如下代码:一,加入from itertools import count: 二,修改 def enum_type

windows7旗舰版64位下安装、破解及运行QTP11报错

说明:如果你出现了以下几种情况,希望能解决你的问题:如果没有,就当路过. 1.安装qtp11时报vc++ 2005缺少,但怎么也不能成功安装 解决方法: 1.找到qtp安装包里面的vc++ 2005组件 QuickTest\CHS\prerequisites\vc2005_sp1_redist. 2.运行vcredist_x86.exe文件,如果安装失败,修改后缀名为压缩文件,如:zip.rar,解压文件后重新运行解压后的文件. 2.网上介绍用mgn-mqt82.exe的方法破解qtp11失败

在ios7真机上和iOS6模拟器上运行是好的,而在iOS6真机上运行却报错

在ios7真机上和iOS6模拟器上运行是好的,而在iOS6真机上运行却报错 解决方法: 或是都设置为yes.. Build Active Architecture Only的意思是只生成适应的指令集 在ios7真机上和iOS6模拟器上运行是好的,而在iOS6真机上运行却报错,码迷,mamicode.com