web-dev-qa-db-ja.com

TensorFlowで、Session.run()とTensor.eval()の違いは何ですか?

TensorFlowには、グラフの一部を評価する方法が2つあります。変数のリストに対するSession.runTensor.evalです。両者に違いはありますか?

178
Geoffrey Irving

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

evalrunを呼び出すたびに、グラフ全体が最初から実行されます。計算結果をキャッシュするには、それをa tf.Variable に割り当てます。

222
mrry

テンソルフローのFAQセッションには、まったく同じ質問に対する回答 があります 。先に進み、ここに残しておきます。


tTensorオブジェクトの場合、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全体を通して少なくともスキムすることを勧めます。

40
Salvador Dali

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))

間違っていれば訂正してください

2
Yushin Liu

テンソルフローではグラフを作成し、そのグラフに値を渡します。グラフはすべてのハードワークを行い、グラフで行った設定に基づいて出力を生成します。今度はグラフに値を渡すとき最初にテンソルフローセッションを作成する必要があります。

tf.Session()

セッションが初期化されると、すべての変数と設定がセッションの一部になったので、そのセッションを使用することになります。そのため、グラフが外部値を受け付けるようにするには、2つの方法があります。 1つは、実行中のセッションを使用している間に.run()を呼び出すことです。

これに対する基本的なショートカットである他の方法は、.eval()を使用することです。 .eval()の完全形式は

tf.get_default_session().run(values)

あなたは自分でそれをチェックすることができます。 values.eval()の場所でtf.get_default_session().run(values)を実行します。あなたは同じ振る舞いをしなければなりません。

evalがしていることはデフォルトのセッションを使用してからrun()を実行することです。

0
Sudeep K Rana

覚えておくべき最も重要なこと:

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)を呼び出すためのショートカットです。

0
prosti