TensorFlow'da Session.run () ve Tensor.eval () arasındaki fark nedir?


204

TensorFlow öğesinin grafiğin bir bölümünü değerlendirmenin iki yolu vardır: Session.rundeğişkenler listesinde ve Tensor.eval. Bu ikisi arasında bir fark var mı?


tam ad alanı tf.Tensor.eval()ve tf.Session.run(), ama bağlı tf.Operation.run()ve buradatf.Tensor.eval() açıklandığı gibi
prosti

Yanıtlar:


243

Eğer bir varsa Tensort, arama t.eval()çağırmak aynıdır tf.get_default_session().run(t).

Bir oturumu aşağıdaki gibi varsayılan yapabilirsiniz:

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)

En önemli fark, sess.run()aynı adımda birçok tensörün değerlerini almak için kullanabilmenizdir :

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

Her çağrı unutmayın evalve runsıfırdan tüm grafik çalıştırır. Bir hesaplamanın sonucunu önbelleğe almak için, a tf.Variable.


ikinci örnekteki fark nedir? Sadece ayrı işlemleri (veya grafikleri? Değerlendirmenin farkın ne olduğundan emin değil misiniz) değerlendirebilmeniz mi?
Pinokyo

1
bekleyin, örneğin gerçekten çalışıyor mu? Denedim: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) ve tensorflow'dan, şekillerin eşleşmediği, daha kesin olarak, rütbenin en az 2 olması gerektiği konusunda şikayetler aldım.
Pinokyo

@Pinocchio Orijinal yanıt 4 yıl önce yayınlandıkça API'nin değiştiğini düşünüyorum. Kullandım tf.multiply(t, u)ve iyi çalıştı.
yuqli

42

Tensör akışıyla ilgili SSS oturumunda tam olarak aynı soruya bir cevap var . Sadece devam edip burada bırakacağım:


Eğer tbir olan Tensornesne, t.eval()için kısaltmadır sess.run(t)nerede ( sessgeçerli varsayılan seansı iki kod aşağıdaki parçacıkları eşdeğerdir.:

sess = tf.Session()
c = tf.constant(5.0)
print sess.run(c)

c = tf.constant(5.0)
with tf.Session():
  print c.eval()

İkinci örnekte, oturum, withbloğun ömrü boyunca varsayılan oturum olarak yüklenme etkisi olan bir bağlam yöneticisi olarak görev yapar . Bağlam yöneticisi yaklaşımı, basit kullanım durumları (birim testleri gibi) için daha özlü koda yol açabilir; kodunuz birden fazla grafik ve oturumla ilgiliyse, açık çağrılar yapmak daha kolay olabilir Session.run().

Bir sürü şeyi açıklığa kavuşturabileceği için en azından SSS'nin tamamında gözden geçirmenizi tavsiye ederim.


2

eval() liste nesnesini işleyemiyor

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

ama Session.run()yapabilir

print("grad", sess.run(grad))

Eğer Yanlışsam beni düzelt


1

Hatırlanması gereken en önemli şey:

TenorFlow'dan sabit, değişken (herhangi bir sonuç) almanın tek yolu oturumdur.

Bunu bilmek her şey kolaydır :

Hem tf.Session.run()ve tf.Tensor.eval()oturumdan sonuç almak tf.Tensor.eval()arama için bir kısayoldurtf.get_default_session().run(t)


Ayrıca buradatf.Operation.run() olduğu gibi yöntemi özetlemek istiyorum :

Grafik bir oturumda başlatıldıktan sonra, bir İşlem geçirilerek çalıştırılabilir tf.Session.run(). op.run()arama için bir kısayoldur tf.get_default_session().run(op).


0

Tensorflow'da grafikler oluşturur ve değerleri bu grafiğe geçirirsiniz. Grafik tüm çalışmayı yapar ve çıktıyı grafikte yaptığınız yapılandırmaya göre oluşturur. Şimdi grafiğe değerler ilettiğinizde, önce bir tensorflow oturumu oluşturmanız gerekir.

tf.Session()

Oturum başlatıldıktan sonra, tüm değişkenler ve ayarlar artık oturumun bir parçası olduğu için bu oturumu kullanmanız gerekir. Dolayısıyla, dış değerleri grafiğe iletmenin iki yolu vardır, böylece grafik bunları kabul eder. Bunlardan biri, yürütülmekte olan oturumu kullanırken .run () yöntemini çağırmaktır.

Temel olarak bunun bir kısayolu olan başka bir yol .eval () kullanmaktır. Kısayol dedim çünkü tam .eval () biçimi

tf.get_default_session().run(values)

Bunu kendiniz kontrol edebilirsiniz. Yerinde values.eval()vadede tf.get_default_session().run(values). Aynı davranışa sahip olmalısınız.

eval'in yaptığı şey varsayılan oturumu kullanmak ve ardından run () öğesini çalıştırmaktır.


0

Tensorflow 2.x Uyumlu Cevap : mrry'nin kodunu Tensorflow 2.x (>= 2.0)topluluk yararına dönüştürmek .

!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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.