TensorFlow มีสองวิธีในการประเมินผลการมีส่วนร่วมของกราฟ: อยู่ในรายชื่อของตัวแปรและSession.run
Tensor.eval
มีความแตกต่างระหว่างสองคนนี้หรือไม่?
TensorFlow มีสองวิธีในการประเมินผลการมีส่วนร่วมของกราฟ: อยู่ในรายชื่อของตัวแปรและSession.run
Tensor.eval
มีความแตกต่างระหว่างสองคนนี้หรือไม่?
คำตอบ:
หากคุณมี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
แคชผลของการคำนวณที่กำหนดให้
a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b)
และฉันเพิ่งได้รับการร้องเรียนจากเทนเซอร์กระแสที่รูปร่างไม่ตรงกันฉันเดาได้แม่นยำมากขึ้นว่าอันดับต้องมีอย่างน้อย 2
tf.multiply(t, u)
และมันก็ใช้ได้ดี
เซสชันคำถามที่พบบ่อยเกี่ยวกับการไหลของเมตริกซ์มีคำตอบสำหรับคำถามเดียวกันทั้งหมด ฉันจะไปข้างหน้าและทิ้งไว้ที่นี่:
ถ้า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()
ถ้าข้อเสนอที่รหัสของคุณด้วยกราฟและหลายครั้งมันอาจจะตรงไปตรงมามากขึ้นในการโทรที่ชัดเจนในการ
ฉันขอแนะนำให้คุณอย่างน้อยอ่านตลอดคำถามที่พบบ่อยทั้งหมดเพราะมันอาจจะอธิบายได้หลายอย่าง
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)
ใน Tenorflow คุณสร้างกราฟและส่งผ่านค่าไปยังกราฟนั้น กราฟทำงานหนักทั้งหมดและสร้างผลลัพธ์ตามการกำหนดค่าที่คุณทำในกราฟ ตอนนี้เมื่อคุณส่งค่าไปยังกราฟจากนั้นก่อนอื่นคุณต้องสร้างเซสชันการดึงข้อมูล
tf.Session()
เมื่อเริ่มต้นเซสชันแล้วคุณควรจะใช้เซสชันนั้นเนื่องจากตัวแปรและการตั้งค่าทั้งหมดเป็นส่วนหนึ่งของเซสชัน ดังนั้นมีสองวิธีในการส่งผ่านค่าภายนอกไปยังกราฟเพื่อให้กราฟยอมรับพวกเขา สิ่งหนึ่งคือการเรียกใช้. run () ในขณะที่คุณกำลังใช้งานเซสชันที่กำลังดำเนินการอยู่
วิธีอื่นซึ่งโดยทั่วไปทางลัดนี้คือการใช้. eval () ฉันพูดทางลัดเพราะรูปแบบเต็มของ. eval () คือ
tf.get_default_session().run(values)
คุณสามารถตรวจสอบได้ด้วยตัวเอง ในสถานที่ของการทำงานvalues.eval()
tf.get_default_session().run(values)
คุณต้องได้รับพฤติกรรมเดียวกัน
สิ่งที่ eval กำลังทำอยู่คือการใช้เซสชันเริ่มต้นจากนั้นเรียกใช้งาน run ()
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
tf.Tensor.eval()
และtf.Session.run()
แต่เชื่อมต่อกันtf.Operation.run()
และtf.Tensor.eval()
ได้อธิบายไว้ที่นี่แล้ว