[NVIDIA TAO] 画像分類モデル作成 - 訓練データ作成編 [3/5]
NVIDIA TAO(Train, Adapt, and Optimize (旧名 NVIDIA TLT))で画像分類モデル(Image Classification)を作成~推論に挑戦する記事の3回目です。
進捗
- 環境構築
- 事前訓練モデルをダウンロード
- 訓練データの作成 ← 現在地
- モデルの訓練
- 推論
前回やったこと
- 画像分類モデル(Image Classification)の事前訓練モデルをダウンロード。
今回やること
- 訓練データを用意する。
- 設定ファイルを作成する。
訓練データを用意する
今回はライブで撮影した写真を「drummer」「guitarist」 「bassist」「vocalist」「all」に分類してみます。
画像は下記のディレクトリ階層に合わせて配置します。
/workspace/work/data ← $DATA_DIR
├ train ← 訓練で使用する画像
│ ├ drummer
│ │ ├ 001.jpg
│ │ └ 002.jpg
│ ├ guitarist
│ │ ├ 003.jpg
│ │ └ 004.jpg
│ ├ bassist
│ │ ├ 005.jpg
│ │ └ 006.jpg
│ ├ vocalist
│ │ ├ 007.jpg
│ │ └ 008.jpg
│ └ all
│ ├ 009.jpg
│ └ 010.jpg
├ val ← 検証(Validate)で使用する画像
│ ├ drummer
│ │ ├ 101.jpg
│ │ └ 102.jpg
│ ├ guitarist
│ │ ├ 103.jpg
│ │ └ 104.jpg
│ ├ vocalist
│ │ ├ 107.jpg
│ │ └ 108.jpg
│ └ all
│ ├ 109.jpg
│ └ 110.jpg
└ test ← テストで使用する画像
├ drummer
│ ├ 201.jpg
│ └ 202.jpg
├ guitarist
│ ├ 203.jpg
│ └ 204.jpg
├ bassist
│ ├ 205.jpg
│ └ 206.jpg
├ vocalist
│ ├ 207.jpg
│ └ 208.jpg
└ all
├ 209.jpg
└ 210.jpg
準備した画像の枚数
| 分類名 | trainの枚数 | valの枚数 |
|---|---|---|
| drummer | 95枚 | 34枚 |
| bassist | 28枚 | 15枚 |
| guitarist | 99枚 | 37枚 |
| vocalist | 50枚 | 28枚 |
| all | 188枚 | 51枚 |
設定ファイルを作成する
NVIDIA TAO(Train, Adapt, and Optimize)で画像分類モデル(Image Classification)を利用するための設定ファイルの全文です。
設定ファイルは $SPECS_DIR/spec.cfg に作成します。
注意:この記事で紹介している例は古いバージョン(v2.0)の設定ファイルです。新しいバージョン(v3.0)を使用する場合はこちらを参考に作成してください。
model_config {
arch: "resnet"
n_layers: 18
use_bias: False
use_batch_norm: True
all_projections: True
use_pooling: False
freeze_bn: False
freeze_blocks: 0
freeze_blocks: 1
input_image_size: "3,224,224"
}
eval_config {
eval_dataset_path: "/workspace/work/data/test"
model_path: "/workspace/work/output/weights/resnet_010.tlt"
top_k: 3
batch_size: 40
n_workers: 4
}
train_config {
train_dataset_path: "/workspace/work/data/train"
val_dataset_path: "/workspace/work/data/val"
pretrained_model_path: "/workspace/work/model/tlt_pretrained_classification_vresnet18/resnet_18.hdf5"
optimizer: "sgd"
batch_size_per_gpu: 40
n_epochs: 10
n_workers: 4
reg_config {
type: "L2"
scope: "Conv2D,Dense"
weight_decay: 0.00005
}
lr_config {
scheduler: "soft_anneal"
learning_rate: 0.005
soft_start: 0.056
annealing_points: "0.3, 0.6, 0.8"
annealing_divider: 10
}
}
各パラメータについて
公式サイトを機械的に翻訳しただけですが...
【Model Config】
| パラメータ | 型 | デフォルト | 説明 | 設定例 |
|---|---|---|---|---|
| all_projections | bool | False | ショートカット接続のあるテンプレートの場合、このパラメーターは、入力と出力のストライドに変化があるかどうかに関係なく、すべてのショートカットを1x1プロジェクションレイヤーでインスタンス化するかどうかを定義します。 | True or False ※1 resnetでのみ使用される。 ※2 ResNet101のモデルで訓練する場合、Falseを設定する必要あり。 |
| arch | string | resnet | 訓練に使用するアーキテクチャを設定します。 | ・resnet ・vgg ・mobilenet_v1 ・mobilenet_v2 ・googlenet 今回はresnet18を使用するので「resnet」を設定します。 |
| num_layers | int | 18 | スケーラブルなテンプレートの特徴抽出器の深さ。 | ・resnets: 10, 18, 34, 50, 101 ・vgg: 16, 19 今回はresnet18を使用するので「18」を設定します。 |
| use_pooling | bool | False | ダウンサンプリング中に畳み込み層を使用するか、プーリング層(MaxPooling)を使用するかを選択します。 Trueの場合、プーリング層を使用してサンプルをダウンしますが、Object Detectionの場合、NVIDIAはFalseに設定するのを推奨しています。 |
True or False |
| use_batch_norm | bool | False | バッチ正規化レイヤーを使用するかどうかを指定します。 | True or False |
| freeze_blocks | float (repeated) |
- | インスタンス化された特徴抽出テンプレートから凍結ブロックを定義します。特徴抽出テンプレートごとに異なります。 | ResNet: [0, 1, 2, 3] VGGシリーズ: [1, 2, 3, 4, 5] MobileNet V1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] MobileNet V2: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] |
| freeze_bn | bool | False | トレーニング中にモデルのバッチ正規化レイヤーを凍結するかどうか。 | True or False |
| input_image_size | string | "3,224,224" | モデルの入力レイヤーのディメンション。データセット内の画像は、トレーニングのためにモデルに送られるときに、データローダーによってこの形状にサイズ変更されます。 | "C,X,Y" C = 1 or 3 X, Y >= 16 且つ整数。 |
【Training Config】
| パラメータ | 型 | デフォルト | 説明 | 設定例 |
|---|---|---|---|---|
| val_dataset_path | string | - | Validationで使用するファイルを格納しているディレクトリのパスを指定します。 | /workspace/work/data/val |
| train_dataset_path | string | - | Trainingで使用するファイルを格納しているディレクトリのパスを指定します。 | /workspace/work/data/train |
| pretrained_model_path | string | - | 事前学習済みのモデルファイルのパスを指定します。 | /workspace/work/model/tlt_pretrained_classification_vresnet18/resnet_18.hdf5 |
| batch_size_per_gpu | int | 32 | GPU毎のバッチサイズを指定します。 | 1 |
| num_epochs | int | 120 | エポック数を指定します。 | 10 |
| n_workers | int | - | 評価用データローダーで画像のバッチをフェッチするワーカーの数を指定します。 | 1 |
| lr_config | - | - | 学習率スケジュールを定義します。 | 別表【Training Config - lr_config】参照 |
| reg_config | string | - | Trainingで使用する正規化のタイプと重みを定義します。 | 別表【Training Config - reg_config】参照 |
| optimizer | string | sgd | 使用する最適化アルゴリズムを指定します。 | [adam, sgd] |
【Training Config - lr_config】
| パラメータ | 型 | デフォルト | 説明 | 設定例 |
|---|---|---|---|---|
| scheduler | string | - | 学習率スケジューラのタイプを指定します。 | [cosine, soft_anneal, step] |
| learning_rate | float | - | 開始学習率を指定します。 | 0.005 |
| soft_start | float | - | 最大学習率(learning_rate * num_gpus)に到達するまでにかかる時間(エポックの総数の比率)。 このパラメーターは、schedulerが「cosine」または「soft_anneal」の場合に使用する必要があります。 |
0.056 |
| annealing_points | string | - | 学習率がアニーリングディバイダーで除算される時間(エポックの総数の比率)。 このパラメーターは、schedulerが「soft_anneal」の場合に使用する必要があります。 |
"0.3, 0.6, 0.8" |
| annealing_divider | float | - | 各アニーリングポイントで適用される学習率の除算器。 このパラメーターは、schedulerが「soft_anneal」の場合に使用する必要があります。 |
10 |
| step_size | float | - | 学習率をlrからlr * gammaにステップする時間(エポックの総数の比率)。 このパラメーターは、schedulerが「step」の場合に使用する必要があります。 |
10 |
| gamma | float | - | すべてのステップの後に学習率に適用されるスケール係数。 このパラメーターは、schedulerが「step」の場合に使用する必要があります。 |
0.1 |
【Training Config - regularizer】
| パラメータ | 型 | デフォルト | 説明 | 設定例 |
|---|---|---|---|---|
| type | string | - | 使用する正則化のタイプを指定します。 | [* L1, L2, None] |
| weight_decay | float | - | 正則化の浮動小数点の重み定義します。 | 0.00005 |
| scope | string | - | 正則化を適用する必要があるレイヤーをカンマ区切りで指定します。NVIDIAはディープニューラルネットワークのConv2D層とDense層で正則化を使用することを推奨しています。 | "Conv2D,Dense" |
【Eval Config】
| パラメータ | 型 | デフォルト | 説明 | 設定例 |
|---|---|---|---|---|
| eval_dataset_path | string | - | 評価(evaluation)で使用する画像を格納しているディレクトリのパスを指定します。 | /workspace/work/data/test |
| model_path | string | - | 評価する訓練モデルのファイル(.tlt)のパスを指定します。 この設定ファイルを作成している段階では.tltファイルはなく、次の記事で訓練を行うことで生成されます。 |
/workspace/work/output/weights/resnet_010.tlt |
| top_k | int | 5 | Top-k分類のカテゴリ精度メトリックを計算するときに確認する要素の数を指定します。 | 3 |
| conf_threshold | float | 0.5 | 分類器出力のargmaxのしきい値は、true positiveと見なされます。 | 0.5 |
| batch_size | int | 256 | モデルを評価するときのバッチあたりの画像の数を指定します。 | 40 |
| n_workers | int | 8 | 評価データローダーで画像のバッチをフェッチするワーカーの数を指定します。 | 4 |
終わりに
これでNVIDIA TAO(Train, Adapt, and Optimize)で画像分類モデル(Image Classification)の訓練を行うための準備が整いました。
次回はいよいよ今回準備したデータを使って訓練を開始します。