転移学習を使用した最初の Keras モデル

1. 概要

このラボでは、Keras 分類器の構築方法について学びます。花を認識するためのニューラル ネットワーク層の完璧な組み合わせを見つけるのではなく、まず転移学習という手法を使用して、事前トレーニングされた強力なモデルをデータセットに適応させます。

このラボには、ニューラル ネットワークに関する必要な理論的な説明が含まれており、ディープ ラーニングについて学習する出発点として適しています。

このラボは「TPU 上の Keras」のパート 2 ですシリーズとして提供されますこれらは次の順序で実行することも、個別に実行することもできます。

ca8cc21f6838eccc.png

学習内容

  • ソフトマックス レイヤと交差エントロピー損失を使用して独自の Keras 画像分類器を構築する
  • だましを立てるために、独自のモデルを構築する代わりに転移学習を使用する。

フィードバック

この Codelab で何か問題がありましたらお知らせください。フィードバックは、GitHub の問題 [フィードバック リンク] からお送りいただけます。

2. Google Colaboratory クイック スタート

このラボでは Google Collaboratory を使用します。ユーザー側での設定は必要ありません。Colaboratory は、教育を目的としたオンライン ノートブック プラットフォームです。CPU、GPU、TPU を無料でトレーニングできます。

688858c21e3beff2.png

このサンプル ノートブックを開いていくつかのセルを実行し、Colaboratory についてよく理解してください。

c3df49e90e5a654f.png Welcome to Colab.ipynb

TPU バックエンドを選択する

8832c6208c99687d.png

Colab のメニューで [ランタイム] >ランタイム タイプを変更し、[TPU] を選択します。この Codelab では、ハードウェア アクセラレーションによるトレーニングをサポートする強力な TPU(Tensor Processing Unit)を使用します。ランタイムへの接続は初回実行時に自動的に行われますが、[接続] オプションを使用してボタンをタップします。

ノートブックの実行

76d05caa8b4db6da.png

セルを 1 つずつ実行するには、セルをクリックして Shift+Enter キーを押します。[ランタイム >すべて実行

目次

429f106990037ec4.png

すべてのノートブックには目次があります。左側にある黒い矢印をクリックすると開きます。

非表示のセル

edc3dba45d26f12a.png

一部のセルにはタイトルのみが表示されます。これは Colab 固有のノートブック機能です。それらをダブルクリックすると内部のコードを確認できますが、通常はあまり興味を引かないものです。通常はサポート関数または可視化関数です。内部の関数を定義するには、これらのセルを実行する必要があります。

認証

cdd4b41413100543.png

承認済みアカウントで認証すれば、Colab が限定公開の Google Cloud Storage バケットにアクセスできます。上記のコード スニペットによって認証プロセスがトリガーされます。

3. [情報] ニューラル ネットワーク分類器 101

概要

次の段落で太字で示されている用語をすべて理解している場合は、次の演習に進みましょう。ディープ ラーニングを始めたばかりの方は、ぜひ本をお読みください。

一連のレイヤとして構築されたモデルの場合、Keras では Sequential API を使用できます。たとえば、3 つの Dense レイヤを使用する画像分類器は、Keras で次のように記述できます。

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
    tf.keras.layers.Dense(500, activation="relu"),
    tf.keras.layers.Dense(50, activation="relu"),
    tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])

# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
  optimizer='adam',
  loss= 'categorical_crossentropy',
  metrics=['accuracy']) # % of correct answers

# train the model
model.fit(dataset, ... )

688858c21e3beff2.png

高密度ニューラル ネットワーク

これは、画像を分類するための最も単純なニューラル ネットワークです。「ニューロン」でできています。レイヤに配置されます。第 1 レイヤは入力データを処理し、その出力を他のレイヤにフィードします。「高密度」と呼ばれる各ニューロンが前のレイヤのすべてのニューロンと接続されているからです。

c21bae6dade487bc.png

すべてのピクセルの RGB 値を長いベクトルにフラット化し、入力として使用することで、このようなネットワークに画像をフィードできます。これは画像認識に最適な手法ではありませんが、後で改善します。

ニューロン、アクティベーション、RELU

「ニューロン」すべての入力の加重合計を計算し、「bias」と呼ばれる値を加算します。いわゆる「活性化関数」を通じて結果をフィードします重みとバイアスは、最初は未知です。これらはランダムに初期化され、「学習」されるニューラル ネットワークをトレーニングします。

644f4213a4ee70e5.png

最も一般的な活性化関数は、正規化線形ユニットの RELU です。上のグラフからわかるように、これは非常にシンプルな関数です。

ソフトマックスの有効化

花を 5 つのカテゴリ(バラ、チューリップ、タンポポ、ヒマワリ、ヒマワリ)に分類しているため、上記のネットワークは 5 個のニューロン層で終わります。中間層のニューロンは、従来の RELU 活性化関数を使用して活性化されます。最後のレイヤでは、この花がバラやチューリップなどになる確率を表す 0 ~ 1 の数値を計算します。そのために、「softmax」という活性化関数を使用します。

