ใน TensorFlow ความแตกต่างระหว่าง Session.run () และ Tensor.eval () คืออะไร


204

TensorFlow มีสองวิธีในการประเมินผลการมีส่วนร่วมของกราฟ: อยู่ในรายชื่อของตัวแปรและSession.run Tensor.evalมีความแตกต่างระหว่างสองคนนี้หรือไม่?


เนมสเปซเต็มรูปแบบtf.Tensor.eval()และtf.Session.run()แต่เชื่อมต่อกันtf.Operation.run()และtf.Tensor.eval()ได้อธิบายไว้ที่นี่แล้ว
prosti

คำตอบ:


243

หากคุณมีTensorเสื้อโทรเทียบเท่ากับการโทร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แคชผลของการคำนวณที่กำหนดให้


อะไรคือความแตกต่างในตัวอย่างที่สอง มันเป็นเพียงแค่คุณประเมินการแยกการดำเนินงาน (หรือกราฟไม่แน่ใจว่าแตกต่าง)
Pinocchio

1
เดี๋ยวก่อนตัวอย่างของคุณทำงานจริงหรือ ฉันพยายาม: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) และฉันเพิ่งได้รับการร้องเรียนจากเทนเซอร์กระแสที่รูปร่างไม่ตรงกันฉันเดาได้แม่นยำมากขึ้นว่าอันดับต้องมีอย่างน้อย 2
Pinocchio

@Pinocchio ฉันคิดว่า API เปลี่ยนไปเมื่อคำตอบเดิมถูกโพสต์เมื่อ 4 ปีที่แล้ว ฉันใช้tf.multiply(t, u)และมันก็ใช้ได้ดี
yuqli

42

เซสชันคำถามที่พบบ่อยเกี่ยวกับการไหลของเมตริกซ์มีคำตอบสำหรับคำถามเดียวกันทั้งหมด ฉันจะไปข้างหน้าและทิ้งไว้ที่นี่:


ถ้า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()

ในตัวอย่างที่สองเซสชันทำหน้าที่เป็นตัวจัดการบริบทซึ่งมีผลในการติดตั้งเป็นเซสชันเริ่มต้นสำหรับอายุการใช้งานของwithบล็อก วิธีการจัดการบริบทสามารถนำไปสู่รหัสรัดกุมมากขึ้นสำหรับกรณีการใช้งานง่าย (เช่นการทดสอบหน่วย); Session.run()ถ้าข้อเสนอที่รหัสของคุณด้วยกราฟและหลายครั้งมันอาจจะตรงไปตรงมามากขึ้นในการโทรที่ชัดเจนในการ

ฉันขอแนะนำให้คุณอย่างน้อยอ่านตลอดคำถามที่พบบ่อยทั้งหมดเพราะมันอาจจะอธิบายได้หลายอย่าง


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

ใน Tenorflow คุณสร้างกราฟและส่งผ่านค่าไปยังกราฟนั้น กราฟทำงานหนักทั้งหมดและสร้างผลลัพธ์ตามการกำหนดค่าที่คุณทำในกราฟ ตอนนี้เมื่อคุณส่งค่าไปยังกราฟจากนั้นก่อนอื่นคุณต้องสร้างเซสชันการดึงข้อมูล

tf.Session()

เมื่อเริ่มต้นเซสชันแล้วคุณควรจะใช้เซสชันนั้นเนื่องจากตัวแปรและการตั้งค่าทั้งหมดเป็นส่วนหนึ่งของเซสชัน ดังนั้นมีสองวิธีในการส่งผ่านค่าภายนอกไปยังกราฟเพื่อให้กราฟยอมรับพวกเขา สิ่งหนึ่งคือการเรียกใช้. run () ในขณะที่คุณกำลังใช้งานเซสชันที่กำลังดำเนินการอยู่

วิธีอื่นซึ่งโดยทั่วไปทางลัดนี้คือการใช้. eval () ฉันพูดทางลัดเพราะรูปแบบเต็มของ. eval () คือ

tf.get_default_session().run(values)

คุณสามารถตรวจสอบได้ด้วยตัวเอง ในสถานที่ของการทำงานvalues.eval() tf.get_default_session().run(values)คุณต้องได้รับพฤติกรรมเดียวกัน

สิ่งที่ eval กำลังทำอยู่คือการใช้เซสชันเริ่มต้นจากนั้นเรียกใช้งาน run ()


0

Tensorflow 2.x คำตอบที่เข้ากันได้ : การแปลงรหัสของ mrry เพื่อTensorflow 2.x (>= 2.0)ประโยชน์ของชุมชน

!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.