TensorFlow Hub : コモン・シグネチャ (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
再作成日時 : 04/11/2018
* 本ページは、TensorFlow の本家サイトの Hub – Common Signatures 3編を翻訳した上で適宜、補足説明したものです:
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
モジュールのためのコモン・シグネチャ
イントロダクション
同じタスクのためのモジュールはコモン・シグネチャを実装するべきです、その結果モジュール消費者はそれらを容易に取り替えて彼らの問題のために最善の一つを見つけることができます。
このディレクトリはコモン・シグネチャの仕様を集めます。モジュールがタスクのより広い種類のために作成されるにつれて、私達はそれに時間とともに成長することを期待します。
最善のケースでは、コモン・シグネチャの仕様は、消費者がモジュールの内部について何も知ることなしに output = module(inputs) を単に呼び出せるような十分に強力な保証を提供します。もし何某かの適応が不可避である場合には、それをカプセル化するためのライブラリ関数を供給し、シグネチャに沿ってそれらをドキュメント化することを提案します。
いずれの場合でも、目標は、同じタスクに対する異なるモジュールの交換を行なうことを文字列化されたハイパーパラメータを切り替えるようにできるだけ単純にすることです。
画像のためのコモン・シグネチャ
このページは画像関連タスクのためのモジュールにより実装されるべきコモンシグネチャを記述します。
幾つかのモジュールは一つのタスク以上のために利用できます (e.g., 画像分類モジュールはある種の特徴抽出を途中で行なう傾向にあります)。従って、各モジュールは以下を提供します : (1) 公開者により想定される総てのタスクのための名前付けられたシグネチャ、そして (2) それの選定された主要タスクのためのデフォルト・シグネチャ output = m(images)。
画像特徴ベクトル
使用方法要約
画像特徴ベクトルは画像全体を表わす 1-D 密テンソルで、典型的には消費者モデルによる分類のためのものです。(CNN の中間的な活性とは違い、それは空間的な分解を与えません。画像分類 とは違い、それは公開者モデルにより学習された分類を破棄します。)
画像特徴抽出のためのモジュールは、画像のバッチを特徴ベクトルのバッチにマップするデフォルト・シグネチャを持ちます。それは次のように使用されます :
module_spec = hub.load_module_spec("path/to/module") height, width = hub.get_expected_image_size(module_spec) images = ... # A batch of images with shape [batch_size, height, width, 3]. module = hub.Module(module_spec) features = module(images) # A batch with shape [batch_size, num_features].
それはまた対応する名前付けられたシグネチャも定義します。
シグネチャ仕様
画像特徴ベクトルを抽出するための名前付けられたシグネチャは次のようにして呼び起こされます :
outputs = module(dict(images=images), signature="image_feature_vector", as_dict=True) features = outputs["default"]
入力は 画像の入力 のための一般的な慣習をフォローします。
outputs 辞書は dtype float32 そして shape [batch_size, num_features] の “default” 出力を含みます。batch_size は入力内と同じですが、グラフ構築時には知られていません。num_features は既知の、入力サイズから独立したモジュール特定の定数です。
これらの特徴ベクトルは、(画像分類のための典型的 CNN の最上端の畳み込み層から pool された特徴のように) 単純な順伝播分類器を持つ分類のために利用可能であることが意図されています。
出力特徴にドロップアウトを適用するか (あるいは否か) はモデル消費者に委ねられます。モジュールそれ自身は実際の outputs 上でドロップアウトを遂行するべきではありません (それが他の場所では内部的にドロップアウトを使用する場合でさえも)。
outputs 辞書はそれ以上の outputs、例えば、モジュール内部の隠れ層の活性を提供しても良いです。それらのキーと値はモジュール依存です。アーキテクチャ名を持つアーキテクチャ依存のキーで prefix することが推奨されます (e.g., 中間層 “InceptionV3/Mixed_5c” を最上端の畳み込み層 “InceptionV2/Mixed_5c” と混同することを回避するため)。
画像分類
使用方法要約
画像分類は画像のピクセルをモジュール公開者により選択された分類学上のクラス内のメンバーシップのための線形スコア (ロジット) にマップします。これは消費者に単にその基礎的な特徴だけではなく (cf. 画像特徴ベクトル )、公開者モジュールにより学習された特定の分類から結果を引き出すことを可能にします。
画像特徴抽出 (訳注: 原文まま) のためのモジュールは画像のバッチをロジットのバッチにマップするデフォルト・シグネチャを持ちます 。それは次のように使用されます :
module_spec = hub.load_module_spec("path/to/module") height, width = hub.get_expected_image_size(module_spec) images = ... # A batch of images with shape [batch_size, height, width, 3]. module = hub.Module(module_spec) logits = module(images) # A batch with shape [batch_size, num_classes].
それはまた対応する名前付けられたシグネチャを定義します。
シグネチャ仕様
画像特徴ベクトル (訳注: 原文まま) を抽出するための名前付けられたシグネチャは次のように呼び起こされます :
outputs = module(dict(images=images), signature="image_classification", as_dict=True) logits = outputs["default"]
outputs 辞書は dtype float32 と shape [batch_size, num_classes] の “default” 出力を含みます batch_size は入力内と同じですが、グラフ構築時には知られていません。num_classes は分類におけるクラスの数で、これは入力サイズから独立の既知の定数です。
outputs[“default”][i, c] の評価はインデックス c を持つクラスのサンプル i のメンバーシップを予測するスコアを生成します。
それはこれらのスコアが softmax (互いに排他的なクラスのため), sigmoid (直交するクラスのため), あるいは他の何かで使用されることを意図していても基礎的な分類に依存します。モジュール・ドキュメントはこれを記述して、クラス・インデックスの定義に言及するべきです。
outputs 辞書はそれ以上の outputs、例えば、モジュール内部の隠れ層の活性を提供しても良いです。それらのキーと値はモジュール依存です。アーキテクチャ名を持つアーキテクチャ依存のキーで prefix することが推奨されます (e.g., 中間層 “InceptionV3/Mixed_5c” を最上端の畳み込み層 “InceptionV2/Mixed_5c” と混同することを回避するため)。
画像入力
これは画像モジュールと画像シグネチャの総てのタイプに共通です。
入力として画像のバッチを取るシグネチャはそれらを dtype float32 そして shape [batch_size, height, width, 3] の 4-D 密 tensor として受け取ります。それらの要素は範囲 [0, 1] に正規化されたピクセルの RGB カラー値です。これは tf.images.decode_*() 続いて tf.image.convert_image_dtype(…, tf.float32) から得るものです。
画像の正確に一つ (または一つの主要な) 入力を持つモジュールはこの入力のために名前 “images” を使用します。
モジュールは任意の batch_size を受け取り、それに対応して TensorInfo.tensor_shape の最初の次元を “unknown” に設定します。最後の次元は RGB チャネルの数字 3 に固定されます。高さと幅の次元は入力画像の想定されるサイズに固定されます。(更なるワークは完全畳み込みモジュールのためのその制限は除去するかもしれません。)
モジュールの消費者は shape を直接的に調査するべきではありませんが、モジュールまたはモジュール仕様上で hub.get_expected_image_size() を呼び出すことによりサイズ情報を得るべきです、そしてそれに従って入力画像をリサイズすることが想定されます (典型的にはバッチ処理の前/間)。
単純化のために、TF-Hub モジュールは Tensor の channels_last (または NHWC) レイアウトを使用し、必要であれば channels_first (または NCHW) に書き換えることを TensorFlow のグラフ optimizer に任せます。TensorFlow バージョン 1.7 からデフォルトでそれを行なっています。
テキストのためのコモン・シグネチャ
このページは、テキスト入力を受け取るタスクのためのモジュールにより実装されるべきコモン・シグネチャを記述します。
テキスト特徴ベクトル
テキスト特徴ベクトル・モジュールはテキスト特徴からの密ベクトル表現を作成します。それは shape [batch_size] の文字列のバッチを受け取りそしてそれらを shape [batch_size, N] の float32 tensor にマップします。これはしばしば次元 N のテキスト埋め込みと呼ばれます。
基本的な使用方法
embed = hub.Module("path/to/module") representations = embed([ "A long sentence.", "single-word", "http://example.com"])
特徴カラム使用方法
feature_columns = [ hub.text_embedding_column("comment", "path/to/module", trainable=False), ] input_fn = tf.estimator.input.numpy_input_fn(features, labels, shuffle=True) estimator = tf.estimator.DNNClassifier(hidden_units, feature_columns) estimator.train(input_fn, max_steps=100)
Notes
モジュールは異なるドメイン and/or タスク上で事前訓練されています、そしてそれ故に総てのテキスト特徴ベクトル・モジュールが貴方の問題に適切であるとは限らないでしょう。E.g.: 幾つかのモジュールは単一の言語上で訓練されているでしょう。
以上