TensorFlowにおいて変数を使用する場合には、変数の定義だけではなく変数の初期化が必要となります。
今回はinitialize_all_variablesの実行をモデル定義の途中で行ったため、変数初期化のエラー”FailedPreconditionError: Attempting to use uninitialized value”ではまってしまったので、解決策をメモしておきます。
TensorFlow上での変数の使用
TensorFlowではモデルの学習のために変数を使用する必要があります。
TensorFlow上で変数を利用するためには次の二つを行う必要があります。
- tf.Variable() による変数の定義
- tf.initialize_all_variables() 等による変数の初期化
変数の定義方法について詳しくは下記の記事を参照してください。
変数の初期化を行わずに変数を使用すると、変数が初期化されていないというエラーが出ます。
しかし今回は tf.initialize_all_variables()を実行しても、変数初期化のエラーが出てしまいました。
テストコード
下記に変数初期化エラーが出てしまったコードの抜粋を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import tensorflow as tf def add_make(): f_1_w = tf.Variable(tf.truncated_normal([2,2],stddev=0.1, dtype=tf.float32)) f_1_b = tf.Variable(tf.truncated_normal([2],stddev=0.1, dtype=tf.float32)) return tf.add(f_1_w, f_1_b) init = tf.initialize_all_variables() add_1 = add_make() with tf.Session() as sess: sess.run(init) print(sess.run(add_1)) |
上記のコードを実行すると次のようなエラーが出てきます。
1 |
tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value Variable_1 |
内容は初期化されていない変数 Variable_1 を使用しようとしているとのことでした。
しかしコード内では tf.initialize_all_variables()を実行しているので、変数は初期化されるはずです。
解決策
上記の問題を解決するために、 tf.initialize_all_variables()の定義を調べました。 tf.initialize_all_variables()の定義は下記のリンクから見ることができます。
GitHub : TensorFlow /python/ops/variables.py
定義を調べたところTensorFlowの tf.initialize_all_variables()では変数の初期化を次のように行っているみたいです。
- tf.Variableによって変数を定義する
- 定義した変数はすべてコレクション GraphKeys.GLOBAL_VARIABLES に追加される
- global_variables() によっての GraphKeys.GLOBAL_VARIABLES内容を取得する
- 取得した内容を variables_initializer()に渡し、全ての変数を初期化する
つまり、 tf.initialize_all_variables()を実行する前に定義した変数しか初期化されないということです。
そこで今回のように tf.initialize_all_variables()を実行しても変数初期化のエラーが出る原因は、 tf.initialize_all_variables()の実行をモデル作成の途中で行ってしまったことです。
そのため tf.initialize_all_variables()の実行をモデルの作成終了後に行えば正しく変数の初期化が行われます。
まとめ
- 変数の初期化を行わずに計算を実行すると、 FailedPreconditionError: Attempting to use uninitialized value というエラーが発生する
- tf.initialize_all_variables()はモデル作成の途中ではなく、モデル作成終了後に行う
関連記事