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

TF1ハブ形式

2018年の立ち上げ時に、TensorFlow Hubは、TensorFlow1プログラムにインポートするためのTF1Hub形式という単一のタイプのアセットを提供しました。

このページでは、 hub.Moduleクラスおよび関連するAPIを使用してTF1(またはTF2のTF1互換モード)でTF1ハブ形式を使用する方法について説明します。 (一般的な使用法は、TF1ハブ形式の1つ以上のモデルをtf.compat.layersまたはtf.layersと組み合わせることにより、おそらくTF1 Estimator内でtf.Graphを作成することtf.layers )。

TensorFlow 2(TF1互換モード外)のユーザーはhub.load()またはhub.KerasLayer新しいAPIを使用する必要があります。新しいAPIは、新しいTF2 SavedModelアセットタイプをロードしますが、 TF1ハブ形式をTF2にロードするためのサポートも制限されています。

TF1ハブ形式のモデルを使用する

TF1ハブ形式でのモデルのインスタンス化

TF1ハブ形式のモデルは、URLまたはファイルシステムパスを含む文字列からhub.Moduleオブジェクトを作成することにより、TensorFlowプログラムにインポートされます。

m = hub.Module("path/to/a/module_dir")

これにより、モジュールの変数が現在のTensorFlowグラフに追加されます。初期化子を実行すると、事前にトレーニングされた値がディスクから読み取られます。同様に、テーブルやその他の状態がグラフに追加されます。

キャッシングモジュール

URLからモジュールを作成すると、モジュールの内容がダウンロードされ、ローカルシステムの一時ディレクトリにキャッシュされます。モジュールがキャッシュされる場所は、 TFHUB_CACHE_DIR環境変数を使用してオーバーライドできます。詳細については、キャッシングを参照してください。

モジュールの適用

インスタンス化されると、モジュールmは、テンソル入力からテンソル出力へのPython関数のように0回以上呼び出すことができます。

y = m(x)

このような呼び出しはそれぞれ、現在のTensorFlowグラフに操作を追加して、 xからyを計算します。これにトレーニングされた重みを持つ変数が含まれる場合、これらはすべてのアプリケーション間で共有されます。

モジュールは、複数の方法で適用できるようにするために、複数の名前付き署名を定義できます(Pythonオブジェクトにメソッドがある場合と同様)。モジュールのドキュメントには、使用可能な署名が記載されている必要があります。上記の呼び出しは、 "default"という名前の署名を適用し"default" 。オプションのsignature=引数に名前を渡すことで、任意のsignature=を選択できます。

署名に複数の入力がある場合は、署名で定義されたキーを使用して、それらをdictとして渡す必要があります。同様に、署名に複数の出力がある場合、署名で定義されたキーの下でas_dict=Trueを渡すことにより、これらをdictとして取得できます(キー"default"は、 as_dict=False場合に返される単一の出力用"default" )。したがって、モジュールを適用する最も一般的な形式は次のようになります。

outputs = m(dict(apples=x1, oranges=x2), signature="fruit_to_pet", as_dict=True)
y1 = outputs["cats"]
y2 = outputs["dogs"]

呼び出し元は、署名によって定義されたすべての入力を提供する必要がありますが、モジュールのすべての出力を使用する必要はありません。 TensorFlowは、 tf.Session.run()ターゲットの依存関係として終了するモジュールの部分のみを実行します。実際、モジュールの発行者は、メインの出力とともに、高度な用途(中間層のアクティブ化など)のためにさまざまな出力を提供することを選択できます。モジュールコンシューマーは、追加の出力を適切に処理する必要があります。

代替モジュールを試す

同じタスクに複数のモジュールがある場合は常に、TensorFlow Hubは、互換性のあるシグニチャ(インターフェイス)をモジュールに装備することをお勧めします。これにより、モジュールハンドルを文字列値のハイパーパラメータとして変更するのと同じくらい簡単に、異なるシグニチャを試すことができます。

この目的のために、人気のあるタスクに推奨される共通署名のコレクションを維持しています。

新しいモジュールの作成

互換性に関する注意

TF1ハブ形式はTensorFlow1を対象としています。TensorFlow2のTFハブでは部分的にのみサポートされています。代わりに、新しいTF2SavedModel形式での公開を検討してください。

