1. 概要
このラボでは、Keras 分類器の作成方法を学びます。花を認識するためのニューラル ネットワーク レイヤの最適な組み合わせを見つけようとするのではなく、まず転移学習という手法を使用して、強力な事前トレーニング済みモデルをデータセットに適応させます。
このラボには、ニューラル ネットワークに関する必要な理論的説明が含まれており、ディープ ラーニングを学習する開発者にとって最適な出発点となります。
このラボは、「Keras on TPU」シリーズのパート 2 です。これらの手順は、次の順序で実行することも、個別に行うこともできます。
- TPU スピードのデータ パイプライン: tf.data.Dataset と TFRecords
- [このラボ] 転移学習を使用した最初の Keras モデル
- Keras と TPU を使用した畳み込みニューラル ネットワーク
- Keras と TPU を使用した最新の convnets、squeezenet、Xception

学習内容
- ソフトマックス レイヤとクロスエントロピー損失を使用して独自の Keras 画像分類ツールをビルドするには
- 独自のモデルを構築する代わりに、転移学習を使用する。😈
フィードバック
この Codelab で何か問題が見つかった場合は、お知らせください。フィードバックは GitHub の問題 [フィードバック リンク] から送信できます。
2. Google Colaboratory クイック スタート
このラボでは Google Collaboratory を使用するため、ユーザー側での設定は不要です。Colaboratory は、教育目的のオンライン ノートブック プラットフォームです。CPU、GPU、TPU のトレーニングを無料で提供しています。

このサンプル ノートブックを開いて、いくつかのセルを実行すると、Colaboratory の使い方を理解できます。
TPU バックエンドを選択する

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

セルを 1 つずつ実行するには、セルをクリックして Shift+Enter キーを押します。[ランタイム] > [すべて実行] を選択して、ノートブック全体を実行することもできます。
目次

すべてのノートブックに目次があります。左側の黒い矢印を使用して開くことができます。
非表示のセル

一部のセルにはタイトルのみが表示されます。これは Colab 固有のノートブック機能です。ダブルクリックすると内部のコードを確認できますが、通常はあまり興味深いものではありません。通常はサポート関数またはビジュアリゼーション関数。内部の関数を定義するには、これらのセルを実行する必要があります。
認証

承認済みアカウントで認証すれば、Colab からプライベート Google Cloud Storage バケットにアクセスできます。上記のコード スニペットは、認証プロセスをトリガーします。
3. [INFO] ニューラル ネットワーク分類器 101
概要
次の段落の太字の用語をすべてご存知の場合は、次の演習に進んでください。ディープ ラーニングを始めたばかりの方は、ぜひこのまま読み進めてください。
レイヤのシーケンスとして構築されたモデルの場合、Keras は Sequential API を提供します。たとえば、3 つの密なレイヤを使用する画像分類器は、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, ... )

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

このようなネットワークに画像をフィードするには、すべてのピクセルの RGB 値を長いベクトルに平坦化して入力として使用します。画像認識に最適な手法ではありませんが、後で改善します。
ニューロン、アクティベーション、RELU
「ニューロン」は、すべての入力の加重和を計算し、「バイアス」と呼ばれる値を加算して、結果を「活性化関数」と呼ばれる関数に渡します。重みとバイアスは最初は不明です。これらはランダムに初期化され、既知のデータでニューラル ネットワークをトレーニングすることで「学習」されます。

最も一般的な活性化関数は、Rectified Linear Unit の略である RELU と呼ばれます。上のグラフでわかるように、非常にシンプルな関数です。
Softmax アクティベーション
上記のネットワークは、花を 5 つのカテゴリ(バラ、チューリップ、タンポポ、デイジー、ヒマワリ)に分類するため、5 つのニューロン レイヤで終わります。中間レイヤのニューロンは、従来の RELU アクティベーション関数を使用してアクティブ化されます。ただし、最後のレイヤでは、この花がバラである確率、チューリップである確率などを表す 0 ~ 1 の数値を計算します。これには、「ソフトマックス」と呼ばれる活性化関数を使用します。
ベクトルに softmax を適用するには、各要素の指数関数を取り、通常は L1 ノルム(絶対値の合計)を使用してベクトルを正規化します。これにより、値の合計が 1 になり、確率として解釈できます。

交差エントロピー損失
ニューラル ネットワークが入力画像から予測を生成するようになったので、その予測の精度を測定する必要があります。つまり、ネットワークが示す内容と正解(ラベルと呼ばれることが多い)との間の距離を測定します。データセット内のすべての画像に正しいラベルが付いていることを思い出してください。
どの距離でも機能しますが、分類問題では「交差エントロピー距離」が最も効果的です。これをエラー関数または損失関数と呼びます。

