Path: blob/master/site/ja/tutorials/images/classification.ipynb
25118 views
Copyright 2018 The TensorFlow Authors.
Image classification
このチュートリアルでは、tf.keras.Sequential
モデルを使用して花の画像を分類し、tf.keras.utils.image_dataset_from_directory
を使用してデータを読み込む方法を示します。このチュートリアルでは、次の概念を実際に見ていきます。
ディスク上のデータセットを効率的に読み込みます。
過学習を識別し、データ拡張やドロップアウトなどテクニックを使用して過学習を防ぎます。
このチュートリアルは、基本的な機械学習のワークフローに従います。
データの調査及び理解
入力パイプラインの構築
モデルの構築
モデルの学習
モデルのテスト
モデルの改善とプロセスの繰り返し
さらに、このノートブックは、保存されたモデルを、モバイルデバイス、組み込みデバイス、IoT デバイスでのオンデバイス機械学習用の TensorFlow Lite モデルに変換する方法を実演します。
セットアップ
TensorFlow とその他の必要なライブラリをインポートします。
データセットをダウンロードして調査する
このチュートリアルでは、約3,700枚の花の写真のデータセットを使用します。データセットには、クラスごとに1つずつ、5 つのサブディレクトリが含まれています。
ダウンロード後、データセットのコピーが利用できるようになります。合計3,670枚の画像があります。
バラの画像です。
チューリップの画像です。
Keras ユーティリティを使用してデータを読み込む
次に、便利な image_dataset_from_directory ユーティリティを使用して、これらの画像をディスクから読み込みます。これにより、数行のコードでディスク上の画像のディレクトリから tf.data.Dataset
に移動します。また、画像を読み込んで前処理するチュートリアルにアクセスして、独自のデータ読み込みコードを最初から作成することもできます。
データセットを作成する
ローダーのいくつかのパラメーターを定義します。
モデルを開発するときは、検証分割を使用することをお勧めします。ここでは、画像の 80% をトレーニングに使用し、20% を検証に使用します。
クラス名は、これらのデータセットのclass_names
属性にあります。 これらはアルファベット順にディレクトリ名に対応します。
データを視覚化する
以下はトレーニングデータセットの最初の 9 枚の画像です。
これらのデータセットを Keras Model.fit
に渡すことで、モデルをトレーニングできます(このチュートリアルの後の方で説明しています)。また、手動でデータセットを反復し、画像のバッチを取得することもできます。
image_batch
は、形状(32, 180, 180, 3)
のテンソルです。これは、形状180x180x3
の 32 枚の画像のバッチです(最後の次元はカラーチャンネル RGB を参照します)。label_batch
は、形状(32,)
のテンソルであり、これらは 32 枚の画像に対応するラベルです。
image_batch
およびlabels_batch
テンソルで.numpy()
を呼び出して、それらをnumpy.ndarray
に変換できます。
データセットを構成してパフォーマンスを改善する
I/O がブロックされることなくディスクからデータを取得できるように、必ずバッファ付きプリフェッチを使用します。これらは、データを読み込むときに使用する必要がある 2 つの重要な方法です。
Dataset.cache()
は、最初のエポック中に画像をディスクから読み込んだ後、メモリに保持します。これにより、モデルのトレーニング中にデータセットがボトルネックになることを回避できます。データセットが大きすぎてメモリに収まらない場合は、この方法を使用して、パフォーマンスの高いオンディスクキャッシュを作成することもできます。Dataset.prefetch
はトレーニング中にデータの前処理とモデルの実行をオーバーラップさせます。
以上の 2 つの方法とデータをディスクにキャッシュする方法についての詳細は、データパフォーマンスガイドの プリフェッチを参照してください。
データを標準化する
RGB チャネル値は [0, 255]
の範囲にあり、ニューラルネットワークには理想的ではありません。一般に、入力値は小さくする必要があります。
ここでは、tf.keras.layers.Rescaling
を使用して、値を [0, 1]
の範囲に標準化します。
このレイヤーを使用するには 2 つの方法があります。Dataset.map
を呼び出すことにより、データセットに適用できます。
または、モデル定義内にレイヤーを含めることができます。これにより、デプロイメントを簡素化できます。 ここでは 2 番目のアプローチを使用します。
注意: 以前は、tf.keras.utils.image_dataset_from_directory
の image_size
引数を使用して画像のサイズを変更しました。モデルにサイズ変更ロジックも含める場合は、tf.keras.layers.Resizing
レイヤーを使用できます。
基本的な Keras モデル
モデルを作成する
Sequential モデルは、それぞれに最大プールレイヤー (tf.keras.layers.MaxPooling2D
)を持つ 3 つの畳み込みブロック(tf.keras.layers.Conv2D
)で構成されます。ReLU 活性化関数('relu'
)により活性化されたユニットが 128 個ある完全に接続されたレイヤー (tf.keras.layers.Dense
)があります。このチュートリアルの目的は、標準的なアプローチを示すことなので、このモデルは高精度に調整されていません。
モデルをコンパイルする
このチュートリアルでは、tf.keras.optimizers.Adam
オプティマイザとtf.keras.losses.SparseCategoricalCrossentropy
損失関数を選択します。各トレーニングエポックのトレーニングと検証の精度を表示するには、Model.compile
に metrics
引数を渡します。
モデルの概要
Keras の Model.summary
メソッドを使用して、ネットワークのすべてのレイヤーを表示します。
モデルをトレーニングする
Keras Model.fit
メソッドを使用して、10 エポックのモデルをトレーニングします。
トレーニングの結果を視覚化する
トレーニングセットと検証セットで損失と精度のプロットを作成します。
プロットには、トレーニングの精度と検証の精度は大幅にずれており、モデルは検証セットで約 60% の精度しか達成していないことが示されています。
以下のチュートリアルセクションでは、問題の原因を調べ、モデルの全体的なパフォーマンスを向上させる方法を示します。
過学習
上記のプロットでは、トレーニングの精度は時間の経過とともに直線的に増加していますが、検証の精度はトレーニングプロセスで約60%のままです。また、トレーニングと検証の精度に大きな違いがあり、これは過学習の兆候を示しています。
トレーニングサンプルの数が少ない場合、モデルは、トレーニングサンプルのノイズや不要な詳細から学習し、新しいサンプルでのモデルのパフォーマンスに悪影響を及ぼすことがあります。 この現象は過学習として知られています。 これは、モデルが新しいデータセットで一般化する上で問題があることを意味します。
トレーニングプロセスで過学習を回避する方法は複数あります。このチュートリアルでは、データ拡張を使用して、モデルにドロップアウトを追加します。
データ拡張
過学習は、一般に、トレーニングサンプルの数が少ない場合に発生します。データ拡張は、既存のサンプルに対してランダムな変換を使用してサンプルを拡張することにより、追加のトレーニングデータを生成します。これにより、モデルをデータのより多くの側面でトレーニングし、より一般化することができます。
tf.keras.layers.RandomFlip
、tf.keras.layers.RandomRotation
、および tf.keras.layers.RandomZoom
の前処理レイヤーを使用して、データ拡張を実装します。これらは、他のレイヤーと同様にモデル内に含めて、GPU で実行できます。
同じ画像にデータ拡張を数回適用して、いくつかの拡張されたデータがどのようになるかを視覚化してみましょう。
次のステップでトレーニングする前に、モデルにデータ拡張を追加します。
ドロップアウト
過学習を回避するもう 1 つの方法は、ドロップアウト{:.external} 正則化をネットワークに導入することです。
ドロップアウトをレイヤーに適用すると、トレーニングプロセス中にレイヤーからいくつかの出力ユニットがランダムにドロップアウトされます(アクティベーションをゼロに設定することにより)。ドロップアウトは、0.1、0.2、0.4 などの形式で、入力値として小数を取ります。これは、適用されたレイヤーから出力ユニットの 10%、20%、または 40% をランダムにドロップアウトすることを意味します。
拡張された画像を使用してトレーニングする前に、tf.keras.layers.Dropout
を使用して新しいニューラルネットワークを作成します。
モデルをコンパイルしてトレーニングする
トレーニングの結果を視覚化する
データ拡張と tf.keras.layers.Dropout
を適用した後は、以前よりも過学習が少なくなり、トレーニングと検証がより高精度に調整されます。
新しいデータを予測する
モデルを使用して、トレーニングセットまたは検証セットに含まれていなかった画像を分類します。
注意: データ拡張レイヤーとドロップアウトレイヤーは、推論時に非アクティブになります。
TensorFlow Lite を使用する
TensorFlow Lite は、オンデバイスの機械学習を可能にする一連のツールで、開発者がモバイルデバイス、組み込みデバイス、エッジデバイスでモデルを実行できるようにします。
Keras Sequential モデルを TensorFlow Lite モデルに変換する
トレーニング済みのモデルをオンデバイスのアプリケーションで使用するには、まず TensorFlow Lite モデルと呼ばれる、より小さく効率的なモデル形式に変換します。
この例では、トレーニング済みの Keras Sequential モデルを取得し、tf.lite.TFLiteConverter.from_keras_model
を使用して TensorFlow Lite モデルを生成します。
前のステップで保存した TensorFlow Lite モデルには、複数の関数シグネチャを含めることができます。Keras モデルコンバーター API は、デフォルトのシグネチャを自動的に使用します。詳細は TensorFlow Lite シグネチャを参照してください。
TensorFlow Lite モデルを実行する
tf.lite.Interpreter
クラスを介して、Python で TensorFlow Lite の保存されたモデルシグネチャにアクセスできます。
Interpreter
を使用してモデルを読み込みます。
変換されたモデルからシグネチャを出力して、入力 (および出力) の名前を取得します。
この例では、serving_default
という名前のデフォルトシグネチャが 1 つあります。さらに、'inputs'
の名前は 'sequential_1_input'
であり、'outputs'
の名前は 'outputs'
です。このチュートリアルで前に示したように、Model.summary
を実行すると、これらの最初と最後の Keras レイヤー名を検索できます。
次のようにシグネチャ名を渡すことで、tf.lite.Interpreter.get_signature_runner
を使用してサンプル画像で推論を実行し、読み込まれた TensorFlow モデルをテストできます。
チュートリアルの前半で行ったように、TensorFlow Lite モデルを使用して、トレーニングセットまたは検証セットに含まれていない画像を分類できます。
画像は既にテンソル化され、img_array
として保存されています。次に、読み込まれた TensorFlow Lite モデル (predictions_lite
)の最初の引数 ('inputs'
の名前)に渡し、ソフトマックス活性化を計算し、計算された確率が最も高いクラスの予測を出力します。
Lite モデルが生成した予測は、元のモデルが生成した予測とほぼ同一になります。
モデルは画像が 5 つのクラス、'daisy'
、'dandelion'
、'roses'
、'sunflowers'
、および 'tulips'
のうちヒマワリに属すると予測する必要があります。これは TensorFlow Lite 変換前と同じ結果です。