Trong TensorFlow, sự khác biệt giữa Session.run () và Tensor.eval () là gì?


204

TensorFlow có hai cách để đánh giá một phần của biểu đồ: Session.runtrên danh sách các biến và Tensor.eval. Có sự khác biệt giữa hai?


đầy đủ không gian tên tf.Tensor.eval()tf.Session.run(), nhưng kết nối được tf.Operation.run()tf.Tensor.eval()như đã giải thích ở đây
prosti

Câu trả lời:


243

Nếu bạn có một Tensort, gọi t.eval()tương đương với gọi tf.get_default_session().run(t).

Bạn có thể tạo một phiên làm mặc định như sau:

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)

Sự khác biệt quan trọng nhất là bạn có thể sử dụng sess.run()để tìm nạp các giá trị của nhiều thang đo trong cùng một bước:

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

Lưu ý rằng mỗi cuộc gọi đến evalrunsẽ thực hiện toàn bộ biểu đồ từ đầu. Để lưu trữ kết quả của một tính toán, gán nó cho a tf.Variable.


sự khác biệt trong ví dụ thứ hai là gì? Có phải chỉ là bạn có thể đánh giá các hoạt động riêng biệt (hoặc đồ thị? Không chắc chắn sự khác biệt là gì)?
Pinocchio

1
chờ đã, ví dụ của bạn có thực sự chạy không? Tôi đã thử: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) và tôi vừa nhận được khiếu nại từ tenorflow rằng các hình dạng không khớp, tôi đoán chính xác hơn, thứ hạng phải ít nhất là 2.
Pinocchio

@Pinocchio Tôi nghĩ rằng API đã thay đổi khi câu trả lời ban đầu được đăng 4 năm trước. Tôi đã sử dụng tf.multiply(t, u)và nó hoạt động tốt.
yuqli

42

Phiên FAQ về luồng tenor có câu trả lời cho chính xác cùng một câu hỏi . Tôi sẽ chỉ đi về phía trước và để nó ở đây:


Nếu tlà một Tensorđối tượng, t.eval()là tốc ký cho sess.run(t)( sessphiên là mặc định hiện tại. Hai đoạn mã sau đây là tương đương:

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

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

Trong ví dụ thứ hai, phiên hoạt động như một trình quản lý bối cảnh, có tác dụng cài đặt nó làm phiên mặc định cho vòng đời của withkhối. Phương pháp quản lý bối cảnh có thể dẫn đến mã ngắn gọn hơn cho các trường hợp sử dụng đơn giản (như kiểm tra đơn vị); nếu mã của bạn xử lý nhiều biểu đồ và phiên, có thể đơn giản hơn đối với các lệnh gọi rõ ràng đến Session.run().

Tôi khuyên bạn ít nhất nên đọc lướt qua toàn bộ Câu hỏi thường gặp, vì nó có thể làm rõ rất nhiều điều.


2

eval() không thể xử lý đối tượng danh sách

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

nhưng Session.run()có thể

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

đúng nếu tôi đã sai lầm


1

Điều quan trọng nhất cần nhớ:

Cách duy nhất để có được một hằng số, biến (bất kỳ kết quả nào) từ TenorFlow là phiên.

Biết điều này mọi thứ khác thật dễ dàng :

Cả hai tf.Session.run()tf.Tensor.eval()nhận kết quả từ phiên tf.Tensor.eval()là một phím tắt để gọitf.get_default_session().run(t)


Tôi cũng sẽ phác thảo phương pháp tf.Operation.run()như ở đây :

Sau khi biểu đồ đã được khởi chạy trong một phiên, một Hoạt động có thể được thực hiện bằng cách chuyển nó tới tf.Session.run(). op.run()là một phím tắt để gọi tf.get_default_session().run(op).


0

Trong tenorflow bạn tạo biểu đồ và truyền giá trị cho biểu đồ đó. Đồ thị thực hiện tất cả các công việc khó khăn và tạo đầu ra dựa trên cấu hình mà bạn đã thực hiện trong biểu đồ. Bây giờ Khi bạn chuyển các giá trị vào biểu đồ thì trước tiên bạn cần tạo một phiên căng thẳng.

tf.Session()

Khi phiên được khởi tạo thì bạn phải sử dụng phiên đó vì tất cả các biến và cài đặt hiện là một phần của phiên. Vì vậy, có hai cách để chuyển các giá trị bên ngoài vào biểu đồ để biểu đồ chấp nhận chúng. Một là gọi hàm .run () trong khi bạn đang sử dụng phiên đang được thực thi.

Một cách khác mà về cơ bản là một lối tắt cho điều này là sử dụng .eval (). Tôi đã nói phím tắt vì dạng đầy đủ của .eval () là

tf.get_default_session().run(values)

Bạn có thể tự kiểm tra. Tại nơi values.eval()chạy tf.get_default_session().run(values). Bạn phải có được hành vi tương tự.

những gì eval đang làm là sử dụng phiên mặc định và sau đó thực hiện run ().


0

Câu trả lời tương thích Tensorflow 2.x : Chuyển đổi mã của mrry thành Tensorflow 2.x (>= 2.0)vì lợi ích của cộng đồng.

!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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.