ベクトルにソフトマックスを適用するには、各要素の指数を受け取り、通常は L1 ノルム(絶対値の合計)を使用してベクトルを正規化します。これにより、値の和が 1 になり、確率として解釈できるようになります。

ef0d98c0952c262d.png d51252f75894479e.gif

交差エントロピー損失

ニューラル ネットワークが入力画像から予測を生成するようになったので、予測の精度、すなわちネットワークが教える情報と正解(しばしば「ラベル」と呼ばれる)の間の距離を測定する必要があります。データセット内のすべての画像に正しいラベルが付けられていることを思い出してください。

どのような距離でもかまいませんが、分類問題では、いわゆる「交差エントロピー距離」を使用して最も効果的な方法です。これをエラーまたは「損失」と呼ぶことにします。関数:

7bdf8753d20617fb.png

勾配降下法

トレーニングニューラル ネットワークとは、交差エントロピー損失関数が最小になるように、トレーニング用の画像とラベルを使って重みとバイアスを調整することを意味します。仕組みは次のとおりです。

交差エントロピーは、トレーニング画像の重み、バイアス、ピクセル、および既知のクラスの関数です。

すべての重みとすべてのバイアスに対して交差エントロピーの偏導関数を計算すると、与えられた画像、ラベル、重みとバイアスの現在値に対して計算される「勾配」が得られます。何百万もの重みとバイアスが存在する可能性があるため、勾配の計算は大変な作業に思えます。幸いなことに、TensorFlow がそれを自動でやってくれます。勾配の数学的特性は、「上」を指すことです。交差エントロピーが低いところに目的のため、逆方向に移動します。重みとバイアスは、勾配のごく一部で更新されます。その後、トレーニング ループ内で、次のトレーニング画像とラベルのバッチを使用して、同じことを何度も繰り返します。うまくいけば、交差エントロピーが最小になるところに収束することが期待されます。ただし、この最小値が一意であるという保証はありません。

グラデーション descent2.png

ミニバッチ処理とモメンタム

1 つのサンプル画像についてグラデーションを計算し、重みとバイアスをすぐに更新することもできますが、たとえば 128 枚の画像でバッチにすることで、異なるサンプル画像による制約をより適切に表現するグラデーションが得られるため、より速く解に収束する可能性が高くなります。ミニバッチのサイズは調整可能なパラメータです。

この手法は「確率的勾配降下法」とも呼ばれます。には、より現実的な利点がもう一つあります。バッチで作業することは、より大きな行列で作業することも意味し、通常は GPU や TPU での最適化が容易になります。

ただし、収束はやや混沌としたものになり、勾配ベクトルがすべてゼロになると収束が停止することさえあります。最小値を見つけたということでしょうか?必ずしも違反警告を受けるとは限りません。勾配コンポーネントは、最小値または最大値で 0 にできます。何百万もの要素を含む勾配ベクトルで、それらがすべてゼロの場合、すべてのゼロが最小値に対応し、どのゼロでも最大ポイントに対応する確率はかなり小さくなります。さまざまな次元の空間では、サドルポイントは非常に一般的なものなので、それだけでは不十分です。

52e824fe4716c4a0.png

