TensorFlowには、グラフの一部を評価する方法が2つあります。Session.run
変数のリストとですTensor.eval
。これら2つの間に違いはありますか?
TensorFlowには、グラフの一部を評価する方法が2つあります。Session.run
変数のリストとですTensor.eval
。これら2つの間に違いはありますか?
回答:
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
グラフ全体を最初から実行することに注意してください。計算の結果をキャッシュするには、それをに割り当てtf.Variable
ます。
a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b)
そして、形状が一致しないというテンソルフローから苦情を受けました、もっと正確に言うと、ランクは少なくとも2でなければならないということです
tf.multiply(t, u)
、それはうまくいきました。
テンソルフローに関する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全体を少なくとも読み飛ばすことをお勧めします。
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))
私が間違っている場合は修正してください
覚えておくべき最も重要なこと:
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)
。
tensorflowでは、グラフを作成し、そのグラフに値を渡します。グラフはすべてのハードワークを実行し、グラフで行った構成に基づいて出力を生成します。次に、値をグラフに渡す場合、最初にテンソルフローセッションを作成する必要があります。
tf.Session()
セッションが初期化されると、すべての変数と設定がセッションの一部になるため、そのセッションを使用することになります。したがって、グラフがそれらを受け入れるようにグラフに外部値を渡すには2つの方法があります。1つは、実行中のセッションを使用しているときに.run()を呼び出すことです。
基本的にこれへのショートカットである他の方法は、.eval()を使用することです。.eval()の完全な形式は
tf.get_default_session().run(values)
自分で確認できます。values.eval()
走る場所でtf.get_default_session().run(values)
。同じ動作をする必要があります。
evalが行っていることは、デフォルトのセッションを使用してからrun()を実行することです。
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
tf.Tensor.eval()
とtf.Session.run()
が、接続はされているtf.Operation.run()
とtf.Tensor.eval()
で説明したように、ここで