このページは Cloud Translation API によって翻訳されました。
Switch to English

TensorFlowハブを使用したTF1からTF2への移行

このページでは、TensorFlowコードをTensorFlow1からTensorFlow2に移行する際にTensorFlowHubを使い続ける方法について説明します。これは、TensorFlowの一般的な移行ガイドを補完するものです。

TF2の場合、TF Hubは、 tf.compat.v1.Graphようにtf.contrib.v1.layersを構築するためのレガシーhub.Moduleから切り替えました。代わりに、今そこにあるhub.KerasLayer構築するための他のKeras層と一緒に使用するためにtf.keras.Model (通常はTF2の新で熱心な実行環境)およびその基礎となるhub.load()低レベルのTensorFlowコードするための方法を。

hub.Module APIは、TF1およびTF2のTF1互換モードで使用するためにtensorflow_hubライブラリで引き続き使用できます。 TF1ハブ形式のモデルのみをロードできます

hub.load()hub.KerasLayerの新しいAPIは、TensorFlow 1.15(イーガーモードとグラフモード)およびTensorFlow 2で機能します。この新しいAPIは、新しいTF2 SavedModelアセットをロードでき、モデルに制限があります。互換性ガイド、TF1ハブ形式のレガシーモデル。

一般に、可能な限り新しいAPIを使用することをお勧めします。

新しいAPIの概要

hub.load()は、TensorFlowハブ(または互換性のあるサービス)からSavedModelをロードするための新しい低レベル関数です。 TF2のtf.saved_model.load()ラップします; TensorFlowのSavedModelガイドでは、結果を使用して何ができるかについて説明しています。

m = hub.load(handle)
outputs = m(inputs)

hub.KerasLayerクラスはhub.load()を呼び出し、その結果を他のKerasレイヤーと一緒にhub.load()で使用できるようにhub.load()します。 (他の方法で使用されるロードされたSavedModelの便利なラッパーでさえあるかもしれません。)

model = tf.keras.Sequential([
    hub.KerasLayer(handle),
    ...])

多くのチュートリアルでは、これらのAPIの動作を示しています。特に参照してください

Estimatorトレーニングでの新しいAPIの使用

EstimatorでTF2SavedModelを使用してパラメーターサーバーでトレーニングする場合(または、リモートデバイスに変数を配置したTF1セッションで)、tf.SessionのConfigProtoでexperimental.share_cluster_devices_in_sessionを設定する必要があります。そうしないと、エラーが発生します。 「割り当てられたデバイス '/ job:ps / Replica:0 / task:0 / device:CPU:0'はどのデバイスとも一致しません。」のように

必要なオプションは次のように設定できます

session_config = tf.compat.v1.ConfigProto()
session_config.experimental.share_cluster_devices_in_session = True
run_config = tf.estimator.RunConfig(..., session_config=session_config)
estimator = tf.estimator.Estimator(..., config=run_config)

TF2.2以降、このオプションは実験的なものではなくなり、 .experimental部分を削除できます。

レガシーモデルをTF1ハブ形式でロードする

新しいTF2SavedModelがまだユースケースで利用できず、レガシーモデルをTF1ハブ形式でロードする必要がある場合があります。 tensorflow_hubリリース0.7以降、以下に示すように、TF1ハブ形式のレガシーモデルをhub.KerasLayerと一緒に使用できます。

m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)

さらにKerasLayer指定する能力公開されtagssignatureoutput_keysignature_outputs_as_dict TF1ハブ形式とレガシーSavedModelsでレガシーモデルのより具体的な用途のために。

TF1ハブ形式の互換性の詳細については、モデル互換性ガイドを参照してください

低レベルのAPIの使用

従来のTF1ハブ形式のモデルは、 tf.saved_model.loadを介してロードできます。の代わりに

# DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)

以下を使用することをお勧めします。

# TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)

これらの例では、 m.signaturesは、署名名でキー設定されたTensorFlow具象関数の辞書です。このような関数を呼び出すと、未使用の場合でも、すべての出力が計算されます。 (これは、TF1のグラフモードの遅延評価とは異なります。)