勾配降下法
ニューラル ネットワークの「トレーニング」とは、実際には、トレーニング画像とラベルを使用して、交差エントロピー損失関数を最小限に抑えるように重みとバイアスを調整することを意味します。仕組みは次のとおりです。
クロスエントロピーは、重み、バイアス、トレーニング画像のピクセル、既知のクラスの関数です。
すべての重みとすべてのバイアスに対してクロスエントロピーの偏導関数を計算すると、特定の画像、ラベル、重みとバイアスの現在の値に対して計算された「勾配」が得られます。重みとバイアスは数百万個になる可能性があるため、勾配の計算は大変な作業になります。幸いなことに、Tensorflow がこの処理を代わりに行ってくれます。グラデーションの数学的特性は、「上」を指すことです。交差エントロピーが低い方向に進みたいので、反対方向に進みます。重みとバイアスは、勾配の分数で更新します。次に、トレーニング ループで、次のバッチのトレーニング画像とラベルを使用して同じ処理を繰り返し行います。この最小値が 1 つである保証はありませんが、この最小値に収束することを期待します。

ミニバッチ処理とモメンタム
1 つのサンプル画像でグラデーションを計算し、重みとバイアスをすぐに更新することもできますが、たとえば 128 枚の画像のバッチでグラデーションを計算すると、さまざまなサンプル画像によって課せられる制約をより適切に表すグラデーションが得られるため、解に収束する可能性が高くなります。ミニバッチのサイズは調整可能なパラメータです。
この手法は「確率的勾配降下法」と呼ばれることもありますが、バッチ処理を行うことで、より大きな行列を扱うことになり、GPU や TPU での最適化が容易になるという実用的なメリットもあります。
ただし、収束はややカオスになる可能性があり、グラデーション ベクトルがすべてゼロの場合には停止することもあります。これは、最小値が見つかったことを意味しますか?必ずしも違反警告を受けるとは限りません。グラデーション コンポーネントは、最小値または最大値でゼロになることがあります。数百万個の要素を持つ勾配ベクトルで、すべての要素がゼロの場合、すべてのゼロが最小値に対応し、最大値に対応するゼロがない確率はかなり小さくなります。多次元空間では鞍点が非常に一般的であり、そこで停止したくありません。

イラスト: 鞍点。グラデーションは 0 ですが、すべての方向で最小値ではありません。(画像帰属 Wikimedia: By Nicoguaro - Own work, CC BY 3.0)
解決策は、最適化アルゴリズムに運動量を追加して、鞍点を停止せずに通過できるようにすることです。
用語集
バッチまたはミニバッチ: トレーニングは常にトレーニング データとラベルのバッチで実行されます。これにより、アルゴリズムの収束が促進されます。「バッチ」ディメンションは通常、データテンソルの最初のディメンションです。たとえば、シェイプ [100, 192, 192, 3] のテンソルには、192x192 ピクセルの画像が 100 個含まれており、各ピクセルには 3 つの値(RGB)があります。
交差エントロピー損失: 分類子でよく使用される特殊な損失関数。
密結合層: 各ニューロンが前のレイヤのすべてのニューロンに接続されているニューロンのレイヤ。
特徴: ニューラル ネットワークの入力は「特徴」と呼ばれることもあります。優れた予測を得るために、データセットのどの部分(または部分の組み合わせ)をニューラル ネットワークにフィードするかを判断する技術は、「特徴量エンジニアリング」と呼ばれます。
ラベル: 教師あり分類問題における「クラス」または正解の別の名前
学習率: トレーニング ループの各イテレーションで重みとバイアスが更新される勾配の割合。
ロジット: 活性化関数が適用される前のニューロンのレイヤの出力は「ロジット」と呼ばれます。この用語は、かつて最も一般的な活性化関数であった「ロジスティック関数」(「シグモイド関数」とも呼ばれます)に由来します。「Neuron outputs before logistic function」が「logits」に短縮されました。
loss: ニューラル ネットワークの出力と正解を比較する誤差関数
ニューロン: 入力の加重和を計算し、バイアスを追加して、活性化関数を通じて結果をフィードします。
ワンホット エンコード: 5 つのクラスのうちのクラス 3 は、5 つの要素のベクトルとしてエンコードされます。3 番目の要素を除いてすべてゼロです。
relu: 正規化線形ユニット。ニューロンでよく使用される活性化関数。
sigmoid: 以前はよく使用されていた別の活性化関数で、特殊なケースでは今でも有用です。
softmax: ベクトルに作用し、最大成分と他のすべての成分の差を大きくする特別な活性化関数。また、確率のベクトルとして解釈できるように、ベクトルの合計が 1 になるように正規化します。分類子の最後のステップとして使用されます。
tensor: 「テンソル」は行列のようなものですが、任意の数の次元を持つことができます。1 次元テンソルはベクトルです。2 次元テンソルは行列です。3 次元、4 次元、5 次元以上のテンソルを使用することもできます。
4. 転移学習
画像分類の問題では、密レイヤだけでは不十分な可能性があります。畳み込みレイヤと、それらを配置するさまざまな方法について学習する必要があります。
しかし、ショートカットも可能です。完全にトレーニングされた畳み込みニューラル ネットワークをダウンロードできます。最後のレイヤであるソフトマックス分類ヘッドを切り取って、独自のレイヤに置き換えることができます。トレーニング済みの重みとバイアスはそのまま残り、追加した softmax レイヤのみを再トレーニングします。この手法は転移学習と呼ばれ、ニューラル ネットワークが事前トレーニングされたデータセットがユーザーのデータセットと「十分に類似」していれば、驚くほど効果を発揮します。
ハンズオン
次のノートブックを開き、セルを実行(Shift+Enter)して、「WORK REQUIRED」ラベルが表示されている手順に沿って操作してください。
Keras Flowers transfer learning (playground).ipynb
その他の情報
転移学習では、トップレベルの研究者が開発した高度な畳み込みニューラル ネットワーク アーキテクチャと、画像の大規模なデータセットでの事前トレーニングの両方のメリットが得られます。今回のケースでは、ImageNet でトレーニングされたネットワークから転移学習を行います。ImageNet は、花に十分に近い多くの植物や屋外のシーンを含む画像のデータベースです。

