2016-08-08 13 views
10

Tôi cố gắng lưu và khôi phục đồ thị, nhưng ví dụ đơn giản nhất không hoạt động như mong đợi (được thực hiện bằng phiên bản 0.9.0 hoặc 0.10.0 trên Linux 64 mà không có CUDA bằng python 2.7 hoặc 3.5.2)tensorflow.train.import_meta_graph không hoạt động?

Trước tiên tôi tiết kiệm đồ thị như thế này:

import tensorflow as tf 
v1 = tf.placeholder('float32') 
v2 = tf.placeholder('float32') 
v3 = tf.mul(v1,v2) 
c1 = tf.constant(22.0) 
v4 = tf.add(v3,c1) 
sess = tf.Session() 
result = sess.run(v4,feed_dict={v1:12.0, v2:3.3}) 
g1 = tf.train.export_meta_graph("file") 
## alternately I also tried: 
## g1 = tf.train.export_meta_graph("file",collection_list=["v4"]) 

này tạo ra một tập tin "tập tin" mà không bị để trống và cũng đặt g1 tới cái gì đó trông giống như một nét biểu đồ thích hợp.

Sau đó, tôi cố gắng khôi phục biểu đồ này:

import tensorflow as tf 
g=tf.train.import_meta_graph("file") 

này hoạt động mà không có lỗi, nhưng không trả lại bất cứ điều gì cả.

Bất kỳ ai cũng có thể cung cấp mã cần thiết chỉ cần lưu biểu đồ cho "v4" và khôi phục hoàn toàn để chạy trong phiên mới này sẽ tạo ra cùng một kết quả không?

Trả lời

27

Để sử dụng lại MetaGraphDef, bạn sẽ cần phải ghi lại tên của các tensors thú vị trong biểu đồ ban đầu của mình. Ví dụ, trong chương trình đầu tiên, thiết lập một name lập luận rõ ràng trong định nghĩa của v1, v2v4:

v1 = tf.placeholder(tf.float32, name="v1") 
v2 = tf.placeholder(tf.float32, name="v2") 
# ... 
v4 = tf.add(v3, c1, name="v4") 

Sau đó, bạn có thể sử dụng các tên chuỗi của tensors trong đồ thị dưới gốc trong lệnh gọi sess.run() . Ví dụ, đoạn mã sau đây nên làm việc:

import tensorflow as tf 
_ = tf.train.import_meta_graph("./file") 

sess = tf.Session() 
result = sess.run("v4:0", feed_dict={"v1:0": 12.0, "v2:0": 3.3}) 

Ngoài ra, bạn có thể sử dụng tf.get_default_graph().get_tensor_by_name() để có được tf.Tensor đối tượng cho tensors quan tâm, mà sau đó bạn có thể vượt qua để sess.run():

import tensorflow as tf 
_ = tf.train.import_meta_graph("./file") 
g = tf.get_default_graph() 

v1 = g.get_tensor_by_name("v1:0") 
v2 = g.get_tensor_by_name("v2:0") 
v4 = g.get_tensor_by_name("v4:0") 

sess = tf.Session() 
result = sess.run(v4, feed_dict={v1: 12.0, v2: 3.3}) 

CẬP NHẬT: Dựa trên thảo luận trong các nhận xét, đây là ví dụ hoàn chỉnh để lưu và tải, bao gồm lưu nội dung biến. Điều này minh họa việc tiết kiệm một biến bằng cách tăng gấp đôi giá trị của biến số vx trong một hoạt động riêng biệt.

Tiết kiệm:

import tensorflow as tf 
v1 = tf.placeholder(tf.float32, name="v1") 
v2 = tf.placeholder(tf.float32, name="v2") 
v3 = tf.mul(v1, v2) 
vx = tf.Variable(10.0, name="vx") 
v4 = tf.add(v3, vx, name="v4") 
saver = tf.train.Saver([vx]) 
sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 
sess.run(vx.assign(tf.add(vx, vx))) 
result = sess.run(v4, feed_dict={v1:12.0, v2:3.3}) 
print(result) 
saver.save(sess, "./model_ex1") 

Khôi phục:

import tensorflow as tf 
saver = tf.train.import_meta_graph("./model_ex1.meta") 
sess = tf.Session() 
saver.restore(sess, "./model_ex1") 
result = sess.run("v4:0", feed_dict={"v1:0": 12.0, "v2:0": 3.3}) 
print(result) 

Điểm mấu chốt là, để làm cho việc sử dụng một mô hình lưu, bạn phải nhớ tên của ít nhất một số các nút (ví dụ như một op đào tạo, một giữ chỗ đầu vào, một tensor đánh giá, vv). Các MetaGraphDef lưu trữ danh sách các biến được chứa trong mô hình, và giúp khôi phục lại các từ một trạm kiểm soát, nhưng bạn được yêu cầu để tái tạo các tensors/hoạt động được sử dụng trong đào tạo/đánh giá các mô hình chính mình.

+0

Cảm ơn bạn rất nhiều, tôi nghĩ rằng bây giờ hàm import_meta_graph chỉ cập nhật biểu đồ mặc định và không được phép trả về bất kỳ thứ gì hữu ích. Ngoài ra, không có cách nào để truy cập những gì tôi cần từ biểu đồ mặc định trừ khi tôi đã gán tên cho nó ban đầu. Và rõ ràng, ": 0" trong tên được sử dụng sau khi khôi phục bằng cách nào đó được sử dụng để phân biệt các hoạt động từ đầu ra của nó. – Johsm

+0

Đúng vậy.Giá trị trả về từ 'import_meta_graph()' là 'tf.train.Saver', chỉ hữu ích nếu biểu đồ của bạn chứa các biến mà bạn muốn khôi phục. – mrry

+0

Ah phải, vì vậy các giá trị của các biến trong mô hình không được lưu và khôi phục tự động bằng cách này? Giả sử rằng v4 cũng sẽ phụ thuộc vào một số lượng chưa biết của các biến được huấn luyện, mã sẽ lưu trữ chúng là gì và sau đó khôi phục chúng sau này? Mã ví dụ của tôi chỉ có nghĩa là dễ dàng, nhưng tôi chỉ muốn lưu một mô hình được đào tạo, sau đó sử dụng nó. Vì vậy, lưu mô hình được đào tạo sẽ có nghĩa là tôi muốn lưu đồ thị cộng với tất cả các giá trị biến mà chúng có tại thời điểm lưu và sau đó khôi phục lại sau đó. – Johsm