(入力として)トレーニングデータを使用して、- tf.contrib.lookup
からルックアップテーブルを作成します。次に、すべての入力をそのルックアップテーブルに渡してから、モデルに渡します。
これはトレーニングでは機能しますが、この同じモデルからのオンライン予測になると、エラーが発生します。
テーブルが初期化されていません
モデルの保存にSavedModel
を使用しています。この保存されたモデルから予測を実行します。
このテーブルを初期化したままにするにはどうすればよいですか?または、テーブルが常に初期化されるようにモデルを保存するより良い方法はありますか?
tf.saved_model.builder.SavedModelBuilder.add_meta_graph
またはmain_op
kwargを使用して、メタグラフを legacy_init_op
でSavedModelバンドルに追加するときに、「初期化」操作を指定できます。単一の操作を使用するか、複数の操作が必要な場合はtf.group
を使用して複数の操作をグループ化できます。
Cloud ML Engineでは、legacy_init_op
を使用する必要があることに注意してください。ただし、今後はruntime_version
sで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内。
_legacy_init_op
_としてtf.tables_initializer()
を使用した方がよいと思います。
tf.saved_model.main_op.main_op()
は、テーブルの初期化に加えて、ローカルおよびグローバルの初期化オペレーションも追加します。保存したモデルをロードして_legacy_init_op
_を実行すると、変数がリセットされますが、これは望ましいことではありません。