2016-08-07 17 views
5

Tôi đang đào tạo một mô hình trong đó vector đầu vào là đầu ra của một mô hình khác. Điều này liên quan đến việc khôi phục mô hình đầu tiên từ một tập tin trạm kiểm soát trong khi khởi tạo mô hình thứ hai từ đầu (sử dụng tf.initialize_variables()) trong cùng một quá trình.Nhiều phiên và đồ thị trong Tensorflow (trong cùng một quy trình)

Có một số lượng đáng kể mã và trừu tượng, vì vậy tôi chỉ dán các phần có liên quan tại đây.

Sau đây là mã khôi phục:

self.variables = [var for var in all_vars if var.name.startswith(self.name)] 
saver = tf.train.Saver(self.variables, max_to_keep=3) 
self.save_path = tf.train.latest_checkpoint(os.path.dirname(self.checkpoint_path)) 

if should_restore: 
    self.saver.restore(self.sess, save_path) 
else: 
    self.sess.run(tf.initialize_variables(self.variables)) 

Mỗi mô hình có phạm vi trong đồ thị và phiên riêng của mình, như thế này:

self.graph = tf.Graph() 
self.sess = tf.Session(graph=self.graph) 

with self.sess.graph.as_default(): 
    # Create variables and ops. 

Tất cả các biến trong mỗi mô hình được tạo ra trong variable_scope quản lý ngữ cảnh.

Các thức ăn hoạt động như sau:

  • Một sợi nền gọi sess.run(inference_op) trên input = scipy.misc.imread(X) và đặt kết quả trong một chặn thread-safe đợi.
  • Vòng lặp đào tạo chính đọc từ hàng đợi và gọi sess.run(train_op) trên mô hình thứ hai.

VẤN ĐỀ:
Tôi quan sát rằng các giá trị mất mát, ngay cả trong phiên đầu tiên của công tác đào tạo (mô hình thứ hai) tiếp tục thay đổi đáng kể trên chạy (và trở thành nan trong một vài lần lặp). Tôi xác nhận rằng đầu ra của mô hình đầu tiên chính xác là giống nhau mọi lúc. Nhận xét ra các sess.run của mô hình đầu tiên và thay thế nó với đầu vào giống hệt nhau từ một tập tin ngâm không hiển thị hành vi này.

Đây là train_op:

loss_op = tf.nn.sparse_softmax_cross_entropy(network.feedforward()) 
    # Apply gradients. 
    with tf.control_dependencies([loss_op]): 
     opt = tf.train.GradientDescentOptimizer(lr) 
     grads = opt.compute_gradients(loss_op) 
     apply_gradient_op = opt.apply_gradients(grads) 

    return apply_gradient_op 

Tôi biết điều này là không rõ ràng, nhưng tôi sẵn sàng cung cấp thêm chi tiết. Bất kỳ trợ giúp được đánh giá cao!

Trả lời

1

Sự cố chắc chắn xảy ra do thực thi đồng thời các đối tượng phiên khác nhau. Tôi đã di chuyển phiên của mô hình đầu tiên từ chuỗi nền tới sợi chính, lặp lại thử nghiệm được kiểm soát nhiều lần (chạy trong hơn 24 giờ và đạt đến hội tụ) và không bao giờ quan sát được NaN. Mặt khác, việc thực hiện đồng thời phân kỳ mô hình trong vòng vài phút.

Tôi đã cấu trúc lại mã của mình để sử dụng đối tượng phiên chung cho tất cả các kiểu máy.

+0

Tôi đang đối mặt với cùng một vấn đề. Bạn có thể xây dựng giải pháp của bạn được không? –

+1

Không chạy đồng thời 'sess.run'. Tensorflow giả định kiểm soát hoàn toàn bộ nhớ GPU (tất cả được phơi sáng). Chạy 'sess.run' trong hai tiến trình hoặc luồng khác nhau đồng thời sẽ gây ra vấn đề. – Vikesh

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