TF1ハブ形式は構文レベル(同じファイル名とプロトコルメッセージ)でTensorFlow 1のSavedModel形式に似ていますが、モジュールの再利用、構成、再トレーニングを可能にするために意味的に異なります(たとえば、リソース初期化子の異なるストレージ、異なるタグ付け)メタグラフの規則)。ディスク上でそれらをtfhub_module.pb最も簡単な方法は、 tfhub_module.pbファイルの有無です。

一般的方法

新しいモジュールを定義するために、パブリッシャーは関数module_fnしてhub.create_module_spec()を呼び出します。この関数は、呼び出し元が提供する入力にtf.placeholder()を使用して、モジュールの内部構造を表すグラフを作成します。次に、 hub.add_signature(name, inputs, outputs) 1回以上呼び出すことにより、署名を定義します。

例えば:

def module_fn():
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.dense(inputs, 200)
  layer2 = tf.layers.dense(layer1, 100)
  outputs = dict(default=layer2, hidden_activations=layer1)
  # Add default signature.
  hub.add_signature(inputs=inputs, outputs=outputs)

...
spec = hub.create_module_spec(module_fn)

パスの代わりにhub.create_module_spec()の結果を使用して、特定のTensorFlowグラフ内のモジュールオブジェクトをインスタンス化できます。このような場合、チェックポイントはなく、モジュールインスタンスは代わりに変数初期化子を使用します。

すべてのモジュールインスタンスは、そのexport(path, session)メソッドを介してディスクにシリアル化できます。モジュールをエクスポートすると、その定義がsession中の変数の現在の状態とともに、渡されたパスにシリアル化されます。これは、モジュールを初めてエクスポートするとき、および微調整されたモジュールをエクスポートするときに使用できます。

TensorFlow推定量との互換性のため、 hub.LatestModuleExporter最新のチェックポイントから、ちょうどのような輸出モジュールtf.estimator.LatestExporter 、最新のチェックポイントからモデル全体をエクスポートします。

モジュールの発行者は、可能な場合は共通の署名を実装する必要があります。これにより、消費者はモジュールを簡単に交換して、問題に最適なモジュールを見つけることができます。

実際の例

一般的なテキスト埋め込み形式からモジュールを作成する方法の実際の例については、テキスト埋め込みモジュールエクスポーターご覧ください。

微調整

インポートされたモジュールの変数をその周りのモデルの変数と一緒にトレーニングすることを微調整と呼びます。微調整により品質が向上する可能性がありますが、新たな問題が発生します。消費者には、より単純な品質の調整を検討した後で、モジュールの発行者が推奨する場合にのみ、微調整を検討することをお勧めします。

消費者向け

微調整を有効にするには、 hub.Module(..., trainable=True)を使用してモジュールをインスタンス化し、変数をトレーニング可能にして、TensorFlowのREGULARIZATION_LOSSESをインポートします。モジュールに複数のグラフバリアントがある場合は、トレーニングに適したものを選択してください。通常、これはタグ{"train"}付いたものです。

事前にトレーニングされたウェイトを台無しにしないトレーニング体制を選択します。たとえば、最初からトレーニングする場合よりも学習率が低くなります。

出版社向け

消費者が微調整しやすくするために、次の点に注意してください。

  • 微調整には正則化が必要です。モジュールはREGULARIZATION_LOSSESコレクションとともにエクスポートされます。これにより、 tf.layers.dense(..., kernel_regularizer=...)などの選択が、コンシューマーがtf.losses.get_regularization_losses()から取得するものになります。 L1 / L2正則化損失を定義するこの方法をお勧めします。

  • パブリッシャーモデルでは、 tf.train.FtrlOptimizertf.train.ProximalGradientDescentOptimizer 、およびその他の近位オプティマイザーのl1_およびl2_regularization_strengthパラメーターを介してL1 / L2正則化を定義することは避けてください。これらはモジュールと一緒にエクスポートされないため、正規化の強度をグローバルに設定することは、コンシューマーにとって適切でない場合があります。ワイド(スパース線形)またはワイド&ディープモデルでのL1正則化を除いて、代わりに個別の正則化損失を使用できるはずです。

  • ドロップアウト、バッチ正規化、または同様のトレーニング手法を使用する場合は、それらのハイパーパラメータを、予想される多くの用途で意味のある値に設定します。ドロップアウト率は、ターゲットの問題の過剰適合の傾向に合わせて調整する必要がある場合があります。バッチ正規化では、運動量(別名減衰係数)は、小さなデータセットや大きなバッチで微調整できるように十分に小さくする必要があります。上級者向けには、重要なハイパーパラメータの制御を公開する署名を追加することを検討してください。