2017-04-06 25 views
11

Tôi đang cố gắng khởi động lại chương trình đào tạo mô hình trong TensorFlow bằng cách chọn địa điểm đã dừng. Tôi muốn sử dụng thêm gần đây (0.12+ tôi nghĩ) import_meta_graph() để không tái tạo lại biểu đồ.Python TensorFlow: Cách khởi động lại chương trình đào tạo với trình tối ưu hóa và import_meta_graph?

Tôi đã xem giải pháp cho điều này, ví dụ: Tensorflow: How to save/restore a model?, nhưng tôi gặp sự cố với AdamOptimizer, cụ thể là tôi nhận được lỗi ValueError: cannot add op with name <my weights variable name>/Adam as that name is already used. This can be fixed by initializing, nhưng sau đó giá trị mô hình của tôi bị xóa!

Có các câu trả lời khác và một số ví dụ đầy đủ ở đó, nhưng chúng luôn có vẻ cũ hơn và do đó không bao gồm cách tiếp cận import_meta_graph() mới hơn hoặc không có trình tối ưu hóa không phải là tensor. Câu hỏi gần nhất tôi có thể tìm thấy là tensorflow: saving and restoring session nhưng không có giải pháp cắt rõ ràng cuối cùng và ví dụ là khá phức tạp.

Lý tưởng nhất là tôi muốn một ví dụ đơn giản có thể chạy bắt đầu từ đầu, dừng lại, sau đó chọn lại. Tôi có một cái gì đó hoạt động (dưới đây), nhưng cũng tự hỏi nếu tôi đang thiếu một cái gì đó. Chắc chắn tôi không phải là người duy nhất làm điều này?

+0

Tôi gặp vấn đề tương tự với AdamOptimizer. Tôi quản lý để có được những thứ để làm việc bằng cách đặt ops của tôi trong bộ sưu tập. Ví dụ này đã giúp tôi rất nhiều: http://www.seaandsailor.com/tensorflow-checkpointing.html –

Trả lời

4

Đây là những gì tôi nghĩ ra từ việc đọc tài liệu, các giải pháp tương tự khác và thử nghiệm và báo lỗi. Đó là một bộ mã hóa tự động đơn giản trên dữ liệu ngẫu nhiên. Nếu chạy, sau đó chạy lại, nó sẽ tiếp tục từ nơi nó bị tắt (tức là hàm chi phí trong lần chạy đầu tiên đi từ ~ 0.5 -> 0.3 giây bắt đầu chạy ~ 0.3). Trừ khi tôi bỏ lỡ một cái gì đó, tất cả các tiết kiệm, xây dựng, xây dựng mô hình, add_to_collection có cần thiết và theo một thứ tự chính xác, nhưng có thể có một cách đơn giản hơn.

Và có, tải biểu đồ với import_meta_graph không thực sự cần thiết ở đây vì mã ở ngay trên, nhưng là những gì tôi muốn trong ứng dụng thực tế của mình.

from __future__ import print_function 
import tensorflow as tf 
import os 
import math 
import numpy as np 

output_dir = "/root/Data/temp" 
model_checkpoint_file_base = os.path.join(output_dir, "model.ckpt") 

input_length = 10 
encoded_length = 3 
learning_rate = 0.001 
n_epochs = 10 
n_batches = 10 
if not os.path.exists(model_checkpoint_file_base + ".meta"): 
    print("Making new") 
    brand_new = True 

    x_in = tf.placeholder(tf.float32, [None, input_length], name="x_in") 
    W_enc = tf.Variable(tf.random_uniform([input_length, encoded_length], 
              -1.0/math.sqrt(input_length), 
              1.0/math.sqrt(input_length)), name="W_enc") 
    b_enc = tf.Variable(tf.zeros(encoded_length), name="b_enc") 
    encoded = tf.nn.tanh(tf.matmul(x_in, W_enc) + b_enc, name="encoded") 
    W_dec = tf.transpose(W_enc, name="W_dec") 
    b_dec = tf.Variable(tf.zeros(input_length), name="b_dec") 
    decoded = tf.nn.tanh(tf.matmul(encoded, W_dec) + b_dec, name="decoded") 
    cost = tf.sqrt(tf.reduce_mean(tf.square(decoded - x_in)), name="cost") 

    saver = tf.train.Saver() 
