2017-05-29 47 views
6

Hiện tại, tôi tạo bảng tra cứu từ tf.contrib.lookup, sử dụng dữ liệu đào tạo trong đầu vào và khởi tạo nó.Làm thế nào để giữ các bảng tra cứu TensorFlow được khởi tạo để dự đoán (và không chỉ đào tạo)?

Sau đó, tôi chuyển mỗi đầu vào thông qua bảng tra cứu đó trước khi chuyển nó qua mô hình hoạt động của tôi.

này làm việc cho đào tạo nhưng khi nói đến việc dự đoán trực tuyến từ tương tự mô hình này, nó làm tăng các lỗi:

Table not initialized 

Hiện nay, tôi đang sử dụng SavedModel để lưu các mô hình và sau đó chạy dự đoán từ lưu này mô hình.

Tôi làm cách nào để khởi tạo bảng này để nó vẫn được khởi tạo? Hoặc có cách nào tốt hơn để lưu mô hình sao cho bảng luôn được khởi tạo?

Trả lời

2

Bạn có thể chỉ định thao tác "khởi tạo" khi thêm biểu đồ meta vào gói SavedModel của mình với tf.saved_model.builder.SavedModelBuilder.add_meta_graph, sử dụng số main_op hoặc legacy_init_op kwarg. Bạn có thể sử dụng một hoạt động đơn lẻ, hoặc nhóm lại với nhau một số hoạt động với tf.group nếu bạn cần nhiều hơn một.

Lưu ý rằng trong Công cụ Cloud ML, bạn sẽ phải sử dụng legacy_init_op. Tuy nhiên trong tương lai runtime_version s bạn sẽ có thể sử dụng main_op (IIRC, bắt đầu với runtime_version == 1.2)

Module saved_model cung cấp một xây dựng trong tf.saved_model.main_op.main_op để quấn lên hành động khởi chung trong một op duy nhất (khởi biến địa phương, và bảng khởi tạo).

Vì vậy, trong Tóm lại, mã nên giống như thế này (chuyển thể từ this example):

exporter = tf.saved_model.builder.SavedModelBuilder(
     os.path.join(job_dir, 'export', name)) 

    # signature_def gets constructed here 

    with tf.Session(graph=prediction_graph) as session: 
    # Need to be initialized before saved variables are restored 
    session.run([tf.local_variables_initializer(), tf.tables_initializer()]) 
    # Restore the value of the saved variables 
    saver.restore(session, latest) 
    exporter.add_meta_graph_and_variables(
     session, 
     tags=[tf.saved_model.tag_constants.SERVING], 
     signature_def_map={ 
      tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_def 
     }, 
     # Relevant change to the linked example is here! 
     legacy_init_op=tf.saved_model.main_op.main_op() 
    ) 

Chú ý: Nếu bạn đang sử dụng các thư viện cấp cao (như tf.estimator) này nên là mặc định, và nếu bạn cần chỉ định các hành động khởi tạo bổ sung, bạn có thể chỉ định chúng như là một phần của đối tượng tf.train.Scaffold mà bạn chuyển đến tf.estimator.EstimatorSpec trong model_fn của mình.

2

Tôi nghĩ bạn nên sử dụng tf.tables_initializer() làm legacy_init_op.

tf.saved_model.main_op.main_op() cũng thêm các công cụ khởi tạo cục bộ và toàn cầu ngoài việc khởi tạo bảng. khi bạn tải mô hình đã lưu và nó chạy legacy_init_op, nó sẽ đặt lại các biến của bạn, mà không phải là những gì bạn muốn.

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