Dalam TensorFlow, apa perbedaan antara Session.run () dan Tensor.eval ()?

204

TensorFlow memiliki dua cara untuk mengevaluasi bagian grafik: Session.runpada daftar variabel dan Tensor.eval. Apakah ada perbedaan antara keduanya?

Geoffrey Irving
sumber
namespace penuh tf.Tensor.eval()dan tf.Session.run(), tetapi terhubung adalah tf.Operation.run()dan tf.Tensor.eval()seperti yang dijelaskan di sini
prosti

Jawaban:

243

Jika Anda memiliki huruf Tensort, panggilan t.eval()setara dengan panggilan tf.get_default_session().run(t).

Anda dapat menjadikan sesi sebagai default sebagai berikut:

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)

Perbedaan paling penting adalah yang bisa Anda gunakan sess.run()untuk mengambil nilai banyak tensor dalam langkah yang sama:

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

Perhatikan bahwa setiap panggilan ke evaldan runakan menjalankan seluruh grafik dari awal. Untuk menyimpan hasil penghitungan dari cache, tetapkan ke a tf.Variable.

Pak
sumber
apa perbedaan dalam contoh kedua? Apakah hanya Anda dapat mengevaluasi operasi yang terpisah (atau grafik? Tidak yakin apa bedanya)?
Pinocchio
1
tunggu, apakah contoh Anda benar-benar berjalan? Saya mencoba: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) dan saya baru saja mendapat keluhan dari tensorflow bahwa bentuknya tidak cocok, saya kira lebih tepatnya, bahwa peringkatnya paling tidak 2.
Pinocchio
@ Pinocchio Saya pikir API berubah karena jawaban aslinya diposting 4 tahun yang lalu. Saya menggunakan tf.multiply(t, u)dan itu bekerja dengan baik.
yuqli
42

Sesi FAQ tentang aliran tensor memiliki jawaban untuk pertanyaan yang persis sama . Saya hanya akan pergi dan meninggalkannya di sini:


Jika tadalah Tensorobjek, t.eval()adalah singkatan untuk sess.run(t)(di mana sesssesi default saat ini. Dua potongan kode berikut ini setara:

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

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

Dalam contoh kedua, sesi bertindak sebagai manajer konteks, yang memiliki efek menginstalnya sebagai sesi default untuk masa pakai withblok. Pendekatan manajer konteks dapat menghasilkan kode yang lebih ringkas untuk kasus penggunaan sederhana (seperti tes unit); jika kode Anda berurusan dengan banyak grafik dan sesi, mungkin lebih mudah untuk panggilan eksplisit ke Session.run().

Saya sarankan Anda setidaknya membaca seluruh FAQ, karena dapat menjelaskan banyak hal.

Salvador Dali
sumber
2

eval() tidak bisa menangani objek daftar

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

tapi Session.run()bisa

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

koreksi saya jika saya salah

Yushin Liu
sumber
1

Hal yang paling penting untuk diingat:

Satu-satunya cara untuk mendapatkan konstanta, variabel (hasil apa pun) dari TenorFlow adalah sesi.

Mengetahui hal-hal lain ini mudah :

Keduanya tf.Session.run()dan tf.Tensor.eval()dapatkan hasil dari sesi di mana tf.Tensor.eval()ada jalan pintas untuk menelepontf.get_default_session().run(t)


Saya juga akan menguraikan metode tf.Operation.run()seperti di sini :

Setelah grafik diluncurkan dalam satu sesi, sebuah Operasi dapat dijalankan dengan meneruskannya ke tf.Session.run(). op.run()adalah jalan pintas untuk menelepon tf.get_default_session().run(op).

prosti
sumber
0

Dalam tensorflow Anda membuat grafik dan meneruskan nilai ke grafik itu. Grafik melakukan semua kerja keras dan menghasilkan output berdasarkan konfigurasi yang telah Anda buat dalam grafik. Sekarang, ketika Anda meneruskan nilai ke grafik, maka pertama-tama Anda harus membuat sesi tensorflow.

tf.Session()

Setelah sesi diinisialisasi maka Anda seharusnya menggunakan sesi itu karena semua variabel dan pengaturan sekarang menjadi bagian dari sesi. Jadi, ada dua cara untuk meneruskan nilai eksternal ke grafik sehingga grafik menerimanya. Salah satunya adalah memanggil .run () saat Anda menggunakan sesi yang sedang dieksekusi.

Cara lain yang pada dasarnya adalah cara pintas untuk ini adalah dengan menggunakan .eval (). Saya mengatakan pintasan karena bentuk lengkap .eval () adalah

tf.get_default_session().run(values)

Anda bisa memeriksanya sendiri. Di tempat values.eval()lari tf.get_default_session().run(values). Anda harus mendapatkan perilaku yang sama.

eval apa yang dilakukan adalah menggunakan sesi default dan kemudian menjalankan run ().

Sudeep K Rana
sumber
0

Tensorflow 2.x Kompatibel Jawaban : Konversi kode mrry ke Tensorflow 2.x (>= 2.0)untuk kepentingan komunitas.

!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
Dukungan Tensorflow
sumber