ホーム » 「TensorFlow Hub」タグがついた投稿

タグアーカイブ: TensorFlow Hub

TensorFlow Hub : コモン・シグネチャ


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.: 幾つかのモジュールは単一の言語上で訓練されているでしょう。

 

以上


TensorFlow Hub : キーコンセプト


TensorFlow Hub : キーコンセプト (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
再作成日時 : 04/09/2018

* 本ページは、TensorFlow の本家サイトの Hub – Key Concepts 3編を翻訳した上で適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

モジュールを利用する

モジュールをインスタンス化する

TensorFlow Hub モジュールはモジュール・オブジェクトをその URL かファイルシステム・パスの文字列で作成することにより TensorFlow プログラムにインポートされます、次のようにです :

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

これはモジュール変数を現在の TensorFlow グラフに追加します。それらの initializer の実行は事前訓練された変数をディスクから読むでしょう。同様に、テーブルと他の状態がグラフに追加されます。

 

モジュールをキャッシュする

URL からモジュールを作成するとき、モジュールのコンテンツはローカルシステムの一時ディレクトリにダウンロードされてキャシュされます。モジュールがキャッシュされる位置は TFHUB_CACHE_DIR 環境変数を使用して override されます。

例えば、TFHUB_CACHE_DIR を /my_module_cache に設定して :

$ export TFHUB_CACHE_DIR=/my_module_cache

そしてそれから URL からモジュールを作成すると :

m = hub.Module("https://tfhub.dev/google/progan-128/1")

モジュールを /my_module_cache にダウンロードしてアンパックする結果になります。

 

モジュールを適用する

ひとたびインスタンス化されれば、モジュール m は tensor 入力から tensor 出力への Python 関数のようにゼロかそれ以上の回数呼び出すことができます :

y = m(x)

各々のそのような呼び出しは現在の TensorFlow グラフに x から y を計算する演算を追加します。もしこれが訓練された重みを持つ変数を伴うのであれば、これらは総てのアプリケーション間で共有されます。

モジュールは一つ以上の方法で適用されることを可能にするためにマルチに命名されたシグネチャを定義できます (Python オブジェクトがどのようにメソッドを持つかに類似しています)。モジュールのドキュメントは利用可能なシグネチャを記述するべきです。上の呼び出しは “default” と命名されたシグネチャを適用します。任意のシグネチャはその名前をオプションの signature= 引数へ渡すことにより選択できます。

もしシグネチャが複数の入力を持つのであれば、それらはシグネチャにより定義されたキーとともに、それらは dict (辞書) として渡されなければなりません。同様に、シグネチャが複数の出力を持つのであれば、シグネチャで定義されたキー下で、 それらは as_dict=True を渡すことにより辞書として取得可能です。(キー “default” は as_dict=False の場合には単一の出力が返されます。) そのためモジュールを適用する最も一般的な形式は次のようなものです :

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

呼び出し元はシグネチャで定義された総ての入力を供給しなければなりませんが、モジュールの総ての出力を使用する必要はありません。TensorFlow は tf.Session.run() でターゲット依存となるモジュールのそれらのパーツだけを実行するでしょう。実際に、モジュール公開者 (= publisher) は (中間層の活性のように) 主要な出力に沿ってより進んだ利用のために様々な出力を提供することを選択可能です。モジュール消費者 (= consumer) は追加の出力を優美に処理するべきです。

 

新しいモジュールを作成する

一般的なアプローチ

新しいモジュールを定義するためには、公開者は関数 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.fully_connected(inputs, 200)
  layer2 = tf.layers.fully_connected(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 グラフ内でモジュール・オブジェクトをインスタンス化するために使用できます。そのようなケースでは、チェックポイントはなく、そしてモジュール・インスタンスは変数 initializer を代わりに使用するでしょう。

任意のモジュール・インスタンスはその export(path, session) メソッドを通してディスクにシリアライズできます。モジュールのエクスポートはその定義をセッションのその変数の現在の状態と一緒に渡されたパスにシリアライズします。これは最初にモジュールをエクスポートするとき及び再調整されたモジュールをエクスポートするときに使用可能です。

TensorFlow Estimator との互換性のために、丁度 tf.estimator.LatestExporter がモデル全体を最新のチェックポイントからエクスポートするように、hub.LatestModuleExporter はモジュールを最新のチェックポイントからエクスポートします。

モジュール公開者は可能なときには 一般的なシグネチャ を実装するべきです、これは消費者が簡単にモジュールを取り替えて彼らの問題に最善の一つを見つけることを可能にするためです。

 

実際のサンプル

一般的なテキスト埋め込みフォーマットからどのようにモジュールを作成するかの実際の例のための私達の テキスト埋め込みモジュール・エクスポーター を見てください。

 

再調整

インポートされたモジュールの変数をそれの回りのモジュールのそれらと一緒に訓練することは再調整 (= fine-tuning) と呼ばれます。再調整はより良い品質の結果になり得ますが、新しい複雑さを追加します。消費者にはより単純な品質調整の探究の後に初めて再調整を調べることを推奨します。

 

消費者 (= Consumers) のために

再調整を有効にするには、モジュールをその変数を訓練可能にして TensorFlow の REGULARIZATION_LOSSES をインポートするために hub.Module(…, trainable=True) でインスタンス化します。モジュールが複数のグラフ・バリアントを持つ場合には、訓練のために適切な一つを確実に選択してください。通常は、それはタグ {“train”} を持つ一つです。

事前訓練された重みを台無しにしないように訓練体制を選択してください、例えば、スクラッチからの訓練のためのものよりより低い学習率です。

 

公開者 (= Publisher) のために

消費者に対して再調整をより簡単にするために、次について留意してください :

  • 再調整は正則化を必要とします。貴方のモジュールは REGULARIZATION_LOSSES コレクションでエクスポートされ、これは tf.layers.dense(…, kernel_regularizer=…) etc. の貴方の選択を消費者が tf.losses.get_regularization_losses() から得るものへと配置するものです。L1/L2 正則化損失を定義するこの方法が好ましいです。
  • 公開者モデルでは、tf.train.FtrlOptimizer の l1_ と l2_regularization_strength パラメータ、tf.train.ProximalGradientDescentOptimize、そして他の近い方の optimizer を通して L1/L2 regularization を定義することを回避します。これらはモジュールと一緒にエクスポートされず、正則化の強さの設定は消費者に対しては全体的には適切ではないかもしれません。wide (i.e. 疎線形) または wide & deep モデルの L1 正則化のため以外では、個々の正則化損失を代わりに使用するが可能です。
  • ドロップアウト、バッチ正規化、または同様の訓練テクニックを使用する場合、ドロップアウト率と他のハイパーパラメータを多くの期待される利用方法に渡り意味を持つ値に設定してください。
 

以上


TensorFlow (Hub) : Tutorials : ML at production scale : TF-Hub によるテキスト分類器の構築

TensorFlow (Hub) : Tutorials : ML at production scale : TF-Hub によるテキスト分類器の構築 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 07/16/2018 (v1.9)
作成日時 : 04/06/2018

* TensorFlow 1.9 でドキュメント構成が変わりましたので調整しました。
* 本ページは、TensorFlow の本家サイトの Tutorials – ML at production scale – How to build a simple text classifier with TF-Hub を
翻訳した上で適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

無料セミナー開催中 クラスキャット主催 人工知能 & ビジネス Web セミナー

人工知能とビジネスをテーマにウェビナー (WEB セミナー) を定期的に開催しています。スケジュールは弊社 公式 Web サイト でご確認頂けます。
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
  • Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/
Facebook: https://www.facebook.com/ClassCatJP/

 

 

TF-Hub は再利用可能なリソース、特に事前訓練された モジュール にパッケージングされた機械学習の専門技術を共有するためのプラットフォームです。このチュートリアルは2つの主要パートに体系化されます。

イントロダクション : TF-Hub でテキスト分類器を訓練する

合理的なベースラインの精度を持つ単純な感情分析器 (= sentiment classifier) を訓練するために TF-Hub テキスト埋め込みモジュールを利用します。それから私達のモデルが合理的であることを確認して精度を増すための改良を提案するために予測を解析します。

上級 : 転移学習解析

このセクションでは、estimator の精度上の効果を比較して転移学習の優位点と落とし穴を示すために各種の TF-Hub モジュールを使用します。

 

Getting started

データ

Mass et al からの Large Movie Review Dataset v1.0 タスクを解いてみます。データセットは 1 から 10 の正値によりラベル付けされた IMDB 映画レビューから成ります。タスクはレビューを negative か positive としてラベル付けすることです。

# Load all files from a directory in a DataFrame.
def load_directory_data(directory):
  data = {}
  data["sentence"] = []
  data["sentiment"] = []
  for file_path in os.listdir(directory):
    with tf.gfile.GFile(os.path.join(directory, file_path), "r") as f:
      data["sentence"].append(f.read())
      data["sentiment"].append(re.match("\d+_(\d+)\.txt", file_path).group(1))
  return pd.DataFrame.from_dict(data)

# Merge positive and negative examples, add a polarity column and shuffle.
def load_dataset(directory):
  pos_df = load_directory_data(os.path.join(directory, "pos"))
  neg_df = load_directory_data(os.path.join(directory, "neg"))
  pos_df["polarity"] = 1
  neg_df["polarity"] = 0
  return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)

# Download and process the dataset files.
def download_and_load_datasets(force_download=False):
  dataset = tf.keras.utils.get_file(
      fname="aclImdb.tar.gz", 
      origin="http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz", 
      extract=True)

  train_df = load_dataset(os.path.join(os.path.dirname(dataset), 
                                       "aclImdb", "train"))
  test_df = load_dataset(os.path.join(os.path.dirname(dataset), 
                                      "aclImdb", "test"))

  return train_df, test_df

# Reduce logging output.
tf.logging.set_verbosity(tf.logging.ERROR)

train_df, test_df = download_and_load_datasets()
train_df.head()
    Downloading data from http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
    84131840/84125825 [==============================] - 1s 0us/step
    84140032/84125825 [==============================] - 1s 0us/step

感情

極性

0

I just rented this today….heard lots of good…

1

0

1

Outrage is pretty good movie! Robert Culp was …

10

1

2

OK, as everyone has pointed out, this film is …

3

0

3

I am a current A.S.L. Student & was forced to …

4

0

4

Redundant, but again the case. If you enjoy th…

2

0

 

モデル

入力関数

Estimator フレームワーク は Pandas データフレームをラップする 入力関数 を提供します。

# Training input on the whole training set with no limit on training epochs.
train_input_fn = tf.estimator.inputs.pandas_input_fn(
    train_df, train_df["polarity"], num_epochs=None, shuffle=True)

# Prediction on the whole training set.
predict_train_input_fn = tf.estimator.inputs.pandas_input_fn(
    train_df, train_df["polarity"], shuffle=False)
# Prediction on the test set.
predict_test_input_fn = tf.estimator.inputs.pandas_input_fn(
    test_df, test_df["polarity"], shuffle=False)

 

特徴カラム

TF-Hub は、与えられたテキスト特徴上にモデルを適用して更にモジュールの出力を渡すような特徴カラムを提供します。このチュートリアルでは nnlm-en-dim128 モジュールを使用していきます。このチュートリアルの目的のために、最重要な事実は :

  • モジュールは入力として文字列の 1-D tensor の文のバッチを取ります。
  • モジュールは文の前処理に責任を負います (e.g. 句読点の除去とスペース上の分割)。
  • モジュールは任意の入力で動作します (e.g. nnlm-en-dim128 は語彙にない単語を ~20.000 バケツにハッシュします)。
embedded_text_feature_column = hub.text_embedding_column(
    key="sentence", 
    module_spec="https://tfhub.dev/google/nnlm-en-dim128/1")

 

Estimator

分類のために DNN Classifier を利用できます。

estimator = tf.estimator.DNNClassifier(
    hidden_units=[500, 100],
    feature_columns=[embedded_text_feature_column],
    n_classes=2,
    optimizer=tf.train.AdagradOptimizer(learning_rate=0.003))

 

訓練

合理的なステップ総量のために estimator を訓練します。

# Training for 1,000 steps means 128,000 training examples with the default
# batch size. This is roughly equivalent to 5 epochs since the training dataset
# contains 25,000 examples.
estimator.train(input_fn=train_input_fn, steps=1000);

 

予測

訓練とテストセットの両者に対して予測を実行します。

train_eval_result = estimator.evaluate(input_fn=predict_train_input_fn)
test_eval_result = estimator.evaluate(input_fn=predict_test_input_fn)

print "Training set accuracy: {accuracy}".format(**train_eval_result)
print "Test set accuracy: {accuracy}".format(**test_eval_result)
    Training set accuracy: 0.802160024643
    Test set accuracy: 0.792879998684

 

混同行列

誤分類の分布を理解するために混同行列を視覚的にチェックできます。

def get_predictions(estimator, input_fn):
  return [x["class_ids"][0] for x in estimator.predict(input_fn=input_fn)]

LABELS = [
    "negative", "positive"
]

# Create a confusion matrix on training data.
with tf.Graph().as_default():
  cm = tf.confusion_matrix(train_df["polarity"], 
                           get_predictions(estimator, predict_train_input_fn))
  with tf.Session() as session:
    cm_out = session.run(cm)

# Normalize the confusion matrix so that each row sums to 1.
cm_out = cm_out.astype(float) / cm_out.sum(axis=1)[:, np.newaxis]

sns.heatmap(cm_out, annot=True, xticklabels=LABELS, yticklabels=LABELS);
plt.xlabel("Predicted");
plt.ylabel("True");

 

更なる改良

  1. 感情上の回帰 : 各サンプルを極性クラスに割り当てるために分類器を使用しました。しかし私達は実際にはもう一つの利用可能なカテゴリカルな特徴を持ちます – 感情です。ここでクラスは実際にスケールを表して基礎値 (positive/negative) は連続的な範囲に上手くマップされるでしょう。分類 (DNN Classifier) の代わりに回帰 (DNN Regressor) を計算することでこのプロパティを活用できるでしょう。
  2. より巨大なモジュール : このチュートリアルのためにはメモリ消費を制限するために小さいモジュールを使用しました。より巨大な語彙と巨大な埋め込み空間を持つモジュールがあり、これらは追加の精度ポイントを与えるでしょう。
  3. パラメータ調整 : 学習率やステップ数のようなメタ・パラメータの調整により精度を改善できます、特に異なるモジュールを利用する場合にです。もし合理的な結果を得ることを望むのであれば検証セットは非常に重要です、何故ならばテストセットに上手く一般化することなしに訓練データを予測することを学習するモデルをセットアップすることは非常に容易だからです。
  4. より複雑なモデル : 各個々の単語を埋め込みそしてそれらを平均と結合することにより文埋め込みを計算するモジュールを使用しました。文の性質をより良く捕捉する sequential モジュール (e.g. Universal Sentence Encoder モジュール) もまた利用できます。あるいは2つかそれ以上の TF-Hub モジュールのアンサンブルです。
  5. 正則化 : overfitting を回避するためにある種の正則化を行なう optimizer を使用してみることができます、例えば Proximal Adagrad Optimizer です。

 

上級 : 転移学習解析

転移学習は訓練リソースをセーブして小さいデータセット上で訓練するときでさえも良いモデルの一般化を獲得することを可能にします。このパートでは、2つの異なる TF-Hub モジュールで訓練することによりこれを示します :

  • nnlm-en-dim128 – 事前訓練されたテキスト埋め込みモジュール、
  • random-nnlm-en-dim128 – テキスト埋め込みモジュール、これは nnlm-en-dim128 と同じ語彙とネットワークを持ちますが、重みは単にランダムに初期化されて実際のデータ上では決して訓練されていません。

そして2つのモードで訓練します :

  • 分類器のみを訓練する (i.e. モジュールはフリーズしています)、そして
  • モジュールと一緒に分類器を訓練する。

各種モジュールの使用がどのように精度に影響を与えられるかを見るために2つの訓練と評価を実行してみましょう。

def train_and_evaluate_with_module(hub_module, train_module=False):
  embedded_text_feature_column = hub.text_embedding_column(
      key="sentence", module_spec=hub_module, trainable=train_module)

  estimator = tf.estimator.DNNClassifier(
      hidden_units=[500, 100],
      feature_columns=[embedded_text_feature_column],
      n_classes=2,
      optimizer=tf.train.AdagradOptimizer(learning_rate=0.003))

  estimator.train(input_fn=train_input_fn, steps=1000)

  train_eval_result = estimator.evaluate(input_fn=predict_train_input_fn)
  test_eval_result = estimator.evaluate(input_fn=predict_test_input_fn)

  training_set_accuracy = train_eval_result["accuracy"]
  test_set_accuracy = test_eval_result["accuracy"]

  return {
      "Training accuracy": training_set_accuracy,
      "Test accuracy": test_set_accuracy
  }

results = {}
results["nnlm-en-dim128"] = train_and_evaluate_with_module(
    "https://tfhub.dev/google/nnlm-en-dim128/1")
results["nnlm-en-dim128-with-module-training"] = train_and_evaluate_with_module(
    "https://tfhub.dev/google/nnlm-en-dim128/1", True)
results["random-nnlm-en-dim128"] = train_and_evaluate_with_module(
    "https://tfhub.dev/google/random-nnlm-en-dim128/1")
results["random-nnlm-en-dim128-with-module-training"] = train_and_evaluate_with_module(
    "https://tfhub.dev/google/random-nnlm-en-dim128/1", True)

結果を見てみましょう。

pd.DataFrame.from_dict(results, orient="index")

訓練精度

テスト精度

nnlm-en-dim128

0.80176

0.79324

nnlm-en-dim128-with-module-training

0.94912

0.86996

random-nnlm-en-dim128

0.72244

0.67456

random-nnlm-en-dim128-with-module-training

0.76584

0.72180

既にあるパターンを見ることができますが、最初にテストセットのベースライン精度を確立するべきです – 下界は最も代表的なクラスのラベルだけを出力することで獲得できます :

estimator.evaluate(input_fn=predict_test_input_fn)["accuracy_baseline"]
0.5

最も代表的なクラスの割り当ては 50 % の精度を与えます。ここに気付くべき 2, 3 のことがあります :

  1. 多分驚くことに、モデルは固定された、ランダム埋め込みの上でも依然として学習できます。その理由は辞書の総ての単語がランダム・ベクトルにマップされた場合でさえも、estimator はその完全結合層を純粋に使用して空間を分割することができるからです。
  2. ランダム埋め込みを持つモジュールの訓練を許せば分類器だけの訓練とは反対に訓練とテスト精度の両者を増大します。
  3. 事前訓練された埋め込みを持つモジュールの訓練もまた両者の精度を増大させます。けれども訓練セット上の overfitting には注意してください。事前訓練されたモジュールの訓練は正則化をもってさえも危険であるかもしれません。埋め込み重みはもはや多様なデータ上で訓練された言語モデルを表しておらず、代わりにそれらは新しいデータセットの理想的な表現に収束するという意味でです。
 

以上



TensorFlow (Hub) : Tutorials : Images : 画像分類器を新しいカテゴリーのためにどのように再訓練するか


TensorFlow (Hub) : Tutorials : Images : 画像分類器を新しいカテゴリーのためにどのように再訓練するか (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 07/16/2018 (v1.9)
再作成日時 : 04/04/2018

* TensorFlow 1.9 でドキュメント構成が変わりましたので調整しました。
* TensorFlow Hub の画像再訓練についてのチュートリアルの翻訳です。これは TensorFlow 全体のチュートリアルの位置づけにもなっていて、転移学習による画像分類器の再訓練を Hub を利用して遂行しています
* 本ページは、TensorFlow の本家サイトの Tutorials – Images – How to Retrain an Image Classifier for New Categories を
翻訳した上で適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

現代的な物体認識モデルは数百万のパラメータを持ちます。スクラッチからの訓練はラベル付けされた多くの訓練データと多くの計算パワーを必要とします (数百の GPU-hours あるいはそれ以上)。転移学習は関連タスク上で既に訓練されたモデルのピースを取り新しいモデルでそれを再利用することによりこれらの多くをショートカットするテクニックです。このチュートリアルでは、ImageNet 上で訓練されたパワフルな画像分類器から特徴抽出機能を再利用して単純にその上で新しい分類層を訓練します。このアプローチの更なる情報については Decaf のこのペーパー を参照できます。

完全なモデルを訓練するほどには良くありませんが、これは多くのアプリケーションに対して驚くほど効果的で、中くらいの総量の訓練データ (ラベル付けされたデータの数千です、数百万ではありません) でも動作し、そして GPU がないラップトップ上で 30 分程度と少ない時間で実行できます。このチュートリアルは貴方自身の画像でサンプルスクリプトをどのように実行するかを示し、そして訓練プロセスを制御するためのオプションの幾つかを説明します。

このチュートリアルは事前訓練されたモデルのピース、あるいはいわゆるモジュールを摂取するために TensorFlow Hub を利用します。手始めに、ImageNet 上で訓練された Inception V3 アーキテクチャを持つ画像特徴抽出モジュールを使用し、後で NASNet /PNASNet そして MobileNet V1 と V2 を含む、更なるオプションへと戻ります。

 

花の(画像の)上で訓練する

どのような訓練を開始する前でも、ネットワークに認識させたい新しいクラスについて教えるための画像のセットが必要です。どのように貴方自身の画像を準備するかを説明する後のセクションがありますが、最初の利用を簡単にするために creative-commons license の花の画像のアーカイブを作成しました。花の画像のセットを得るためには、これらのコマンドを実行してください :

cd ~
curl -O http://download.tensorflow.org/example_images/flower_photos.tgz
tar xzf flower_photos.tgz

画像をひとたび得たのであれば、サンプルコードを GitHub からダウンロードできます (それはライブラリ・インストールの一部ではありません) :

mkdir ~/example_code
cd ~/example_code
curl -LO https://github.com/tensorflow/hub/raw/r0.1/examples/image_retraining/retrain.py

最も単純なケースでは retrainer はそれからこのように実行できます (およそ 30 分ほどかかります) :

python retrain.py --image_dir ~/flower_photos

このスクリプトは多くの他のオプションを持ちます。以下で完全なリストを得ることができます :

python retrain.py -h

このスクリプトは事前訓練されたモジュールをロードしてその上で新しい分類器を貴方がダウンドードした花の画像のために訓練します。完全なネットワークがその上で訓練された元の ImageNet クラスの中にどの花の種もありません。転移学習の魔法は、幾つかのオブジェクト間を識別するために訓練されたより低い層は多くの認識タスクのために変更なしに再利用可能なことです。

 

ボトルネック

貴方のマシンの速度に依存して、スクリプトは完了するのに 30 分かそれ以上かかるでしょう。最初の段階はディスクの全ての画像を解析してそれらの各々についてボトルネック値を計算してキャッシュします。「ボトルネック」 は、実際に分類を行なう最終出力層のすぐ前の層のためにしばしば使う非公式な用語です。(TensorFlow Hub はこれを「画像特徴ベクトル」と呼びます。) この最後から2番目 (= penultimate) の層は、認識するために問われる全てのクラス間を識別するために使用する分類器のために十分に良い値のセットを出力するために訓練されています。それは画像の意味あるコンパクトな要約でなければならないことを意味しています、何故ならばそれは分類器が値の非常に小さなセットにおいて良い選択を行なうために十分な情報を含まなければならないからです。最終層の再訓練が新しいクラスで動作できる理由は ImageNet の全ての 1,000 クラス間を識別するために必要な情報の類が新しい種類の物体間の識別のためにもしばしば有用であることが判明していることです。

訓練の間全ての画像は複数回再利用されて各ボトルネックの計算はかなりの時間がかかるので、繰り返し再計算する必要がないようにディスク上にこれらのボトルネック値をキャッシュすることで高速化します。デフォルトではこれらは /tmp/bottleneck ディレクトリにストアされ、そしてスクリプトを再実行するならばそれらが再利用されるのでこのパートについては再び待つ必要がありません。

 

訓練する

ボトルネック (の計算) が完了したら、ネットワークのトップ層の実際の訓練が始まります。貴方はステップの系列の出力を見るでしょう、各々の一つは訓練精度、検証精度、そして交差エントロピーを示します。訓練精度は現在の訓練バッチで使用されている画像の何パーセントが正しいクラスでラベル付けされたかを示します。検証精度は異なるセットからのランダムに選択された画像のグループ上の精度です。主な違いは訓練精度はネットワークがそれから学習可能な画像を基にしていることでそのためネットワークは訓練データのノイズに過剰適合 (過学習) する可能性があることです。ネットワークのパフォーマンスの真の尺度は訓練データに含まれないデータセット上のパフォーマンスを計測することです — これは検証精度によって測られます。 訓練精度が高いがしかし検証精度が低いままである場合には、これはネットワークが過剰適合してより一般的には役に立たない、訓練画像の特定の特徴を記憶していることを意味します。交差エントロピーは損失関数で学習プロセスが上手く進んでいるかの一見 (= glimpse) を与えてくれます。訓練の目的は損失をできるだけ小さくすることですから、短期のノイズは無視して、損失が下落傾向を保持しているかどうかを注視することにより学習が動作しているかを識別することができます。

デフォルトではこのスクリプトは 4,000 訓練ステップを実行します。各ステップは訓練セットから無作為に 10 画像を選択し、キャッシュからそれらのボトルネックを見つけて、そして予測を得るための最終層へとそれらを供給します。それからそれらの予測が実際のラベルと比較されて back-propagation プロセスを通して最終層の重みを更新します。プロセスが続くにつれてレポートされる精度が改善されることを見るはずです、そして全てのステップが終わった後で訓練と検証写真から分離されていた画像のセット上で最終的なテスト精度評価が実行されます。このテスト評価は訓練されたモデルが分類タスクでどのように遂行されるかの最良推定値です。訓練プロセスにランダムネスがあるので正確な値は実行毎に変わりますが 90% と 95 % の間の精度値を見るはずです。この数字は、モデルが完全に訓練された後で正しいラベルが与えられたテストセットの画像のパーセントを基にしています。

 

再訓練を TensorBoard で可視化する

スクリプトは TensorBoard summaries を含みます、これは再訓練を理解し、デバッグし、そして最適化することをより容易にします。例えば、重みあるいは精度が訓練の間にどのように変わるか、グラフと統計を可視化できます。

TensorBoard を launch するためには、再訓練の間またはその後でこのコマンドを実行します :

tensorboard --logdir /tmp/retrain_logs

TensorBoard が実行されたら、TensorBoard を見るために web ブラウザを localhost:6006 に navigate してください。

retrain.py スクリプトは TensorBoard summaries をデフォルトでは /tmp/retrain_logs にログ出力します。ディレクトリは –summaries_dir フラグで変更可能です。

TensorBoard の GitHub レポジトリ は TensorBoard 使用法について、チップ (tip) & トリック、そしてデバッギング情報を含むより多くの情報を持ちます。

 

再訓練されたモデルを使用する

スクリプトは貴方のカテゴリー上で訓練された新しいモデルを /tmp/output_graph.pb に、そしてラベルを含むテキストファイルを /tmp/output_labels.txt に書き出します。新しいモデルはそれにインライン化された TF-Hub モジュールと新しい分類層の両者を含んでいます。2つのファイルは両者とも C++ と Python 画像分類サンプル が読み込めるフォーマットにあるので、貴方の新しいモデルを直ちに使用開始することができます。トップ層を置き換えたので、label_image を使用している場合には例えばフラグ –output_layer=final_result によってスクリプトで新しい名前を指定する必要があります。

ここに label_image サンプルを貴方の再訓練したグラフでどのように実行するかのサンプルがあります。慣習的に、総ての TensorFlow Hub モジュールは固定範囲 [0, 1] のカラー値を持つ画像入力を受け取りますので、–input_mean や –input_std フラグを設定する必要はありません。

curl -LO https://github.com/tensorflow/tensorflow/raw/master/tensorflow/examples/label_image/label_image.py
python label_image.py \
--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \
--input_layer=Placeholder \
--output_layer=final_result \
--image=$HOME/flower_photos/daisy/21652746_cc379e0eea_m.jpg

花のラベルのリストを見るはずです、多くの場合トップはひなげし (daisy) です (各再訓練されたモデルは少し異なるかもしれませんが)。–image パラメータを貴方自身の画像でそれらを試すために置き変えることができます。

貴方自身の Python プログラムで再訓練したモデルを使用することを望むのであれば、上の label_image スクリプトは合理的な開始ポイントです。label_image ディレクトリはまた C++ コードを含み、tensorflow を貴方自身のアプリケーションと統合するためにこれをテンプレートとして使用できます。

もしデフォルトの Inception V3 モジュールが貴方のアプリケーションにとって巨大過ぎたり遅過ぎたりする場合には、貴方のネットワークをスピードアップしてスリムにするためのオプションのために後述の「他のモデル・アーキテクチャ」セクションを見てください。

 

貴方自身のカテゴリ上で訓練する

花のサンプル画像上でスクリプトを何とか動作させたならば、代わりに貴方がケアするカテゴリをそれに認識することを教えることに目を向け始めることができます。理論的には必要なことの全てはそれにサブフォルダのセットをポイントさせることで、各々はカテゴリの一つから名前付けられていてそのカテゴリからの画像のみを含みます。それを行なってサブディレクトリ (群) のルート・フォルダを –image_dir への引数として渡せば、スクリプトは花のために行なったように訓練するはずです。

以下が花のアーカイブのフォルダ構造がどのように見えるか、スクリプトが求めるレイアウトの種類の例を与えるものです :

 

 
実際には望むような精度を得るためにはある程度の作業がかかるでしょう。貴方が出会うかもしれない一般的な問題の幾つかを通して下でガイドしてみます。

 

訓練画像のセットを作成する

始める最初の場所は集めた画像に目を向けることです、何故ならば訓練で見る最も一般的な問題は供給されるデータに由来するからです。訓練が上手くいくためには、認識したい物体の各種の 100 の写真は少なくとも集めるべきです。集めれば集めるほど、訓練モデルの精度はより良くなりがちです。写真はアプリケーションが実際に遭遇するものの良い表現であることも確実にすることも必要です。例えば、全ての写真をインドアで開口部のない壁 (= blank wall) に対して撮りそしてユーザが物体をアウトドアで認識しようとするならば、デプロイした時に良い結果を見ることはおそらくないでしょう。回避すべきもう一つの落とし穴は、学習プロセスはラベル付けされた画像が互いに共通に持つ任意のものを拾ってしまうことで、それに注意を払わないのであれば有用ではないものになるでしょう。例えば物体の一つの種類を青い部屋で、他のものを緑色の部屋で撮れば、モデルはその予測を実際に大事にしたい物体の特徴ではなく、背景に基礎を置く結果になります。これを回避するためには、できる限り状況の多様性を広くして、違う時間、そして異なるデバイスで写真を撮ってみてください。

使用するカテゴリについて考えることもまた望むかもしれません。多くの異なる物理的な形をカバーする大きなカテゴリをより視覚的に明確な小さなものに分割する価値はあるかもしれません。例えば、貴方は「乗り物 (vehicle)」の代わりに「自動車 (car)」、「motorbike (バイク)」、そして「トラック (truck)」を使用するかもしれません。あなたは「閉じた世界 (closed world)」を持つのか「開いた世界 (open world)」を持つのかという問題についてもまた考える価値があります。閉じた世界では、カテゴリ分けを要求されるもの全ては既知の物体のクラスです。これは植物認識アプリケーションにも適用されるでしょう、そこではユーザは花の写真を多分撮るであろうことを知っており、従って行なわなければならないことの全てはどの種かを決定することです。対照的に歩き回るロボットは世界をさまよう時にそのカメラを通してあらゆる種類の異なるものを見るでしょう。そのケースでは見たものが不確かであるかを分類器がレポートすることを望むでしょう。これは上手くやるのは難しいですが、しかししばしばもし関連する物体のない数多くの典型的な「背景」写真を集めれば、画像フォルダの特別な「未知の (unknown)」クラスにそれらを追加できるでしょう。

画像全てが正しくラベル付けされていることを確かにするために確認することも価値があります。しばしばユーザ生成タグは私達の目的のためには当てになりません。例えば : #daisy とタグ付けされた写真は Daisy という名前の人々やキャラクターを含むかもしれません。画像を通してどのようなミスも取り除けば全体的な精度に貴方は驚くかもしれません。

 

訓練ステップ

画像に満足するならば、学習プロセスの細部を変更することで結果を改善することに目を向けられるでしょう。試すべきもっとも単純なものは –how_many_training_steps です。このデフォルトは 4,000 ですが、それを 8,000 に増やせば2倍の長さの間訓練します。精度の改善のレートはより長い間訓練すればゆっくりになりますが、あるポイントで全体として止まるでしょう (あるいは overfitting により下がりさえします)、しかし貴方のモデルについてベストで動作するものを見ることを経験できるでしょう。

 

歪める (Distortions)

画像訓練の結果を改善する一般的な方法は訓練入力をランダムな方法で変形し、クロップし、あるいは明るくすることによります。これは同じ画像の全ての可能なバリエーションのおかげで訓練データの効果的なサイズを拡張する優位点を持ち、分類器の現実的な利用で起きる歪みを処理することをネットワークが学習することを助ける傾向にあります。スクリプトでこれらの歪みを有効にする最大の不利益はボトルネック・キャッシングがもはや利用できないことです、何故ならば入力画像はもはや正確には再利用できないからです。これは訓練プロセスが非常に長くなる (数時間) ことを意味しますので、合理的に満足できるモデルを一度得てからモデルの再調整の方法としてこれを試すことを推奨します。

これらの歪みはスクリプトに –random_crop, –random_scale そして –random_brightness を渡すことで有効になります。これらは全てパーセント値で各画像に歪みの各々をどのくらい適用するかを制御します。それらの各々について 5 あるいは 10 の値から始めるのが合理的でそれからどれがアプリケーションに有用であるかを見る実験をします。–flip_left_right はランダムに画像の半分を水平に反転します、これはアプリケーションでそれらの反転が起こりがちであるならば意味があります。例えば文字を認識しようとしているならばそれは良い考えではありません、それらを反転することは意味を破壊しますので。

 

ハイパー・パラメータ

結果に有用であるかを見るために調整を試すことができる幾つかの他のパラメータがあります。–learning_rate は訓練の間に最終層への更新の大きさを制御します。直感的にはこれがより小さければ学習はより長くかかりますが、全体的な精度を助ける結果になります。けれどもいつも事実であるとは限りませんので、貴方のケースで何が動作するかを見るには注意深く実験する必要があります。–train_batch_size は最終層への更新を見積もるために各訓練ステップの間にどれだけの画像が検査されるかを制御します、

 

訓練、検証、そしてテストセット

スクリプトが内部で行なうことの一つは画像のフォルダをポイントさせる時に3つの異なるセットに分割することです。最大のものは通常は訓練セットで、これは訓練の間にネットワークに供給される全ての画像で、その結果はモデルの重みを更新するために使用されます。訓練のために全ての画像を何故使わないのか不思議に思うかもしれませんね?機械学習を行なう時の大きな潜在的な問題はモデルは正しい答えを出すために訓練画像の不適切な詳細を単に記憶してしまうかもしれないことです。例えば、見せられた各写真の背景のパターンを覚えてしまい物体とラベルをマッチさせるためにそれを使用してしまうネットワークを想像できるでしょう。それは訓練の間に前に見た全ての画像上では良い結果を生成できるでしょう、しかし新しい画像では失敗します、何故ならばそれは物体の一般的な特徴を学習しておらず、単に訓練画像の重要でない詳細を記憶しているからです。

この問題は過剰適合 (過学習) として知られ、これを回避するためにデータの一部を訓練プロセスから外へ保持しておき、モデルがそれらを記憶できないようにします。そして過剰適合が起きていないことを確認するためにそれらの画像をチェック用に使用します、何故ならばそれらの上で良い精度を見るならばネットワークが過剰適合してないことの良い兆候ですから。通常の分割は画像の 80% を主要な訓練セットに置いて、10 % を訓練の間に頻繁に検証として実行するために取り分け、そしてそれから最後の 10% を保持しておきます。これは分類器の現実的なパフォーマンスを予測するために頻度は低いですがテストセットとして使用されます。これらの比率は –testing_percentage と –validation_percentage フラグを使用して制御可能です。一般的にはこれらの値はそのデフォルトのままにしておくことが可能です、何故ならばそれらを調整することは訓練へのどのような優位点も通常は見出せないからです。

スクリプトは訓練、検証、そしてテストセットの中で画像を分割するために (完全にランダムな関数よりも) 画像ファイル名を使用することに注意してください。異なる実行において画像が訓練とテストセット間で移動しないことを保証するために行なわれます、何故ならばもしモデルを訓練するために使用された画像が続いて検証セットでも使用されるならば問題となるからです。

検証精度は反復の間に変動することに気がつくかもしれません。この変動の多くは検証セットのランダムなサブセットは各々の検証精度測定のために選択されるという事実から発生します。変動は –validation_batch_size=-1 を選択することにより、訓練時間のある程度の増加を犠牲にして、大きく減じることが可能です。これは各精度計算のために検証セット全体を使用します。

ひとたび訓練が完了したら、テストセットの誤分類された画像を検証することは洞察に満ちていることとして見出すかもしれません。これはフラグ –print_misclassified_test_images を追加することで成されます。これは、画像のどのタイプがモデルにとって最も紛らわしいのか、どのカテゴリが最も識別するのが難しいのかについての感覚を得る手助けとなるでしょう。例えば、特定のカテゴリのあるサブタイプ、またはある通常でない写真角度が特に識別が難しいことをを発見するかもしれません、これはそのサブタイプの更なる訓練画像を追加をすることを奨励するかもしれません。しばしば、誤分類された画像の検証は誤ったラベル付け、低い質、あるいはあいまいな画像のような入力データセットにおけるエラーを指し示すこともあります。けれども、一般的にはテストセットの個々のエラーのピンポイントな修正は回避すべきです、何故ならばそれらは多分 (遥かに大きな) 訓練セットのより一般的な問題を単に反映しているだけだからです。

 

他のモデル・アーキテクチャ

デフォルトではスクリプトは Inception V3 アーキテクチャの事前訓練されたインスタンスを持つ画像特徴抽出モジュールを使用します。これは始めるには良い場所です、何故ならばそれは再訓練スクリプトに対して中くらいの実行時間で高い精度の結果を提供するからです。しかし今 TensorFlow Hub モジュールの更なるオプションを見てみましょう。

一方では、そのリストは NASNet (特に nasnet_large と pnasnet_large) のようなより最近の、パワフルなアーキテクチャを示します。これはある程度特別な精度を与えるでしょう。

その一方で、モバイルデバイスや他のリソースが制限される環境上で貴方のモデルを配備することを意図する場合、遥かにより小さなファイルサイズやより高速なスピード (訓練でもまた) のために少しの精度を交換することを望むかもしれません。そのためには、MobileNet V1 か V2 アーキテクチャを実装する異なるモジュール、あるいはまた nasnet_mobile を試してください。

異なるモジュールでの訓練は簡単です : 単に –tfhub_module フラグをモジュール URL と一緒に渡します、例えば :

python retrain.py \
    --image_dir ~/flower_photos \
    --tfhub_module https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/1

これは MobileNet V2 のベースライン・バージョンを使用するモデルを持つ 9 MB モデルファイルを /tmp/output_graph.pb に作成するでしょう。ブラウザでモジュール URL を開けばモジュール・ドキュメントに案内するでしょう。

もしそれを少しだけ早くすることを望むのであれば、入力画像のサイズを ‘224’ から ‘192’, ‘160’, あるいは ‘128’ ピクセル四方に、あるいは ’96’ (V2 のみ) にまでも削減することができます。より積極的な節約のためには、”特徴 depth” か位置毎のニューロン数を制御するためにパーセント ‘100’, ‘075’, ‘050’, or ‘035’ (それは V1 のためには ‘025’) を選択することができます。重みの数 (そしてそれ故にファイルサイズとスピード) はその分数の自乗で縮小されます。MobileNet V1 ブログ投稿GitHub 上の MobileNet V2 ページ は Imagenet 分類に対するそれぞれのトレードオフについてレポートしています。

Mobilenet V2 は特徴 depth パーセンテージをボトルネック層には適用しません。Mobilenet V1 は行ないました、それは分類層のジョブを小さな depth についてはより厳しいものにしました。タイトなボトルネックの代わりに誤魔化して元の 1001 ImageNet クラスのためのスコアを使用することは役立つでしょうか。モジュール名において mobilenet_v1…/feature_vector を mobilenet_v1…/classification で置き換えることにより単純に試すことができます。

前のように、label_image.py で再訓練されたモデルの総てを利用できます。貴方のモデルが期待する画像サイズを指定する必要があります、例えば :

python label_image.py \
--graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt \
--input_layer=Placeholder \
--output_layer=final_result \
--input_height=224 --input_width=224 \
--image=$HOME/flower_photos/daisy/21652746_cc379e0eea_m.jpg

再訓練されたモデルのモバイルデバイスへの配備についての更なる情報については、このチュートリアルの codelab バージョン を、特に パート 2 を見てください。これは TensorFlow Lite と (モデル重みの量子化を含む) それが与える追加の最適化について記述しています。

 

以上


TensorFlow Hub : イントロダクションとインストール

TensorFlow Hub : イントロダクションとインストール (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 04/04/2018

* 本ページは、TensorFlow の本家サイトの TensorFlow Hub – Introduction 及び Installation を翻訳した上で
適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

イントロダクション

機械学習モデルの再利用可能なパーツの公開、発見そして消費 (= consumption) を促進するためのライブラリです。モジュールは TensorFlow グラフの自己充足的なピースで、その重みとアセットを伴い、転移学習として知られるプロセスにおいて異なるタスクに渡り再利用可能です。

モジュールは巨大なデータセットを使用したタスクのために事前訓練された変数を含みます。関連するタスク上でモジュールを再利用することにより、貴方は以下が可能になります :

  • より小さなデータセットでモデルを訓練する
  • 一般化をより良いものにする、あるいは
  • 訓練を本質的にスピードアップする

文字列の配列をそれらの埋め込みにマップする英語の埋め込みモジュールを使用するサンプルがここにあります :

import tensorflow as tf
import tensorflow_hub as hub

with tf.Graph().as_default():
  embed = hub.Module("https://tfhub.dev/google/nnlm-en-dim128-with-normalization/1")
  embeddings = embed(["A long sentence.", "single-word", "http://example.com"])

  with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(tf.tables_initializer())

    print(sess.run(embeddings))

 

Getting Started

(訳注 : 以下のドキュメントについては順次翻訳予定です。)

 

追加情報

公正 (= Fairness)

総ての機械学習におけるように、公正重要な 考慮すべき事柄です。モジュールは典型的には巨大な事前訓練されたデータセットを活用します。そのようなデータセットを再利用するとき、それがどのようなデータを含むか (そしてそこに存在するバイアスがあるか否か)、そしてこれらが貴方のダウンストリーム実験にインパクトをどのように与えるかについてに気を配ることは重要です。

ステータス

私達はブレーキングチェンジを回避することを望みますが、このプロジェクトはまだアクティブな開発下にありステーブルな API やモジュール・フォーマットを持つことはまだ保証されません。

セキュリティ

それらは任意の TensorFlow グラフを含みますので、モジュールはプログラムとして考えることができます。Using TensorFlow Securely は信頼されないソースからのモジュール参照のセキュリティの影響 (= implications) を記述しています。

 

インストール

TensorFlow Hub は 1.7 より前の TensorFlow リリースには存在しないバグ修正と拡張に依拠します。TensorFlow Hub を利用するためには少なくとも 1.7 に TensorFlow パッケージをインストールまたはアップグレードしなければなりません :

$ pip install "tensorflow>=1.7.0"
$ pip install tensorflow-hub

 
以上





AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com