TensorFlowには、グラフの一部を評価する方法が2つあります。変数のリストに対するSession.run
とTensor.eval
です。両者に違いはありますか?
Tensor
tがある場合、 t.eval()
を呼び出すことはtf.get_default_session().run(t)
を呼び出すことと同じです。
次のようにセッションをデフォルトにすることができます。
t = tf.constant(42.0)
sess = tf.Session()
with sess.as_default(): # or `with sess:` to close on exit
assert sess is tf.get_default_session()
assert t.eval() == sess.run(t)
最も重要な違いは、同じステップでsess.run()
を使って多数のテンソルの値を取得できることです。
t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.mul(t, u)
ut = tf.mul(u, t)
with sess.as_default():
tu.eval() # runs one step
ut.eval() # runs one step
sess.run([tu, ut]) # evaluates both tensors in a single step
eval
とrun
を呼び出すたびに、グラフ全体が最初から実行されます。計算結果をキャッシュするには、それをa tf.Variable
に割り当てます。
テンソルフローのFAQセッションには、まったく同じ質問に対する回答 があります 。先に進み、ここに残しておきます。
t
がTensor
オブジェクトの場合、t.eval()
はsess.run(t)
の省略形です(ここで、sess
は現在のデフォルトセッションです。次の2つのコードは同じです。
sess = tf.Session()
c = tf.constant(5.0)
print sess.run(c)
c = tf.constant(5.0)
with tf.Session():
print c.eval()
2番目の例では、セッションはコンテキストマネージャとして機能します。これは、with
ブロックの有効期間中、セッションをデフォルトセッションとしてインストールする効果があります。コンテキストマネージャのアプローチは、(単体テストのような)単純なユースケースのためのより簡潔なコードにつながります。あなたのコードが複数のグラフやセッションを扱う場合、Session.run()
への明示的な呼び出しがより直接的かもしれません。
それは多くのことを明確にするかもしれないので、私はあなたがFAQ全体を通して少なくともスキムすることを勧めます。
eval()
はリストオブジェクトを処理できません
tf.reset_default_graph()
a = tf.Variable(0.2, name="a")
b = tf.Variable(0.3, name="b")
z = tf.constant(0.0, name="z0")
for i in range(100):
z = a * tf.cos(z + i) + z * tf.sin(b - i)
grad = tf.gradients(z, [a, b])
init = tf.global_variables_initializer()
with tf.Session() as sess:
init.run()
print("z:", z.eval())
print("grad", grad.eval())
しかしSession.run()
はできます
print("grad", sess.run(grad))
間違っていれば訂正してください
テンソルフローではグラフを作成し、そのグラフに値を渡します。グラフはすべてのハードワークを行い、グラフで行った設定に基づいて出力を生成します。今度はグラフに値を渡すとき最初にテンソルフローセッションを作成する必要があります。
tf.Session()
セッションが初期化されると、すべての変数と設定がセッションの一部になったので、そのセッションを使用することになります。そのため、グラフが外部値を受け付けるようにするには、2つの方法があります。 1つは、実行中のセッションを使用している間に.run()を呼び出すことです。
これに対する基本的なショートカットである他の方法は、.eval()を使用することです。 .eval()の完全形式は
tf.get_default_session().run(values)
あなたは自分でそれをチェックすることができます。 values.eval()
の場所でtf.get_default_session().run(values)
を実行します。あなたは同じ振る舞いをしなければなりません。
evalがしていることはデフォルトのセッションを使用してからrun()を実行することです。
覚えておくべき最も重要なこと:
TenorFlowから定数、変数(任意の結果)を取得する唯一の方法はセッションです。
他のすべてのことを知っているのは 簡単です :
tf.Session.run()
とtf.Tensor.eval()
の両方がセッションから結果を取得します。ここでtf.Tensor.eval()
はtf.get_default_session().run(t)
を呼び出すためのショートカットです。
ここで のようにメソッドtf.Operation.run()
も概説します :
グラフがセッション内で起動された後、Operationを
tf.Session.run()
に渡すことでOperationを実行できます。op.run()
はtf.get_default_session().run(op)
を呼び出すためのショートカットです。