図: すでにトレーニング済みの複雑な畳み込みニューラル ネットワークをブラックボックスとして使用し、分類ヘッドのみを再トレーニングする。これが転移学習です。畳み込みレイヤの複雑な配置がどのように機能するかについては、後で説明します。今のところ、それは他の誰かの問題です。
Keras での転移学習
Keras では、tf.keras.applications.* コレクションから事前トレーニング済みモデルをインスタンス化できます。たとえば、MobileNet V2 は、サイズが妥当な範囲に収まる優れた畳み込みアーキテクチャです。include_top=False を選択すると、最終的な softmax レイヤーのない事前トレーニング済みモデルを取得し、独自のレイヤーを追加できます。
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 の設定にも注意してください。事前トレーニング済みモデルの重みとバイアスを固定して、softmax レイヤのみをトレーニングします。通常、この方法では比較的少ない重みが使用され、大規模なデータセットを必要とせずに迅速に実行できます。ただし、データが大量にある場合は、転移学習は pretrained_model.trainable = True でさらに効果を発揮します。事前トレーニング済みの重みは優れた初期値を提供し、トレーニングによって問題に合わせて調整できます。
最後に、密な softmax レイヤの前に Flatten() レイヤが挿入されていることに注目してください。密なレイヤはデータのフラットなベクトルで動作しますが、事前トレーニング済みモデルがそれを返すかどうかはわかりません。そのため、フラット化する必要があります。次の章では、畳み込みアーキテクチャについて詳しく説明する際に、畳み込みレイヤから返されるデータ形式について説明します。
このアプローチでは、75% に近い精度が得られるはずです。
ソリューション
ソリューション ノートブックは次のとおりです。行き詰まった場合は、こちらをご利用ください。
Keras Flowers transfer learning (solution).ipynb
学習した内容
- 🤔 Keras で分類子を作成する方法
- 🤓: softmax の最終レイヤと交差エントロピー損失で構成
- 転移学習
- 🤔 最初のモデルをトレーニングする
- 🧐 トレーニング中の損失と精度を追跡する
このチェックリストを頭の中で確認してください。
5. 完了
これで、Keras モデルを構築できます。次のラボに進み、畳み込みレイヤを組み立てる方法を学習してください。
- TPU スピードのデータ パイプライン: tf.data.Dataset と TFRecords
- [このラボ] 転移学習を使用した最初の Keras モデル
- Keras と TPU を使用した畳み込みニューラル ネットワーク
- Keras と TPU を使用した最新の convnets、squeezenet、Xception
TPU の実践
TPU と GPU は Cloud AI Platform で使用できます。
- Deep Learning VM の場合
- AI Platform Notebooks で
- AI Platform Training ジョブの場合
最後に、皆様のフィードバックをお待ちしています。このラボで不具合が見つかった場合や、改善すべき点があると思われる場合は、お知らせください。フィードバックは GitHub の問題 [フィードバック リンク] から送信できます。

|

