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

TF1ハブのフォーマット

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

このページでは、 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 Hub形式を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=を選択できます。

シグネチャに複数の入力がある場合、シグネチャで定義されたキーを使用して、ディクショナリとして渡す必要があります。同様に、シグネチャに複数の出力がある場合、シグネチャによって定義されたキーの下でas_dict=Trueを渡すことにより、これらをas_dict=Trueとして取得できます(キー"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 Hub形式はTensorFlow 1向けです。これはTensorFlow 2のTF Hubで部分的にのみサポートされています。代わりに新しいTF2 SavedModel形式での公開を検討してください。

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 Estimatorsとの互換性のために、 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正則化を除いて、代わりに個別の正則化損失を使用することが可能です。

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