web-dev-qa-db-ja.com

(トレーニングだけでなく)予測のためにルックアップテーブルを初期化しておく方法は?

(入力として)トレーニングデータを使用して、- tf.contrib.lookup からルックアップテーブルを作成します。次に、すべての入力をそのルックアップテーブルに渡してから、モデルに渡します。

これはトレーニングでは機能しますが、この同じモデルからのオンライン予測になると、エラーが発生します。

テーブルが初期化されていません

モデルの保存にSavedModelを使用しています。この保存されたモデルから予測を実行します。

このテーブルを初期化したままにするにはどうすればよいですか?または、テーブルが常に初期化されるようにモデルを保存するより良い方法はありますか?

17
aka

tf.saved_model.builder.SavedModelBuilder.add_meta_graphまたはmain_op kwargを使用して、メタグラフを legacy_init_op でSavedModelバンドルに追加するときに、「初期化」操作を指定できます。単一の操作を使用するか、複数の操作が必要な場合はtf.groupを使用して複数の操作をグループ化できます。

Cloud ML Engineでは、legacy_init_opを使用する必要があることに注意してください。ただし、今後はruntime_versionsでmain_opを使用できるようになります(IIRC、runtime_version == 1.2で始まる)

Saved_modelモジュールは、組み込みの tf.saved_model.main_op.main_op を提供して、一般的な初期化アクションを単一のop(ローカル変数の初期化、およびテーブルの初期化)にまとめます。

要約すると、コードは次のようになります( この例 から変更):

  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 など)を使用している場合は、これがデフォルトであり、追加の初期化アクションを指定する必要がある場合は、それらを-の一部として指定できます。 tf.train.Scaffold モデルに渡すオブジェクト tf.estimator.EstimatorSpec model_fn内。

6
Eli Bixby

_legacy_init_op_としてtf.tables_initializer()を使用した方がよいと思います。

tf.saved_model.main_op.main_op()は、テーブルの初期化に加えて、ローカルおよびグローバルの初期化オペレーションも追加します。保存したモデルをロードして_legacy_init_op_を実行すると、変数がリセットされますが、これは望ましいことではありません。

11
user8272338