_import tensorflow as tf
x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')
# model = tf.global_variables_initializer()
with tf.Session() as session:
print("x = ", session.run(x))
# session.run(model)
print("y = ", session.run(y))
_
global_variables_initializer()
が実際に必要な時期を理解できませんでした。上記のコードで、4行目と7行目のコメントを解除すると、コードを実行して値を確認できます。そのまま実行すると、クラッシュが発生します。
私の質問は、初期化する変数です。 x
は初期化を必要としない定数であり、y
は初期化されていないが算術演算として使用される変数です。
tf.global_variables_initializer
は、すべてのグローバル変数を初期化するショートカットです。必須ではありません。他の方法を使用して変数を初期化できます。簡単なスクリプトの場合は、変数をまったく初期化する必要がない場合があります。
変数を除くすべてのものは、初期化を必要としません(定数とプレースホルダー)。ただし、すべてのused変数(定数であっても)は初期化する必要があります。これはエラーになりますが、z
は1つの数値のみを含む0-dテンソルです。
import tensorflow as tf
z = tf.Variable(4)
with tf.Session() as session:
print(session.run(z))
実行されていない(または実行の変数が変数に依存している)変数がある場合は、それらを初期化する必要がないため、使用するWordを強調しました。
たとえば、このコードは問題なく実行されますが、2つの変数とそれらに依存する1つの操作があります。しかし、実行にはそれらは必要ありません。
import tensorflow as tf
x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')
z = tf.Variable(4)
a = y + z
with tf.Session() as session:
print("x = ", session.run(x))
docs (emphasis mine)から:
Tf.Variable()を呼び出すと、グラフにいくつかの操作が追加されます。
- 変数値を保持する変数op。
- 変数を初期値に設定する初期化子op。これは実際にはtf.assign opです。
- 例のバイアス変数のゼロopなど、初期値のopもグラフに追加されます。
後、
変数イニシャライザは、モデル内の他のopsを実行する前に明示的に実行する必要があります。これを行う最も簡単な方法は、すべての変数初期化子を実行するopを追加し、モデルを使用する前にそのopを実行することです。
要するに、 global_variables_initializer
は必須ではありません。Variable
初期化は必須です。コードにVariables
が含まれている場合は、最初にそれらを初期化する必要があります。 global_variables_initializer
ヘルパーは、以前に宣言されたすべてのVariables
を初期化するため、非常に便利な方法です。
Tensorflowセッションの実行内から宣言された_tf.Variable
_または_tf.placeholder
_を使用している場合を除き、これは要件ではありません。個人的には、常にtf.global_variables_initializer()
を実行する習慣にしています。テンソルフローモデルを実行すると、ほとんどボイラープレートコードの一部になります。
_with tf.Session(graph=graph) as sess:
sess.run(tf.global_variables_initializer())
# run model etc...
_
_tf.global_variables_initializer
_は、tf.global_variables()
がリストするすべての変数を初期化するだけです。これは、グラフがクラスター内の異なるコンピューティングノードに配置される可能性がある分散環境では、実際に非常に理にかなっています。
このような場合、tf.global_variables_initializer()
の単なるエイリアスであるtf.variables_initializer(tf.global_variables())
は、グラフが配置されているすべての計算ノードのすべての変数を初期化します。