else: 
    print("Reloading existing") 
    brand_new = False 
    saver = tf.train.import_meta_graph(model_checkpoint_file_base + ".meta") 
    g = tf.get_default_graph() 
    x_in = g.get_tensor_by_name("x_in:0") 
    cost = g.get_tensor_by_name("cost:0") 


sess = tf.Session() 
if brand_new: 
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost) 
    init = tf.global_variables_initializer() 
    sess.run(init) 
    tf.add_to_collection("optimizer", optimizer) 
else: 
    saver.restore(sess, model_checkpoint_file_base) 
    optimizer = tf.get_collection("optimizer")[0] 

for epoch_i in range(n_epochs): 
    for batch in range(n_batches): 
     batch = np.random.rand(50, input_length) 
     _, curr_cost = sess.run([optimizer, cost], feed_dict={x_in: batch}) 
     print("batch_cost:", curr_cost) 
     save_path = tf.train.Saver().save(sess, model_checkpoint_file_base) 
2

Tôi gặp vấn đề tương tự và tôi đã tìm ra điều gì sai, ít nhất là trong mã của tôi.

Cuối cùng, tôi đã sử dụng tên tệp sai trong saver.restore(). Chức năng này phải được đưa ra tên tập tin mà không có phần mở rộng tập tin, giống như saver.save() chức năng:

saver.restore(sess, 'model-1') 

thay vì

saver.restore(sess, 'model-1.data-00000-of-00001') 

Với điều này tôi làm chính xác những gì bạn muốn làm: bắt đầu từ đầu, dừng lại, sau đó nhặt lại. Tôi không cần khởi tạo trình tiết kiệm thứ hai từ tệp meta bằng cách sử dụng hàm tf.train.import_meta_graph() và tôi không cần nêu rõ tf.initialize_all_variables() sau khi khởi chạy trình tối ưu hóa.

mô hình hoàn chỉnh của tôi khôi phục trông như sau:

with tf.Session() as sess: 
    saver = tf.train.Saver() 
    sess.run(tf.global_variables_initializer()) 
    saver.restore(sess, model-1) 

Tôi nghĩ rằng trong giao thức V1 bạn vẫn phải thêm .ckpt với tên tập tin, và cho import_meta_graph() bạn vẫn cần phải thêm .meta, mà có thể gây ra một số nhầm lẫn giữa người dùng. Có lẽ điều này nên được chỉ ra rõ ràng hơn trong tài liệu.

0

Có thể có sự cố khi bạn tạo đối tượng tiết kiệm tại phiên khôi phục.

Tôi nhận được lỗi giống như lỗi của bạn khi sử dụng mã bên dưới trong phiên khôi phục.

saver = tf.train.import_meta_graph('tmp/hsmodel.meta') 
saver.restore(sess, tf.train.latest_checkpoint('tmp/')) 

Nhưng khi tôi thay đổi theo cách này,

saver = tf.train.Saver() 
saver.restore(sess, "tmp/hsmodel") 

Các lỗi đã biến mất. "tmp/hsmodel" là đường dẫn mà tôi cung cấp cho saver.save (sess, "tmp/hsmodel") trong phiên lưu.

Một ví dụ đơn giản về lưu trữ và khôi phục phiên đào tạo mạng MNIST (có chứa trình tối ưu hóa Adam) có tại đây. Điều này hữu ích đối với tôi khi so sánh với mã của tôi và khắc phục sự cố.

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/4_Utils/save_restore_model.py

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