TensorFlowチュートリアル を使用しています。これは、「奇妙な」形式を使用してデータをアップロードします。データにNumPyまたはpandas形式を使用して、scikit-learnの結果と比較できるようにします。
Kaggleから数字認識データを取得します: https://www.kaggle.com/c/digit-recognizer/data 。
TensorFlowチュートリアルのコード(これは正常に動作します):
# Stuff from tensorflow tutorial
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.placeholder("float", shape=[None, 784])
y_ = tf.placeholder("float", shape=[None, 10])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
ここで、データを読み取り、ターゲット変数を取り除き、データをテストデータセットとトレーニングデータセットに分割します(これはすべて正常に機能します)。
# Read dataframe from training data
csvfile='train.csv'
from pandas import DataFrame, read_csv
df = read_csv(csvfile)
# Strip off the target data and make it a separate dataframe.
Target = df.label
del df["label"]
# Split data into training and testing sets
msk = np.random.Rand(len(df)) < 0.8
dfTest = df[~msk]
TargetTest = Target[~msk]
df = df[msk]
Target = Target[msk]
# One hot encode the target
OHTarget=pd.get_dummies(Target)
OHTargetTest=pd.get_dummies(TargetTest)
トレーニングステップを実行しようとすると、FailedPreconditionError
が取得されます。
for i in range(100):
batch = np.array(df[i*50:i*50+50].values)
batch = np.multiply(batch, 1.0 / 255.0)
Target_batch = np.array(OHTarget[i*50:i*50+50].values)
Target_batch = np.multiply(Target_batch, 1.0 / 255.0)
train_step.run(feed_dict={x: batch, y_: Target_batch})
完全なエラーは次のとおりです。
---------------------------------------------------------------------------
FailedPreconditionError Traceback (most recent call last)
<ipython-input-82-967faab7d494> in <module>()
4 Target_batch = np.array(OHTarget[i*50:i*50+50].values)
5 Target_batch = np.multiply(Target_batch, 1.0 / 255.0)
----> 6 train_step.run(feed_dict={x: batch, y_: Target_batch})
/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.pyc in run(self, feed_dict, session)
1265 none, the default session will be used.
1266 """
-> 1267 _run_using_default_session(self, feed_dict, self.graph, session)
1268
1269
/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.pyc in _run_using_default_session(operation, feed_dict, graph, session)
2761 "the operation's graph is different from the session's "
2762 "graph.")
-> 2763 session.run(operation, feed_dict)
2764
2765
/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/client/session.pyc in run(self, fetches, feed_dict)
343
344 # Run request and get response.
--> 345 results = self._do_run(target_list, unique_fetch_targets, feed_dict_string)
346
347 # User may have fetched the same tensor multiple times, but we
/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/client/session.pyc in _do_run(self, target_list, fetch_list, feed_dict)
417 # pylint: disable=protected-access
418 raise errors._make_specific_exception(node_def, op, e.error_message,
--> 419 e.code)
420 # pylint: enable=protected-access
421 raise e_type, e_value, e_traceback
FailedPreconditionError: Attempting to use uninitialized value Variable_1
[[Node: gradients/add_grad/Shape_1 = Shape[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_1)]]
Caused by op u'gradients/add_grad/Shape_1', defined at:
File "/Users/user32/anaconda/lib/python2.7/runpy.py", line 162, in _run_module_as_main
...........
...which was originally created as op u'add', defined at:
File "/Users/user32/anaconda/lib/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
[elided 17 identical lines from previous traceback]
File "/Users/user32/anaconda/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 3066, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-45-59183d86e462>", line 1, in <module>
y = tf.nn.softmax(tf.matmul(x,W) + b)
File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 403, in binary_op_wrapper
return func(x, y, name=name)
File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 44, in add
return _op_def_lib.apply_op("Add", x=x, y=y, name=name)
File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 633, in apply_op
op_def=op_def)
File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1710, in create_op
original_op=self._default_original_op, op_def=op_def)
File "/Users/user32/anaconda/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 988, in __init__
self._traceback = _extract_stack()
これを修正する方法についてのアイデアはありますか?
FailedPreconditionError
が発生するのは、プログラムが変数("Variable_1"
という名前)を初期化する前に読み取ろうとするためです。 TensorFlowでは、「初期化子」操作を実行して、すべての変数を明示的に初期化する必要があります。便宜上、トレーニングループの前に次のステートメントを実行することにより、現在のセッションですべての変数初期化子を実行できます。
tf.initialize_all_variables().run()
この回答では、質問のように、セッションを指定せずに操作を実行できるtf.InteractiveSession
を使用していることを前提としていることに注意してください。非対話型の使用では、tf.Session
を使用し、次のように初期化するのがより一般的です。
init_op = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init_op)
tf.initialize_all_variables()
は非推奨です。代わりに、次を使用してテンソルフロー変数を初期化します。
tf.global_variables_initializer()
一般的な使用例は次のとおりです。
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
公式ドキュメントから、 FailedPreconditionError
この例外は、tf.Variableを初期化する前に読み取る操作を実行するときに最も一般的に発生します。
あなたの場合、エラーは初期化されなかった変数を説明します:Attempting to use uninitialized value Variable_1
。 TFチュートリアルの1つでは、変数 の作成/初期化/保存/読み込みについて多くのことを説明しています
基本的に変数を初期化するには、3つのオプションがあります。
tf.global_variables_initializer()
ですべてのグローバル変数を初期化しますtf.variables_initializer(list_of_vars)
で初期化します。この関数を使用してglobal_variable_initializerを模倣できることに注意してください:tf.variable_initializers(tf.global_variables())
var_name.initializer
で変数を1つだけ初期化します私はほとんど常に最初のアプローチを使用します。セッション実行内に配置する必要があることを忘れないでください。したがって、次のようになります。
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
変数の詳細について知りたい場合は、 このドキュメント を読んでreport_uninitialized_variables
の方法を確認し、is_variable_initialized
を確認してください。
別のユースケースですが、セッションをデフォルトセッションとして設定すると、私にとってはうまくいきませんでした:
with sess.as_default():
result = compute_fn([seed_input,1])
これはこれらの間違いの1つであり、一度解決すれば非常に明白です。
私のユースケースは次のとおりです。
1)keras VGG16をテンソルフローグラフとして保存する
2)kers VGG16をグラフとしてロード
3)グラフでtf関数を実行し、以下を取得します。
FailedPreconditionError: Attempting to use uninitialized value block1_conv2/bias
[[Node: block1_conv2/bias/read = Identity[T=DT_FLOAT, _class=["loc:@block1_conv2/bias"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](block1_conv2/bias)]]
[[Node: predictions/Softmax/_7 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="Edge_168_predictions/Softmax", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
このエラーメッセージはまったく別のケースから取得しました。テンソルフローの例外ハンドラがそれを上げたようです。トレースバックの各行を確認できます。私の場合、このファイルにはtensorflow/python/lib/io/file_io.py
とself.__mode
が初期化されておらず、代わりにself.__name
とself._FileIO__mode
を呼び出す必要がある別のバグが含まれていたため、self_FileIO__name
で発生しました。
変数を使用する前に初期化する必要があります。
初期化する前に変数を評価しようとすると、次のようになります:FailedPreconditionError: Attempting to use uninitialized value tensor.
最も簡単な方法は、tf.global_variables_initializer()
を使用してすべての変数を一度に初期化することです
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
sess.run(init)
を使用して、値を取得せずに初期化子を実行します。
変数のサブセットのみを初期化するには、変数をリストするtf.variables_initializer()
を使用します。
var_ab = tf.variables_initializer([a, b], name="a_and_b")
with tf.Session() as sess:
sess.run(var_ab)
tf.Variable.initializer
を使用して各変数を個別に初期化することもできます
# create variable W as 784 x 10 tensor, filled with zeros
W = tf.Variable(tf.zeros([784,10])) with tf.Session() as sess:
sess.run(W.initializer)
コーディネーターを開始する前にローカル変数を初期化するtf.train.string_input_producer()
とtf.train.batch()
でこの問題が発生したとき、問題は解決しました。 Coordinatorの起動後にローカル変数を初期化すると、エラーが発生していました。
FailedPreconditionErrorは、セッションが初期化されていない変数を読み取ろうとしているために発生します。
Tensorflowバージョン1.11.0以降、これを取得する必要があります:
init_op = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init_op)
おそらく、最近のTensorFlowビルドで何かが変更されました。
sess = tf.Session()
sess.run(tf.local_variables_initializer())
モデルをフィッティングする前にトリックを行うようです。古い例とコメントのほとんどは、tf.global_variables_initializer()
を示唆しているようです。