2017-05-29 48 views
6

目前,我從tf.contrib.lookup創建一個查找表,使用輸入中的訓練數據並初始化它。如何使TensorFlow查找表初始化以進行預測(而不僅僅是訓練)?

然後,我將每個輸入都通過該查找表,然後傳遞給我的操作模型。

這適用於訓練,但是當它從同一模型來網上預報,它引發錯誤:

Table not initialized 

目前,我使用SavedModel從這個保存的保存模型,然後運行預測模型。

我該如何初始化這個表,以便它保持初始化? 或者有更好的方式來保存模型,以便表始終被初始化?

回答

2

當您使用main_oplegacy_init_op kwarg將元圖添加到您的SavedModel捆綁包tf.saved_model.builder.SavedModelBuilder.add_meta_graph時,您可以指定「初始化」操作。如果您需要多個操作,您可以使用單個操作,也可以將多個操作與tf.group組合在一起。

請注意,在Cloud ML Engine中,您必須使用legacy_init_op。然而,在未來runtime_version是你將能夠使用main_op (IIRC,從runtime_version == 1.2

的saved_model模塊提供了一個內置的tf.saved_model.main_op.main_op包裹起來在單運常見的初始化操作(局部變量初始化,並表初始化)。

因此,在總結,代碼應該像這樣(改編自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() 
    ) 

注:如果您使用的是高級別庫(如tf.estimator)這應該是默認的,如果你需要指定額外的初始化操作,您可以將它們指定爲您在model_fn中傳遞給tf.estimator.EstimatorSpectf.train.Scaffold對象的一部分。

2

我想你會更好使用tf.tables_initializer()作爲legacy_init_op

tf.saved_model.main_op.main_op()除了表初始化之外,還增加了本地和全局初始化操作。 加載保存的模型並運行legacy_init_op時,它會重置您的變量,這不是您想要的。

相關問題