Tensorflow运行程序报错 FailedPreconditionError_weixin_30390075的博客-程序员宅基地

技术标签: python  人工智能  c/c++  

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()函数。

3 变量的生命周期(补充)

2018.10.28日首图学习时看到内容,将其补充上。

在看到Tensorflow官网的常见问题解答中的变量部分时,有关于变量的生命周期的解答。

什么是变量的生命周期?

在会话中为变量首次运行  tf.Variable.initializer  操作时,即会创建该变量。运行   tf.Session.close  后,将销毁该变量。

 从变量生命周期中可以得知,如果不进行 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

TensorFlow 常见问题解答

 

转载于:https://www.cnblogs.com/gengyi/p/9833865.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30390075/article/details/98469259

智能推荐

java项目中的pom依赖在哪_java – 如何包含pom项目中的所有模块_爱电子产品的博客-程序员宅基地

我正在寻找一种方法,从另一个pom.xml包含项目中的所有模块.所以在我的情况下,我有一个父pom,包装设置为pom.它包含3个子模块,用于在另一个api模块中实现我的接口.我想在maven中动态地包含我项目中的所有子模块.在这种情况下,我想在另一个模块中包含connector1,connector2,connector3,而不必隐式指定connector1,2,3.connectors - pa...

定时器的实现原理及参考_weixin_30865427的博客-程序员宅基地

  如果让你来实现一个定时器的功能,简单点就是,每隔n秒,去执行一次A任务,你打算怎么实现?  我觉得一般都能想到,使用一个死循环,然后每次循环比较时间,时间到了就去执行A任务就好了。但是这样会不会有问题?每次循环会不会性能消耗太大?别人都是怎么做的?如果有语言提供的工具,那我自然更加相信他而不是自己去实现。  好吧,用编程语言自身提供的工具一般情况下自然是比较明智的选择,因为别人本来就比你厉...

python长整数相乘_python里大整数相乘相关技巧指南_lithops7的博客-程序员宅基地

问题大整数相乘思路说明对于大整数计算,一般都要用某种方法转化,否则会溢出。但是python无此担忧了。Python支持“无限精度”的整数,一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型。例如:>>> 2899887676637907866*178877899278834827738...

cmd安装mysql时出现:计算机中丢失MSVCP120.dll 的解决办法_布衣书生-Python的博客-程序员宅基地_mysql丢失msvcr120.dll

出现上面的情况时,是电脑没有安装VC++运行库导致的解决办法:安装vcredist_x64程序1.去官网下载该程序文件,链接是:https://www.microsoft.com/en-us/download/details.aspx?id=53587点击Download选择64位或32位(x86)后,点击Next下载2.下载后直接双击安装就行...

python mysql 返回列表_Python MySQL返回表数据 - 仅显示一行上的所有内容_捧着一杯枸杞茶的博客-程序员宅基地

基本上,我从表中返回数据:>mysql> SELECT x,y FROM xandy;>+------+------+>| x | y |>+------+------+>| 5 | 2 |>| 4 | 6 |>| 7 | 6 |>| 4 | 6 |>| 8 | 7 ...

随便推点

白噪声检验python_python 加一个白噪声跟老齐学Python之Python安装_weixin_39758712的博客-程序员宅基地

任何高级语言都是需要一个自己的编程环境的,这就好比写字一样,需要有纸和笔,在计算机上写东西,也需要有文字处理软件,比如各种名称的OFFICE。笔和纸以及office软件,就是写东西的硬件或软件,总之,那些文字只能写在那个上边,才能最后成为一篇文章。那么编程也是,要有个什么程序之类的东西,要把程序写到那个上面,才能形成最后类似文章那样的东西。刚才又有了一个术语――“程序”,什么是程序?本文就不讲了。...

Java学习笔记【入门】(2):JVM、JRE与JDK的关系_写Bug 的大潘的博客-程序员宅基地

1、JVMJVM(Java Virtual Machine),Java虚拟机,它是运行所有Java程序的虚拟计算机,好比是街机游戏的模拟器。JVM是Java语言的运行环境,也是Java 最具吸引力的特性之一。JVM用于读取并处理编译过的与平台无关的字节码(.class)文件,从而实现Java的可移植性。但是值得注意的是Java虚拟机是不跨平台的。也就是说在Win下得装Win版的JVM,在L...

hbase 修改表名_对已经存在的hbase表修改压缩方式_珍惜掌中余沙的博客-程序员宅基地

业务上可能会遇到这种情况,在最初创建hbase表时候,未指定压缩方式,当数据导入之后,由rowkey带来的数据膨胀导致hdfs上的数据大小远远大于原始数据大小。所以这时候可能就不得不考虑使用压缩,但是如果将表删除,再创建一张指定压缩的表,再重新导入数据未免太浪费时间。当然也完全不用这样,可以直接修改hbase表的压缩方式,然后在执行major_compact即可disable ‘testcompr...

【PaddlePaddle+OpenVINO】垃圾邮件检测部署_AI Studio的博客-程序员宅基地

使用OnnxRuntime和OpenVINO部署基于ERNIE-1.0 Finetune的垃圾邮件检测模型

mysql html css php易_利用html+css+mysql+php实现类似google suggest的功能_瓖嘉的博客-程序员宅基地

其实大家对google suggest这种搜索关键字自动提示的功能非常的了解,但是在作为如果只做前端工作的我们,我们可以很流利的跟人家说出下面这句话:“google suggest是通过Ajax的异步交互,实时刷新页面,将关键字传给后台服务器,同时将返回结果展示在前台页面”,我们可以很流利的告诉人家,前台展示我们都知道,通过javascript的源生js代码,通过监听onreadyStateCha...

【推荐】国外优秀Drupal答疑网站_weixin_34257076的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ...

推荐文章

热门文章

相关标签