このトピックでは、Cloud TPU で使用する ImageNet データセットをダウンロード、前処理、アップロードする方法を説明します。ImageNet データセットを使用する機械学習モデルには次のものがあります。
- ResNet
- AmoebaNet
- EfficientNet
- MNASNet
ImageNet データベースのサイズによっては、モデルのトレーニングにはかなりの時間がかかる場合があります。代替手段として、このデータセットの fake_imagenet と呼ばれるデモバージョンを使用する方法もあります。このデモバージョンを使用すると、完全版の ImageNet データベースを使用する場合に一般に必要とされるストレージと時間の所要量を縮小して、モデルをテストできます。
完全版の ImageNet データセットの前処理
ImageNet データセットは、トレーニング データ、検証データ、画像ラベルの 3 つの部分で構成されます。
トレーニング データには 1,000 個のカテゴリと 120 万個の画像が含まれており、ダウンロードしやすいようにパッケージ化されています。検証データとテストデータは、ImageNet トレーニング データには含まれていません(重複は削除されています)。
検証データとテストデータは、Flickr やその他の検索エンジンから収集された 150,000 枚の写真で構成され、1,000 個のオブジェクト カテゴリの存在または不在のラベルが付いています。1, 000 個のオブジェクト カテゴリには ImageNet の内部ノードとリーフノードの両方が含まれますが、両者は重複しません。ラベルの付いた 50,000 枚の画像のランダムなサブセットが、1,000 個のカテゴリのリストとともに検証データとしてリリースされています。残りの画像は評価用に使用され、ラベルなしでリリースされています。
完全な ImageNet データセットの前処理手順
機械学習モデルで使用する ImageNet の完全なデータセットを準備するには、次の 5 つの手順を行います。
- ダウンロード先に空き容量があることを確認します。
- ターゲット ディレクトリを設定します。
- ImageNet サイトに登録して、ダウンロード権限をリクエストします。
データセットをローカル ディスクまたは Compute Engine VM にダウンロードします。
前処理スクリプトとアップロード スクリプトを実行します。
容量の要件を確認する
データセットをローカルマシンにダウンロードする場合でも、Compute Engine VM にダウンロードする場合でも、ダウンロード先に約 300 GB の空き容量が必要です。VM の場合、df -ha
コマンドを実行して空き容量を確認できます。
VM ディスクのサイズは、次のいずれかの方法で増やすことができます。
ctpu up
コマンドラインで、割り当てるサイズ(GB 単位)を設定した--disk-size-gb
フラグを指定します。- Compute Engine ガイドに従って、VM にディスクを追加します。
- VM の削除時にディスクが削除されるように、[インスタンスを削除したときの動作] を [ディスクを削除] に設定します。
- 新しいディスクのパスをメモします。例:
/mnt/disks/mnt-dir
。
ターゲット ディレクトリを設定する
ローカルマシンまたは Compute Engine VM で、ダウンロードしたデータを格納するディレクトリ構造を設定します。
ImageNet データセットのホーム ディレクトリを作成してエクスポートします。
ローカルマシンまたは VM のホーム ディレクトリの下に
imagenet
などのディレクトリを作成します。このディレクトリに、train
とvalidation
という 2 つのサブディレクトリを作成します。ホーム ディレクトリを IMAGENET_HOME としてエクスポートします。export IMAGENET_HOME=~/imagenet
データセットをダウンロードするための登録と権限のリクエストを行う
- Imagenet ウェブサイトに登録します。ImageNet が登録を確認して確認メールを送信するまで、データセットをダウンロードすることはできません。数日以内に確認メールが届かない場合は、ImageNet サポートに連絡して、登録が確認されていない理由を確認してください。登録が確認されたら、ダウンロード サイトに移動します。
ImageNet データセットをダウンロードする
ダウンロード サイトから、[Images] セクションに移動し、[Training images (Task 1 & 2)] を右クリックします。これによって、トレーニング セットの大部分をダウンロードするために必要な URL が表示されます。このURL を保存します。
[Training images (Task 3)] を右クリックして、2 番目のトレーニング セットの URL を取得します。このURL を保存します。
[Validation images (all tasks)] を右クリックして、検証データセットの URL を取得します。このURL を保存します。
ImageNet ファイルをローカルマシンにダウンロードする場合、ダウンロードの完了後、ローカルマシン上のディレクトリを、Compute Engine VM 上の対応する
$IMAGENET_HOME
ディレクトリにコピーする必要があります。ImageNet データセットをローカルホストから VM にコピーするには、約 13 時間かかります。たとえば、次のコマンドでは、ローカルマシン上の $IMAGENET_HOME の下にあるすべてのファイルを、シェル プロンプト username@vm-name が表示されている VM にコピーします。
gcloud compute scp --recurse $IMAGENET_HOME username@vm-name:~/imagenet
$ IMAGENET_HOME から
wget
を使用し、保存した URL を使用してトレーニング ファイルと検証ファイルをダウンロードします。「Training images (Task 1 & 2)」は、大規模なトレーニング セットです。 これは 138 GB で、Cloud Shell を使用して Compute Engine VM にダウンロードする場合、ダウンロードにかかる推定時間は約 40 時間です。このような非常に大きなファイルの場合は、コマンドの前に
nohup
を付けるか、screen を使用して Cloud Shell の接続が切断されたときにダウンロードが終了することを回避します。cd $IMAGENET_HOME \ nohup wget http://image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_train.tar
これにより、大きな tar ファイル(ILSVRC2012_img_train.tar)がダウンロードされます。
VM の $IMAGENET_HOME から次のコマンドを使用して、個々のトレーニング ディレクトリを
$IMAGENET_HOME/train
ディレクトリに抽出します。抽出には 1~3 時間かかります。tar xf ILSVRC2012_img_train.tar
「Training images (Task 3)」ファイルは 728 MB で、ダウンロードにかかる時間は数分であるため、Cloud Shell の接続が切断されることを考慮する必要はありません。
このファイルをダウンロードすると、個々のトレーニング ディレクトリが既存の
$IMAGENET_HOME/train
ディレクトリに抽出されます。wget http://www.image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_train_t3.tar
「Validation images (all tasks)」ファイルは 6 GB であるため、
nohup
または screen を使用して Cloud Shell の接続が切断されたときにダウンロードが終了することを回避します。wget http://www.image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_val.tar
このダウンロードには約 30 分かかります。このファイルをダウンロードすると、個々の検証ディレクトリが既存の
$IMAGENET_HOME/validation
ディレクトリに抽出されます。検証ファイルをローカルマシンにダウンロードした場合は、ローカルマシン上の
$IMAGENET_HOME/validation
ディレクトリを Compute Engine VM 上の$IMAGENET_HOME/validation
ディレクトリにコピーする必要があります。このコピー オペレーションには約 30 分かかります。ラベルファイルをダウンロードします。これは数秒で完了します。
wget -O $IMAGENET_HOME/synset_labels.txt \ https://raw.githubusercontent.com/tensorflow/models/master/research/inception/inception/data/imagenet_2012_validation_synset_labels.txt
ラベルファイルをローカルマシンにダウンロードした場合は、ローカルマシン上の
$IMAGENET_HOME
ディレクトリ、Compute Engine VM 上の$IMAGENET_HOME
にコピーする必要があります。このコピー オペレーションは数秒で完了します。トレーニング サブディレクトリ名(例: n03062245)は「WordNet ID」(wnid)です。ImageNet API は、
synset_labels.txt
ファイル内の WordNet ID とそれに関連する検証ラベルとのマッピングを示します。このコンテキストの synset は、視覚的に似たグループの画像です。
Imagenet データセットを処理し、必要に応じて Cloud Storage にアップロードする
GitHub から
imagenet_to_gcs.py
スクリプトをダウンロードします。wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
データセットを Cloud Storage にアップロードする場合は、ImageNet データセットをアップロードするストレージ バケットのロケーションを指定します。
export STORAGE_BUCKET=gs://bucket-name
データセットを Cloud Storage にアップロードする場合は、データセットを保持するストレージ バケット データ ディレクトリを指定します。
(vm)$ export DATA_DIR=$STORAGE_BUCKET/dataset-directory
スクリプトを実行して、生データセットを TFRecord として前処理し、次のコマンドを使用して Cloud Storage にアップロードします。
python3 imagenet_to_gcs.py \ --project=$PROJECT \ --gcs_output_path=$DATA_DIR \ --raw_data_dir=$IMAGENET_HOME \ --local_scratch_dir=$IMAGENET_HOME/tf_records
このスクリプトでは、以下の形式の一連のディレクトリ(トレーニングと検証の両方)が生成されます。
${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
...
${DATA_DIR}/train-01023-of-01024
および
${DATA_DIR}/validation-00000-of-00128
S{DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128
Cloud バケットにデータがアップロードされたら、モデルを実行して --data_dir=${DATA_DIR}
を設定します。