1. 概要
このラボでは、Keras 分類システムを作成する方法について学習します。花を認識するためのニューラル ネットワーク層の完璧な組み合わせを見つけるのではなく、まず転移学習という手法を使用して、事前トレーニングされた強力なモデルをデータセットに適応させます。
このラボでは、ニューラル ネットワークに関する必要な理論的な説明が含まれており、ディープ ラーニングを学習するデベロッパーにとって良い出発点となります。
このラボは「TPU での Keras」シリーズのパート 2 です。これらは次の順序で実行することも、個別に実行することもできます。
- TPU スピードのデータ パイプライン: tf.data.Dataset と TFRecords
- [このラボ] 転移学習を使用した最初の Keras モデル
- Keras と TPU を使用した畳み込みニューラル ネットワーク
- Keras と TPU での最新の convnets、squeezenet、Xception
学習内容
- ソフトマックス レイヤと交差エントロピー損失を使用して独自の Keras 画像分類器を構築する
- 独自のモデルを構築する代わりに転移学習を使用して、チート 😈 する。
フィードバック
この Codelab で問題が見つかった場合は、お知らせください。フィードバックは、GitHub の問題 [フィードバック リンク] からお送りいただけます。
2. Google Colaboratory クイック スタート
このラボでは Google Colaboratory を使用します。セットアップは必要ありません。Colaboratory は、教育を目的としたオンライン ノートブック プラットフォームです。CPU、GPU、TPU を無料でトレーニングできます。
このサンプル ノートブックを開いて、いくつかのセルを実行して Colaboratory に慣れることができます。
TPU バックエンドを選択する
Colab メニューで、[ランタイム] > [ランタイムのタイプを変更] の順に選択し、TPU を選択します。このコードラボでは、ハードウェア アクセラレーションによるトレーニングをサポートする強力な TPU(Tensor Processing Unit)を使用します。ランタイムへの接続は、初回実行時に自動的に行われます。右上の [接続] ボタンを使用することもできます。
ノートブックの実行
セルをクリックして Shift+Enter キーを押すことで、セルを 1 つずつ実行します。[ランタイム] > [すべて実行] でノートブック全体を実行することもできます。
目次
すべてのノートブックには目次があります。左側の黒い矢印を使用して開くことができます。
非表示のセル
一部のセルはタイトルのみが表示されます。これは Colab 固有のノートブック機能です。それらをダブルクリックすると内部のコードを確認できますが、通常はあまり興味を引かないものです。通常は、サポート機能または可視化機能です。内部の関数を定義するには、これらのセルを実行する必要があります。
認証
承認済みアカウントで認証すると、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, ... )
高密度ニューラル ネットワーク
これは、画像を分類する最も単純なニューラル ネットワークです。層状に並んだ「ニューロン」で構成されています。最初のレイヤは入力データを処理し、出力を他のレイヤにフィードします。各ニューロンが前の層のすべてのニューロンに接続されているため、「密結合」と呼ばれます。
このようなネットワークに画像をフィードするには、すべてのピクセルの RGB 値を長いベクトルにフラット化し、入力として使用します。これは画像認識には最適な手法ではありませんが、今後改善していく予定です。
ニューロン、活性化、RELU
「ニューロン」は、すべての入力の加重合計を計算し、「バイアス」と呼ばれる値を追加して、その結果を「活性化関数」にフィードします。重みとバイアスは最初は不明です。これらはランダムに初期化され、多くの既知のデータでニューラル ネットワークをトレーニングすることで「学習」されます。
最も一般的な活性化関数は、正規化線形ユニット(ReLU)と呼ばれます。上のグラフに示すように、非常にシンプルな関数です。
ソフトマックスの有効化
上記のネットワークは、花を 5 つのカテゴリ(バラ、チューリップ、タンポポ、デイジー、ヒマワリ)に分類するため、5 ニューロンのレイヤで終了します。中間層のニューロンは、従来の RELU 活性化関数を使用して活性化されます。最後のレイヤでは、この花がバラやチューリップなどになる確率を表す 0 ~ 1 の数値を計算します。これには、「softmax」という活性化関数を使用します。
ベクトルにソフトマックスを適用するには、各要素を指数化し、ベクトルを正規化します。通常は L1 ノルム(絶対値の合計)を使用して、値の合計が 1 になり、確率として解釈できるようにします。
交差エントロピー損失
ニューラル ネットワークが入力画像から予測を生成するようになったので、予測の精度、すなわち、ネットワークが教える情報と正解(しばしば「ラベル」と呼ばれる)の間の距離を測定する必要があります。データセット内のすべての画像に正しいラベルが付いていることを覚えておいてください。
任意の距離を使用できますが、分類問題の場合は、いわゆる「交差エントロピー距離」が最も効果的です。これをエラーまたは「損失」関数と呼びます。
勾配降下法
ニューラル ネットワークの「トレーニング」とは、トレーニング画像とラベルを使用して重みとバイアスを調整し、交差エントロピー損失関数を最小化することを意味します。仕組みは次のとおりです。
クロスエントロピーは、トレーニング画像の重み、バイアス、ピクセル、既知のクラスの関数です。
すべての重みとバイアスに対してクロスエントロピーの偏微分を求めると、「勾配」が得られます。これは、特定の画像、ラベル、重みとバイアスの現在値に対して計算されます。何百万もの重みとバイアスが存在する可能性があるため、勾配の計算は大変な作業に思えます。幸い、Tensorflow がその作業を行います。勾配の数学的特性は、「上」を指すことです。交差エントロピーが低いところに目的のため、逆方向に移動します。重みとバイアスは勾配の一部で更新されます。次に、トレーニング ループで、次のバッチのトレーニング画像とラベルを使用して、同じことを繰り返します。クロスエントロピーが最小になる場所に収束することを期待しますが、この最小値が一意であることを保証するものではありません。
ミニバッチ処理とモメンタム
1 つのサンプル画像でのみ勾配を計算し、重みとバイアスをすぐに更新できますが、128 個の画像のバッチで計算すると、さまざまなサンプル画像によって課せられる制約をより適切に表す勾配が得られるため、解決策への収束が早まる可能性があります。ミニバッチのサイズは調整可能なパラメータです。
「確率的勾配降下法」とも呼ばれるこの手法には、より現実的なメリットもあります。バッチで作業することは、より大きな行列で作業することになり、通常は GPU や TPU での最適化が容易になります。
ただし、収束は少し混乱する可能性があり、勾配ベクトルがすべてゼロの場合、収束が停止することもあります。これは最小値が見つかったことを意味しますか?必ずしも違反警告を受けるとは限りません。勾配コンポーネントは、最小値または最大値で 0 にできます。何百万もの要素を含む勾配ベクトルで、それらがすべてゼロの場合、すべてのゼロが最小値に対応し、どのゼロも最大ポイントに対応する確率はかなり小さくなります。さまざまな次元の空間では、サドルポイントは非常に一般的なものなので、それだけでは不十分です。
イラスト: サドルポイント。勾配は 0 ですが、すべての方向で最小値ではありません。(画像の帰属 Wikimedia: Nicoguaro による - 自身の作品、CC BY 3.0)
解決策は、最適化アルゴリズムにモメンタムを追加して、鞍点に止まることなく通過できるようにすることです。
用語集
バッチまたはミニバッチ: トレーニングは常に、トレーニング データとラベルのバッチに対して実行されます。これにより、アルゴリズムの収束が促進されます。通常、「バッチ」次元はデータ テンソルの最初の次元です。たとえば、形状 [100, 192, 192, 3] のテンソルには、1 ピクセルあたり 3 つの値(RGB)を持つ 192x192 ピクセルの画像が 100 個含まれています。
交差エントロピー損失: 分類器でよく使用される特別な損失関数。
密結合レイヤ: 各ニューロンが前のレイヤのすべてのニューロンに接続されているニューロンのレイヤ。
特徴: ニューラル ネットワークの入力は「特徴」と呼ばれることもあります。適切な予測を得るために、データセットのどの部分(または複数の部分の組み合わせ)をニューラル ネットワークに入力すべきかを考える技術は「特徴量エンジニアリング」と呼ばれます。
ラベル: 教師あり分類問題の「クラス」または正解の別名
学習率: トレーニング ループの各反復処理で重みとバイアスが更新される勾配の割合。
ロジット: 活性化関数を適用する前のニューロンの層の出力は「ロジット」と呼ばれます。この用語は「ロジスティック関数」、別名「シグモイド関数」に由来しています。シグモイド関数は、かつては活性化関数として最もよく使われていました。「ロジスティック関数前のニューロン出力」は「ロジット」に短縮されました。
loss: ニューラル ネットワークの出力と正解を比較する誤差関数
ニューロン: 入力の加重合計を計算し、バイアスを追加して、結果を活性化関数に渡します。
ワンホット エンコーディング: 5 つのうち 3 つのクラスは 5 要素のベクトルとしてエンコードされます。3 つ目の要素は 1 で、残りはすべて 0 です。
relu: 正規化線形ユニット。ニューロンによく使用される活性化関数です。
シグモイド: 以前は一般的になっていたもう一つの活性化関数で、特殊なケースでも現在でも有用です。
ソフトマックス: ベクトルに対して作用する特別な活性化関数。最大の成分と他のすべての成分の差を増加させ、確率のベクトルとして解釈できるようにベクトルを合計 1 に正規化します。分類システムの最後のステップとして使用されます。
テンソル: 「テンソル」は行列に似ていますが、任意の数のディメンションがあります。1 次元テンソルはベクトルです。2 次元テンソルは行列です。3、4、5 以上のディメンションを持つテンソルも作成できます。
4. 転移学習
画像分類の問題の場合、密レイヤでは不十分でしょう。畳み込みレイヤと、それらを配置するさまざまな方法について学習する必要があります。
近道することもできます。トレーニング済みの畳み込みニューラル ネットワークがダウンロード可能です。最後のレイヤであるソフトマックス分類ヘッドを切り離し、独自のレイヤに置き換えることもできます。トレーニング済みの重みとバイアスはそのまま維持され、追加したソフトマックス レイヤのみを再トレーニングします。この手法は転移学習と呼ばれ、驚くべきことに、ニューラル ネットが事前トレーニングされるデータセットが自分のデータセットに「十分」である限り機能します。
ハンズオン
次のノートブックを開き、セルを実行(Shift+Enter)し、[作業が必要] ラベルが表示されている箇所の手順に沿って操作してください。
Keras Flowers transfer learning (playground).ipynb
その他の情報
転移学習では、トップクラスの研究者によって開発された高度な畳み込みニューラル ネットワーク アーキテクチャと、膨大な画像データセットでの事前トレーニングの両方を利用できます。この例では、ImageNet でトレーニングされたネットワークから転移学習を行います。ImageNet は、花に近い多くの植物や屋外のシーンを含む画像のデータベースです。
イラスト: トレーニング済みの複雑な畳み込みニューラル ネットワークをブラック ボックスとして使用し、分類ヘッドのみを再トレーニングします。これは転移学習です。このような畳み込みレイヤの複雑な配置がどのように機能するかは、後で説明します。現時点では、他の担当者の問題です。
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% 近くの精度が得られます。
ソリューション
ソリューション ノートブックは次のとおりです。行き詰まった場合に使用できます。
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 で使用できます。
最後に、皆様のフィードバックをお待ちしています。このラボで問題が見つかった場合や、改善が必要だと思われる場合は、お知らせください。フィードバックは GitHub Issues [フィードバック リンク] から送信できます。
|