Path: blob/master/site/ja/tutorials/load_data/images.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
画像を読み込んで前処理する
このチュートリアルでは、次の 3 つの方法で画像データセットを読み込んで前処理する方法を説明します。
まず、高レベルの Keras 前処理ユーティリティ (
tf.keras.utils.image_dataset_from_directory
) とレイヤー(tf.keras.layers.Rescaling {/ code1}など)を使用してディスク上の画像のディレクトリを読み取ります。
次に、tf.data を使用して、独自の入力パイプラインを最初から作成します。
最後に、TensorFlow Datasets で利用可能な大きなカタログからデータセットをダウンロードします。
設定
花のデータセットをダウンロードする
このチュートリアルでは、数千枚の花の写真のデータセットを使用します。花のデータセットにはクラスごとに 1 つずつ、計 5 つのサブディレクトリが含まれています。
注意: すべての画像は CC-BY のライセンス下にあります。作成者のリストは LICENSE.txt ファイルをご覧ください。
ダウンロードが完了すると(218 MB)、花の写真のコピーを使用できるようになります。画像の数は合計 3,670 個です。
各ディレクトリには、その種の花の画像が含まれています。以下は、バラのディレクトリです。
Keras ユーティリティを使用してデータを読み込む
tf.keras.utils.image_dataset_from_directory
ユーティリティを使用して、これらの画像をディスクから読み込みましょう。
データセットを作成する
ローダーのいくつかのパラメーターを定義します。
モデルを開発するときは、検証 Split を使用することをお勧めします。ここでは、画像の 80% をトレーニングに使用し、20% を検証に使用します。
クラス名はこれらのデータセットの class_names
属性にあります。
データを視覚化する
以下はトレーニングデータセットの最初の 9 枚の画像です。
これらのデータセットを model.fit
に渡すことで、モデルをトレーニングできます(このチュートリアルの後の方で説明しています)。また、手動でデータセットを反復し、画像のバッチを取得することもできます。
image_batch
は、形状 (32, 180, 180, 3)
のテンソルです。これは、形状 180x180x3
の 32 枚の画像のバッチです(最後の次元はカラーチャンネル RGB を参照します)。label_batch
は、形状 (32,)
のテンソルであり、これらは 32 枚の画像に対応するラベルです。
これらのいずれかのテンソルで .numpy()
を呼び出すと、numpy.ndarray
に変換できます。
データを標準化する
RGB チャネル値は [0, 255]
の範囲にあり、ニューラルネットワークには理想的ではありません。一般に、入力値は小さくする必要があります。
ここでは、tf.keras.layers.Rescaling
を使用して、値を [0, 1]
の範囲に標準化します。
このレイヤーを使用するには 2 つの方法があります。Dataset.map
を呼び出すことにより、データセットに適用できます。
または、モデル定義内にレイヤーを含めてデプロイを簡素化できます。ここでは 2 番目のアプローチを使用します。
注意: ピクセル値を [-1,1]
にスケーリングする場合は、代わりに tf.keras.layers.Rescaling(1./127.5, offset=-1)
を記述できます。
注意:以前は、tf.keras.utils.image_dataset_from_directory
の image_size
引数を使用して画像のサイズを変更しました。モデルにサイズ変更ロジックも含める場合は、tf.keras.layers.Resizing
レイヤーを使用できます。
データセットを構成してパフォーマンスを改善する
I/O がブロックされることなくディスクからデータを取得できるように、必ずバッファ付きプリフェッチを使用します。これらは、データを読み込むときに使用する必要がある 2 つの重要な方法です。
Dataset.cache
は、最初のエポック中に画像をディスクから読み込んだ後、メモリに保持します。これにより、モデルのトレーニング中にデータセットがボトルネックになることを回避できます。データセットが大きすぎてメモリに収まらない場合は、この方法を使用して、パフォーマンスの高いオンディスクキャッシュを作成することもできます。Dataset.prefetch
はトレーニング中にデータの前処理とモデルの実行をオーバーラップさせます。
以上の 2 つの方法とデータをディスクにキャッシュする方法についての詳細は、Better performance with the tf.data API の プリフェッチを参照してください。
モデルをトレーニングする
完全を期すために、準備したデータセットを使用して単純なモデルをトレーニングする方法を示します。
Sequential モデルは、それぞれに最大プーリング層 (tf.keras.layers.MaxPooling2D
)を持つ 3 つの畳み込みブロック (tf.keras.layers.MaxPooling2D
) で構成されます。完全に接続された層(tf.keras.layers.Dense
)の上には 128 ユニットがあり、ReLU 活性化関数 ('relu'
) によって活性化されます。このモデルはまったく調整されていません。目標は、作成したデータセットを使用してメカニズムを表示することです。画像分類の詳細については、画像分類チュートリアルをご覧ください。
tf.keras.optimizers.Adam
オプティマイザとtf.keras.losses.SparseCategoricalCrossentropy
損失関数を選択します。各トレーニングエポックのトレーニングと検証の精度を表示するには、Model.compile
に metrics
引数を渡します。
注意: このチュートリアルが素早く実行するように、いくつかのエポックのみをトレーニングします。
注意: また、Model.fit
を使用する代わりに、カスタムトレーニングループを記述することもできます。詳細については、トレーニングループを最初から記述するをご覧ください。
トレーニングの精度に比べ、検証の制度が低いことに気づくでしょう。これは、モデルが過適合になっていることを示しています。過適合とそれを緩和する方法については、こちらのチュートリアルをご覧ください。
tf.data
を使用してより精密に制御する
上記の Keras 前処理ユーティリティ、tf.keras.utils.image_dataset_from_directory
は画像のディレクトリから tf.data.Dataset
を作成する便利な方法です。
より細かく制御するには、tf.data
を使用して独自の入力パイプラインを記述することができます。このセクションでは、前にダウンロードした TGZ ファイルのファイルパスを使ってこれを作成する方法を説明します。
ファイルのツリー構造を使用して class_names
リストを作成できます。
データセットをトレーニング用と検証用に分割します。
次のようにして、各データセットの長さを出力します。
ファイルパスを (img, label)
ペアに変換する短い関数を記述します。
Dataset.map
を使用して、image, label
ペアのデータセットを作成します。
基本的な訓練手法
このデータセットを使ってモデルの訓練を行うには、データが
よくシャッフルされ
バッチ化され
限りなく繰り返され
これらの特徴量は、tf.data
API を使って追加できます。詳細については、入力パイプラインのパフォーマンスガイドをご覧ください。
データを視覚化する
このデータセットは、前に作成したデータセットと同様に視覚化することができます。
モデルのトレーニングを続ける
これで、上記の tf.keras.utils.image_dataset_from_directory
で作成したデータセットに似た tf.data.Dataset
を手動でビルドすることができました。これを使用して、モデルのトレーニングを続けることができます。前と同様に、実行時間を短縮するために、いくつかのエポックのみをトレーニングします。
TensorFlow Datasets を使用する
ここまで、このチュートリアルはディスクからデータを読み込むことに焦点を当ててきました。大規模なカタログ(TensorFlow Datasets のカタログ)でダウンロードしやすいデータセットをブラウズし、使用するデータセットを探すこともできます。
前はディスクから Flowers データセットを読み込みましたが、今度は TensorFlow Datasets を使って、そのデータセットをインポートしてみましょう。
TensorFlow Datasets を使用して、Flowers データセットをダウンロードします。
Flowers データセットには 5 つのクラスがあります。
データセットから画像を 1 つ取得します。
前と同様に、各データセットでバッチ処理、シャッフル、トレーニングの構成、および、セットのテストを実行して、パフォーマンスのチューニングを行います。
Flowers データセットと TensorFlow Detasets を使用した完全な例は、データ拡張のチュートリアルをご覧ください。
次のステップ
このチュートリアルでは、ディスクから画像を読み込む 2 つの方法について説明しました。初めに、Keras 前処理レイヤーとユーティリティを使用して、画像データセットの読み込みと前処理を行う方法を学習しました。次に、tf.data
を使用して、最初から入力パイプラインを記述する方法を学習しました。そして最後に、TensorFlow Detasets からデータセットをダウンロードする方法を学習しました。
次のステップとして、
データ拡張を適用する方法を学習しましょう。
tf.data
の詳細については、 tf.data: TensorFlow 入力パイプラインをビルドする ガイドをご覧ください。