TensorFlow memiliki dua cara untuk mengevaluasi bagian grafik: Session.run
pada daftar variabel dan Tensor.eval
. Apakah ada perbedaan antara keduanya?
TensorFlow memiliki dua cara untuk mengevaluasi bagian grafik: Session.run
pada daftar variabel dan Tensor.eval
. Apakah ada perbedaan antara keduanya?
Jawaban:
Jika Anda memiliki huruf Tensor
t, 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 eval
dan run
akan menjalankan seluruh grafik dari awal. Untuk menyimpan hasil penghitungan dari cache, tetapkan ke a tf.Variable
.
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.
tf.multiply(t, u)
dan itu bekerja dengan baik.
Sesi FAQ tentang aliran tensor memiliki jawaban untuk pertanyaan yang persis sama . Saya hanya akan pergi dan meninggalkannya di sini:
Jika t
adalah Tensor
objek, t.eval()
adalah singkatan untuk sess.run(t)
(di mana sess
sesi 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 with
blok. 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.
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
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()
dantf.Tensor.eval()
dapatkan hasil dari sesi di manatf.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 menelepontf.get_default_session().run(op)
.
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 ().
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
tf.Tensor.eval()
dantf.Session.run()
, tetapi terhubung adalahtf.Operation.run()
dantf.Tensor.eval()
seperti yang dijelaskan di sini