イラスト: サドルポイント。勾配は 0 ですが、すべての方向で最小値ではありません。(画像の帰属: Wikimedia: 執筆者: Nicoguaro - 自著、CC BY 3.0

解決策は、最適化アルゴリズムに勢いをつけて、止まることなく踏切を乗り越えることです。

用語集

バッチまたはミニバッチ: トレーニングは常に、トレーニング データとラベルのバッチに対して実行されます。これにより、アルゴリズムが収束しやすくなります。「バッチ」ディメンションは通常、データテンソルの 1 次元目です。たとえば、形状 [100, 192, 192, 3] のテンソルには、1 ピクセルあたり 3 つの値(RGB)を持つ 192x192 ピクセルの画像が 100 個含まれています。

交差エントロピー損失: 分類器でよく使用される特別な損失関数。

dense レイヤ: ニューロンの層。各ニューロンが前のレイヤのすべてのニューロンに接続されています。

特徴: ニューラル ネットワークの入力は「特徴」と呼ばれることもあります。適切な予測を得るために、データセットのどの部分(または複数の部分の組み合わせ)をニューラル ネットワークに入力すべきかを考える技術は「特徴量エンジニアリング」と呼ばれます。

labels: 「classes」の別の名前教師あり分類問題での正解や正解の

学習率: トレーニング ループの反復処理ごとに重みとバイアスが更新される勾配の割合。

ロジット: 活性化関数が適用される前のニューロン層の出力は「ロジット」と呼ばれます。この用語は「ロジスティック関数」に由来します。別名「シグモイド関数」活性化関数として最も広く利用されていました。「ロジスティック関数の前のニューロン出力」「Logits」に短縮されます。

loss: ニューラル ネットワークの出力と正解を比較する誤差関数

neuron: 入力の加重合計を計算し、バイアスを加えて、その結果を活性化関数に渡します。

ワンホット エンコーディング: クラス 5 のうち、クラス 3 が 5 つの要素のベクトルとしてエンコードされます。3 番目の要素である 1 を除き、すべてゼロになります。

relu: 正規化線形ユニット。ニューロンによく使用される活性化関数です。

シグモイド: 以前は一般的になっていたもう一つの活性化関数で、特殊なケースでも有用です。

ソフトマックス: ベクトルに対して作用する特別な活性化関数。最大の成分と他のすべての成分の差を増加させ、確率のベクトルとして解釈できるようにベクトルを合計 1 に正規化します。分類器の最後のステップとして使用されます。

tensor: 「テンソル」行列に似ていますが、次元数は任意です。1 次元テンソルはベクトルです。2 次元のテンソルは行列です。テンソルは 3 次元、4 次元、5 次元以上にすることができます。

4. 転移学習

画像分類の問題の場合、密レイヤでは不十分でしょう。畳み込みレイヤと、それらを配置できる多くの方法を学ぶ必要があります。

近道することもできます。トレーニング済みの畳み込みニューラル ネットワークがダウンロード可能です。最後のレイヤであるソフトマックス分類ヘッドを取り除き、独自のレイヤに置き換えることができます。トレーニング済みの重みとバイアスはそのまま維持され、追加したソフトマックス レイヤのみを再トレーニングします。この手法は転移学習と呼ばれ、驚くべきことに、ニューラル ネットが事前トレーニングされるデータセットが「十分に近似」されている限り機能します。あります。

ハンズオン

次のノートブックを開いてセルを実行(Shift+Enter キー)し、「必要な作業」が表示されている箇所をすべて手順に沿って操作してくださいラベルです。

c3df49e90e5a654f.png Keras Flowers transfer learning (playground).ipynb

その他の情報

転移学習では、トップクラスの研究者によって開発された高度な畳み込みニューラル ネットワーク アーキテクチャと、膨大な画像データセットでの事前トレーニングの両方を利用できます。この例では、ImageNet でトレーニングされたネットワークから転移学習を行います。ImageNet は、花に近い多くの植物や屋外のシーンを含む画像のデータベースです。

b8fc1efd2001f072.png

イラスト: トレーニング済みの複雑な畳み込みニューラル ネットワークをブラック ボックスとして使用し、分類ヘッドのみを再トレーニングします。これは転移学習です。このような畳み込みレイヤの複雑な配置がどのように機能するかは、後で説明します。今のところは、それは他の人の問題です。

Keras での転移学習

Keras では、tf.keras.applications.* コレクションから事前トレーニング済みモデルをインスタンス化できます。たとえば MobileNet V2 は、きわめて優れた畳み込みアーキテクチャであり、サイズも妥当です。include_top=False を選択すると、最終的なソフトマックス レイヤのない事前トレーニング済みモデルを取得し、独自のモデルを追加できます。

pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False

model = tf.keras.Sequential([
    pretrained_model,
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(5, activation='softmax')
])

pretrained_model.trainable = False 設定にも注意してください。事前トレーニング済みモデルの重みとバイアスを固定して、ソフトマックス レイヤのみをトレーニングします。通常、この作業は比較的少ない重みで迅速に実行でき、大規模なデータセットは必要ありません。ただし、データが大量にある場合は、pretrained_model.trainable = True を使用して転移学習をさらに効果的に行うことができます。トレーニング済みの重みは優れた初期値を提供しますが、問題に適合するようにトレーニングによって調整することもできます。

最後に、密なソフトマックス レイヤの前に Flatten() レイヤが挿入されています。高密度レイヤはフラットなデータベクトルに対して機能しますが、それが事前トレーニング済みモデルから得られるものであるかどうかはわかりません。だからこそ、フラット化する必要があります。次の章では、畳み込みアーキテクチャについて詳しく説明しながら、畳み込みレイヤから返されるデータ形式について説明します。

この方法では 75% 近くの精度が得られるはずです。

ソリューション

こちらがソリューション ノートブックです。行き詰まった場合に使用できます。

c3df49e90e5a654f.png Keras Flowers transfer learning (solution).ipynb

学習した内容

  • 🤔? Keras で分類器を記述する方法
  • 🤓? 最後のソフトマックス層と交差エントロピー損失で構成され
  • 🎃? 転移学習
  • 🤔? 最初のモデルのトレーニング
  • 🧐? トレーニング中の損失と精度を追跡する

このチェックリストをぜひチェックしてみてください。

5. 完了

これで Keras モデルを構築できます。次のラボに進んで、畳み込みレイヤを構築する方法をご確認ください。

TPU の実践

TPU と GPU は Cloud AI Platform で利用できます。

ぜひフィードバックをお寄せください。このラボで問題が見つかった場合や、改善が必要だと思われる点がありましたら、お知らせください。フィードバックは、GitHub の問題 [フィードバック リンク] からお送りいただけます。

HR.png

マーティン・ゲルナー(Martin Görner)氏、small.jpg
著者: Martin Görner
Twitter: @martin_gorner

TensorFlow ロゴ.jpg
www.tensorflow.org