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


204

TensorFlowには、グラフの一部を評価する方法が2つあります。Session.run変数のリストとですTensor.eval。これら2つの間に違いはありますか?


完全な名前空間tf.Tensor.eval()tf.Session.run()が、接続はされているtf.Operation.run()tf.Tensor.eval()で説明したように、ここで
prosti

回答:


243

Tensort がある場合、を呼び出すこと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グラフ全体を最初から実行することに注意してください。計算の結果をキャッシュするには、それをに割り当てtf.Variableます。


2番目の例の違いは何ですか?個別の操作(またはグラフ?違いがわからない)を評価できるというだけですか?
ピノキオ

1
待って、あなたの例は実際に実行されますか?私は試してみました:a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) そして、形状が一致しないというテンソルフローから苦情を受けました、もっと正確に言うと、ランクは少なくとも2でなければならないということです
ピノキオ

@Pinocchio元の回答が4年前に投稿されたため、APIは変更されたと思います。私が使用しtf.multiply(t, u)、それはうまくいきました。
yuqli

42

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


場合tであるTensorオブジェクトt.eval()の省略形であるsess.run(t)(ここでsess:現在のデフォルト・セッションがコードの次の二つの断片が同等です

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全体を少なくとも読み飛ばすことをお勧めします。


2

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

私が間違っている場合は修正してください


1

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

TenorFlowから定数、変数(任意の結果)を取得する唯一の方法は、セッションです。

これ以外のすべてを知るのは簡単です。

どちらもtf.Session.run()、呼び出しのショートカットがであるtf.Tensor.eval()セッションから結果を取得しますtf.Tensor.eval()tf.get_default_session().run(t)


私もここにあるtf.Operation.run()ように方法を概説します

セッションでグラフが起動された後、に渡してオペレーションを実行できますtf.Session.run()op.run()はを呼び出すためのショートカットですtf.get_default_session().run(op)


0

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

tf.Session()

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

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

tf.get_default_session().run(values)

自分で確認できます。values.eval()走る場所でtf.get_default_session().run(values)。同じ動作をする必要があります。

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


0

Tensorflow 2.x互換性のある回答Tensorflow 2.x (>= 2.0)コミュニティの利益のためにmrryのコードをに変換します。

!pip install tensorflow==2.1
import tensorflow as tf

tf.compat.v1.disable_eager_execution()    

t = tf.constant(42.0)
sess = tf.compat.v1.Session()
with sess.as_default():   # or `with sess:` to close on exit
    assert sess is tf.compat.v1.get_default_session()
    assert t.eval() == sess.run(t)

#The most important difference is that you can use sess.run() to fetch the values of many tensors in the same step:

t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.multiply(t, u)
ut = tf.multiply(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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.