web-dev-qa-db-ja.com

global_variables_initializer()が実際に必要な場合

_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は初期化されていないが算術演算として使用される変数です。

17
Vinay

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)) 
16
Salvador Dali

docs (emphasis mine)から:

Tf.Variable()を呼び出すと、グラフにいくつかの操作が追加されます。

  • 変数値を保持する変数op。
  • 変数を初期値に設定する初期化子op。これは実際にはtf.assign opです。
  • 例のバイアス変数のゼロopなど、初期値のopもグラフに追加されます。

後、

変数イニシャライザは、モデル内の他のopsを実行する前に明示的に実行する必要があります。これを行う最も簡単な方法は、すべての変数初期化子を実行するopを追加し、モデルを使用する前にそのopを実行することです。

要するに、 global_variables_initializerは必須ではありません。Variable初期化は必須です。コードにVariablesが含まれている場合は、最初にそれらを初期化する必要があります。 global_variables_initializerヘルパーは、以前に宣言されたすべてのVariablesを初期化するため、非常に便利な方法です。

5
P-Gn

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...
_
2
Calvin Alvin

_tf.global_variables_initializer_は、tf.global_variables()がリストするすべての変数を初期化するだけです。これは、グラフがクラスター内の異なるコンピューティングノードに配置される可能性がある分散環境では、実際に非常に理にかなっています。

このような場合、tf.global_variables_initializer()の単なるエイリアスであるtf.variables_initializer(tf.global_variables())は、グラフが配置されているすべての計算ノードのすべての変数を初期化します。

2
kmario23