このチュートリアルでは、画像分類データ変換プログラムのサンプルスクリプトを使用して、生の画像分類データセットを Cloud TPU モデルのトレーニングで使用される TFRecord 形式に変換する方法について説明します。
TFRecords は、各ファイルを個別に読み取るよりも効率的に、Google Cloud Storage から大きなファイルを読み取ります。tf.data.Dataset
パイプラインを使用している場所であればどこでも TFRecord を使用できます。
TFRecord の使用については、次の TensorFlow ドキュメントをご覧ください。
- TFRecord と tf.train.Example
- tf.data.Dataset
- tf.data: TensorFlow 入力パイプラインのビルド
- PyTorch TFRecord の読み取りおよび書き込み
PyTorch または JAX フレームワークを使用していて、データセット ストレージに Google Cloud Storage を使用していない場合は、TFRecord は同じ利点を得られない可能性があります。
コンバージョンの概要
GitHub のデータ コンバータ リポジトリ内の画像分類フォルダには、converter
スクリプト(image_classification_data.py
)とサンプル実装(simple_example.py
)が含まれており、独自のデータ変換を行うためにコピーして変更できます。
画像分類データ コンバーターのサンプルでは、ImageClassificationConfig
と ImageClassificationBuilder
の 2 つのクラスを定義しています。これらのクラスは tpu/tools/data_converter/image_classification_data.py
で定義されています。
ImageClassificationConfig
は要約ベースクラスです。ImageClassificationConfig
をサブクラス化して、ImageClassificationBuilder
をインスタンス化するために必要な構成を定義します。
ImageClassificationBuilder
は画像分類データセットの TensorFlow データセット ビルダーです。これは tdfs.core.GeneratorBasedBuilder
のサブクラスです。
データセットからデータの例を取得し、TFRecords に変換します。TFRecord は、ImageClassificationBuilder
の __init__
メソッドの data_dir
パラメータで指定されたパスに書き込まれます。
simple_example.py で、サポートされるモードを定義するプロパティ、イメージクラスの数、データセット内の各サンプルの画像データと画像クラスを含む辞書を生成するサンプル生成ツールを実現して、SimpleDatasetConfig
は ImageClassificationConfig
をサブクラス化します。
main()
関数は、ランダムに生成された画像データのデータセットを作成し、クラスの数とディスク上のデータセットへのパスを指定する SimpleDatasetConfig
オブジェクトをインスタンス化します。次に、main()
は、SimpleDatasetConfig
インスタンスを渡し、ImageClassificationBuilder
オブジェクトをインスタンス化します。最後に、main()
が download_and_prepare()
を呼び出します。このメソッドが呼び出されると、ImageClassificationBuilder
インスタンスはSimpleDatasetConfig
によって実装されたデータサンプル 生成ツールを使用して各サンプルを読み込み、一連の TFRecord ファイルに保存します。
詳細については、分類コンバーターのノートブックをご覧ください。
始める前に
データ コンバージョン サンプルを変更してデータセットを読み込む
データセットを TFRecord 形式に変換するには、次のプロパティを定義する ImageClassificationConfig
クラスをサブクラス化します。
- num_labels - イメージクラスの数を返します
- supported_modes - データセットでサポートされているモードのリストを返します(例: test、train、validate)
- text_label_map - テキストクラス ラベルと整数クラスラベルの間のマッピングをモデル化する辞書を返します(SimpleDatasetConfig はマッピングを必要としないため、このプロパティを使用しません)
- download_path - データセットのダウンロード元のパス(SimpleDatasetConfig はこのプロパティを使用しません。example_generator はディスクからデータを読み込みます)
example_generator 生成ツール関数を実装します。このメソッドでは、画像データと各サンプルの画像クラス名を含む辞書を生成する必要があります。ImageClassificationBuilder
は example_generator()
関数を使用して各サンプルを取得し、TFRecord 形式でディスクに書き込みます。
データ変換のサンプルを実行する
次のコマンドを使用して Cloud Storage バケットを作成します。
gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
gcloud
コマンドを使用して、Compute Engine VM を起動します。$ gcloud compute tpus execution-groups create \ --vm-only \ --zone=us-central1-b \ --name=imageclassificationconverter \ --tf-version=2.5.0
gcloud compute ssh imageclassificationconverter --zone=us-central1-b
これ以降、接頭辞
(vm)$
は Compute Engine VM インスタンスでコマンドを実行する必要があることを意味します。必要なパッケージをインストールする
(vm)$ pip3 install opencv-python-headless pillow
スクリプトで使用する次の環境変数を作成します。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export CONVERTED_DIR=$HOME/tfrecords (vm)$ export GENERATED_DATA=$HOME/data (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
data_converter
ディレクトリに移動します。(vm)$ cd /usr/share/tpu/tools/data_converter
フェイク データセットでデータを実行する
simple_example.py
スクリプトは、データ コンバージョン サンプルの image_classification
フォルダにあります。次のパラメータを使用してスクリプトを実行すると、一連のフェイク画像が生成され、TFRecord に変換されます。
(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GENERATED_DATA \ --generate=True \ --num_examples_per_class_low=10 \ --num_examples_per_class_high=11 \ --save_dir=$CONVERTED_DIR
生のデータセットでデータ変換ツールを実行する
元データの場所の環境変数を作成します。
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
simple_example.py
スクリプトを実行する(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GCS_RAW \ --generate=False \ --save_dir=$CONVERTED_DIR
simple_example.py
スクリプトは次のパラメータを受け取ります。
num_classes
はデータセット内のクラスの数のことです。ここでは、ImageNet フォーマットに合わせて 1000 を使用しています。generate
は、生データを生成するかどうかを決定します。data_path
は、generate=True
の場合はデータが生成されるパス、generate=False
の場合は生データが保存されるパスを指します。num_examples_per_class_low
とnum_examples_per_class_high
はクラスごとにいくつのサンプルを生成するかを決定します。スクリプトは、この範囲内のサンプルの乱数を生成します。save_dir
は、保存された TFRecord が保存される場所を参照します。Cloud TPU でモデルをトレーニングするには、データは Cloud Storage に保存されている必要があります。データは、Cloud Storage 上、または VM 上のどちらでもかまいません。
TFRecord の名前を変更し Cloud Storage に移動する
次の例では、変換されたデータを ResNet モデルで使用します。
TFRecord の名前を ImageNet の TFRecord と同じ形式に変更します。
(vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/ (vm)$ sudo apt install rename
(vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
TFRecord を Cloud Storage にコピーします。
(vm)$ gsutil -m cp train* $GCS_CONVERTED (vm)$ gsutil -m cp validation* $GCS_CONVERTED