Tensorflow运行程序报错 FailedPreconditionError
1 FailedPreconditionError錯(cuò)誤現(xiàn)象
在運(yùn)行tensorflow時(shí)出現(xiàn)報(bào)錯(cuò),報(bào)錯(cuò)語(yǔ)句如下:
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)]]
對(duì)報(bào)錯(cuò)原因進(jìn)行直白翻譯(信、雅、達(dá)精度嚴(yán)重缺失):
條件預(yù)處理時(shí)失敗錯(cuò)誤(參看上面的回溯):嘗試使用未初始化的值變量。
2?FailedPreconditionError錯(cuò)誤淺析
2.1 FailedPreconditionError的淺析
查看錯(cuò)誤類源代碼:
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 operationthat 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)注釋意思可理解為:
因?yàn)橄到y(tǒng)未處于執(zhí)行狀態(tài),所以操作被拒絕。
在@ {tf.Variable}初始化前運(yùn)行讀取操作時(shí),通常會(huì)引發(fā)此異常。
2.2 global_variables_initializer的源代碼
查看global_variables_initializer函數(shù)的源代碼
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函數(shù)源代碼。
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 toinitialize all the variables in `var_list`. This Op runs all theinitializers of the variables in `var_list` in parallel.Calling `initialize_variables()` is equivalent to passing the list ofinitializers to `Group()`.If `var_list` is empty, however, the function still returns an Op that canbe 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()函數(shù)源代碼。
def global_variables(scope=None):"""Returns global variables.Global variables are variables that are shared across machines in adistributed 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 filteredto include only items whose `name` attribute matches `scope` using`re.match`. Items without a `name` attribute are never returned if ascope is supplied. The choice of `re.match` means that a `scope` withoutspecial 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 變量是表示程序處理的共享持久狀態(tài)的最佳方法。
我們通過(guò)tf.Variable類操作變量。tf.Variable表示可通過(guò)對(duì)其運(yùn)行操作來(lái)改變其值的張量。
與tf.Tensor對(duì)象不同,tf.Variable存在于單個(gè)tf.Session().run()調(diào)用的上下文之外。
在TensorFlow內(nèi)部,tf.Variable會(huì)存儲(chǔ)持久性張量。具體operation( op )允許您讀取和修改張量的值。這些修改在多個(gè)tf.Session()之間是可見(jiàn)的,因此對(duì)于一個(gè)tf.Variable,多個(gè)工作器可以看到相同的值。
2.3.2 變量集合
由于 TensorFlow 程序的未連接部分可能需要?jiǎng)?chuàng)建變量,因此能有一種方式訪問(wèn)所有變量有時(shí)十分受用。為此,TensorFlow 提供了集合,它們是張量或其他對(duì)象(如?tf.Variable?實(shí)例)的命名列表。
默認(rèn)情況下,每個(gè)?tf.Variable?都放置在以下兩個(gè)集合中:
- tf.GraphKeys.GLOBAL_VARIABLES?- 可以在多臺(tái)設(shè)備間共享的變量,
- tf.GraphKeys.TRAINABLE_VARIABLES?- TensorFlow 將計(jì)算其梯度的變量。
如果您不希望變量可訓(xùn)練,可以將其添加到?tf.GraphKeys.LOCAL_VARIABLES?集合中。
2.3.3?初始化變量
?
變量必須先初始化后才可使用。
如果您在低級(jí)別 TensorFlow API 中進(jìn)行編程(即您在顯式創(chuàng)建自己的圖和會(huì)話),則必須明確初始化變量。tf.contrib.slim、tf.estimator.Estimator?和?Keras?等大多數(shù)高級(jí)框架在訓(xùn)練模型前會(huì)自動(dòng)為您初始化變量。
顯式初始化在其他方面很有用。它允許您在從檢查點(diǎn)重新加載模型時(shí)不用重新運(yùn)行潛在資源消耗大的初始化器,并允許在分布式設(shè)置中共享隨機(jī)初始化的變量時(shí)具有確定性。
要在訓(xùn)練開(kāi)始前一次性初始化所有可訓(xùn)練變量,請(qǐng)調(diào)用?tf.global_variables_initializer()。此函數(shù)會(huì)返回一個(gè)操作,負(fù)責(zé)初始化?tf.GraphKeys.GLOBAL_VARIABLES?集合中的所有變量。運(yùn)行此操作會(huì)初始化所有變量。例如:
session.run(tf.global_variables_initializer()) # Now all variables are initialized.如果您確實(shí)需要自行初始化變量,則可以運(yùn)行變量的初始化器操作。例如:
session.run(my_variable.initializer)您可以查詢哪些變量尚未初始化。例如,以下代碼會(huì)打印所有尚未初始化的變量名稱:
print(session.run(tf.report_uninitialized_variables()))請(qǐng)注意,默認(rèn)情況下,tf.global_variables_initializer?不會(huì)指定變量的初始化順序。因此,如果變量的初始值取決于另一變量的值,那么很有可能會(huì)出現(xiàn)錯(cuò)誤。任何時(shí)候,如果您在并非所有變量都已初始化的上下文中使用某個(gè)變量值(例如在初始化某個(gè)變量時(shí)使用另一變量的值),最好使用?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日之前,全局變量初始化函數(shù)initialize_all_variables();之后為global_variables_initializer()函數(shù)。
3 變量的生命周期(補(bǔ)充)
2018.10.28日首圖學(xué)習(xí)時(shí)看到內(nèi)容,將其補(bǔ)充上。
在看到Tensorflow官網(wǎng)的常見(jiàn)問(wèn)題解答中的變量部分時(shí),有關(guān)于變量的生命周期的解答。
什么是變量的生命周期?
在會(huì)話中為變量首次運(yùn)行? tf.Variable.initializer??操作時(shí),即會(huì)創(chuàng)建該變量。運(yùn)行?? tf.Session.close? 后,將銷毀該變量。
?從變量生命周期中可以得知,如果不進(jìn)行 initializer ,變量就不會(huì)創(chuàng)建。
?
參考?
處理FailedPreconditionError、該文針對(duì)FailedPreconditionError錯(cuò)誤函數(shù)進(jìn)行解讀
TensorFlow定義錯(cuò)誤的異常類型(詳細(xì))進(jìn)入該文直接搜索FailedPreconditionError函數(shù),可以看到源代碼段
變量初始化的意義?該文從C/C++程序中的棧和堆上來(lái)說(shuō)存儲(chǔ)并采用示例分析證明
具體參考 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中的參數(shù)初始化方法
FailedPreconditionError tensorflow
TensorFlow 常見(jiàn)問(wèn)題解答
?
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Tensorflow运行程序报错 FailedPreconditionError的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 10月份个人技术指标
- 下一篇: DataWorks 如何设置调度依赖