2016-07-28 11 views
6

Tôi đã viết một CNN lưu lượng và nó đã được đào tạo. Tôi muốn khôi phục nó để chạy nó trên một vài mẫu nhưng tiếc là phỉ nhổ nó ra:Giá trị dòng chảyLỗi: Không có biến nào để lưu từ

ValueError: No variables to save

đang eval của tôi có thể được tìm thấy ở đây:

import tensorflow as tf 

import main 
import Process 
import Input 

eval_dir = "/Users/Zanhuang/Desktop/NNP/model.ckpt-30" 
checkpoint_dir = "/Users/Zanhuang/Desktop/NNP/checkpoint" 

init_op = tf.initialize_all_variables() 
saver = tf.train.Saver() 

def evaluate(): 
    with tf.Graph().as_default() as g: 
    sess.run(init_op) 

    ckpt = tf.train.get_checkpoint_state(checkpoint_dir) 

    saver.restore(sess, eval_dir) 

    images, labels = Process.eval_inputs(eval_data = eval_data) 

    forward_propgation_results = Process.forward_propagation(images) 

    top_k_op = tf.nn.in_top_k(forward_propgation_results, labels, 1) 

    print(top_k_op) 

def main(argv=None): 
    evaluate() 

if __name__ == '__main__': 
    tf.app.run() 

Trả lời

10

Các tf.train.Saver phải được tạo ra sau các biến mà bạn muốn khôi phục (hoặc lưu). Ngoài ra, nó phải được tạo trong cùng một biểu đồ như các biến đó.

Giả sử rằng Process.forward_propagation(…) cũng tạo ra các biến trong mô hình của bạn, thêm sự sáng tạo tiết kiệm sau khi dòng này nên làm việc:

forward_propgation_results = Process.forward_propagation(images) 

Bên cạnh đó, bạn phải vượt qua mới tf.Graph mà bạn đã tạo cho các nhà xây dựng tf.Session vì vậy bạn sẽ cần phải di chuyển việc tạo ra sess bên trong khối with đó.

Chức năng kết quả sẽ là một cái gì đó như:

def evaluate(): 
    with tf.Graph().as_default() as g: 
    images, labels = Process.eval_inputs(eval_data = eval_data) 
    forward_propgation_results = Process.forward_propagation(images) 
    init_op = tf.initialize_all_variables() 
    saver = tf.train.Saver() 
    top_k_op = tf.nn.in_top_k(forward_propgation_results, labels, 1) 

    with tf.Session(graph=g) as sess: 
    sess.run(init_op) 
    saver.restore(sess, eval_dir) 
    print(sess.run(top_k_op)) 
+0

Cảm ơn bạn rất nhiều, mặc dù tôi đã loại bỏ các dữ liệu eval = dữ liệu eval và nó vẫn phải làm việc. Ngay bây giờ khi tôi chạy chương trình, python không xuất ra bất cứ thứ gì. –

+0

Tôi không chắc chắn nơi 'eval_data' đến từ đâu, vì tên đó không bị ràng buộc trong ví dụ của bạn. 'Process.eval_inputs()' có sử dụng đường dẫn đầu vào không? Có lẽ bạn cần thêm 'tf.train.start_queue_runners (sess = sess) sau khi chạy' saver.restore() '. – mrry

+0

Cảm ơn bạn. Mã đã được sửa nhưng một lỗi mới đã xuất hiện sau khi thêm dòng đó. E tensorflow/core/client/tensor_c_api.cc: 485] các mục tiêu [0] nằm ngoài phạm vi –

Các vấn đề liên quan