オペレーションの方法
ご自身で学習や予測を行うためのオペレーションの方法をご説明します。
Overview
-
(例として、Getting Started(CIFAR-10 image classification)を実行した直後のサーバにアクセスしていることを想定します。)
-
SmallTrainは、オペレーションという単位で、学習や予測の処理を実行します。 オペレーションはオペレーションファイルにより設定し、制御することができます。 このチュートリアルでは、ご自身で準備した画像ファイルを画像認識する方法をご説明します。
-
オペレーションを実行するために必要なオペレーションファイルの雛形として、CIFAR-10 image classificationチュートリアルのためのオペレーションファイルを使いましょう。 オペレーションファイルはSmallTrain Dockerコンテナ上の
/var/smalltrain/operation/
にあります。 -
SmallTrain Dockerコンテナにログインして、オペレーションファイルを見てみましょう。
on the container
$ cd /var/smalltrain/operation/
$ less IR_2D_CNN_V2_l49-c64_TUTORIAL-DEBUG-WITH-SMALLDATASET-20200708-TRAIN.json
チュートリアルのオペレーションファイルの内容
/var/smalltrain/operation/IR_2D_CNN_V2_l49-c64_TUTORIAL-DEBUG-WITH-SMALLDATASET-20200708-TRAIN.json
{
"train_id": "IR_2D_CNN_V2_l49-c64_TUTORIAL-DEBUG-WITH-SMALLDATASET-20200708-TRAIN",
"### COMMENT ###": "tutorial training CIFAR-10 with small data set",
...
"data_dir_path": "/var/data/cifar-10-image/",
"data_set_def_path": "/var/data/cifar-10-image/data_set_def/train_cifar10_classification_small.csv",
"cache_data_set_id": "train_cifar10_classification_small",
"##### memo": "If cache_data_set_id is None, then set with train_id",
...
新しいオペレーションファイルを、このファイルのコピーとして作成します。例として、IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN.json
というファイル名にします。
on the container
$ cp IR_2D_CNN_V2_l49-c64_TUTORIAL-DEBUG-WITH-SMALLDATASET-20200708-TRAIN.json IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN.json
- 設定のポイント
train_id
- オペレーションファイル名に合わせて変更します(
IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN
)
- オペレーションファイル名に合わせて変更します(
data_dir_path
- 新しく学習、予測処理をする対象のデータディレクトリのパスを指定します。ここでは新しく
/var/data/mydataset/
というディレクトリを用意することにします。
- 新しく学習、予測処理をする対象のデータディレクトリのパスを指定します。ここでは新しく
data_set_def_path
- データセット定義ファイルのパスを指定します。ここでは新しく
/var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csv
というデータセット定義ファイル用意することにします。
- データセット定義ファイルのパスを指定します。ここでは新しく
cache_data_set_id
- データセットをキャッシュDB(Redis)に格納する際に使うデータセットIDを指定します。新しいデータセットに対応したデータセットIDを指定するか、空の値(
null
)を設定してください。 (null
を指定すると、cache_data_set_id
にはオペレーションファイル名がセットされます)
- データセットをキャッシュDB(Redis)に格納する際に使うデータセットIDを指定します。新しいデータセットに対応したデータセットIDを指定するか、空の値(
/var/smalltrain/operation/IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN.json
{
"train_id": "IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN",
"### COMMENT ###": "tutorial training CIFAR-10 with small data set",
...
"data_dir_path": "/var/data/mydataset/",
"data_set_def_path": "/var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csv",
"cache_data_set_id": null,
"##### memo": "If cache_data_set_id is None, then set with train_id",
...
続いて、データセットを用意します。上記で指定したデータディレクトリを、既存のCIFAR-10のデータディレクトリのコピーとして作成します。
on the container
$ cd /var/data/
$ ls -l
total 20
drwxr-xr-x 2 2156 1103 4096 Jun 4 2009 cifar-10-batches-py
drwxr-xr-x 9 root root 4096 Aug 3 04:31 cifar-10-image
drwxr-xr-x 3 root root 4096 Aug 3 04:31 smalltrain
drwxr-xr-x 2 root root 4096 Aug 3 04:31 work
$ cp -Rf cifar-10-image mydataset
$ ls -l
total 20
drwxr-xr-x 2 2156 1103 4096 Jun 4 2009 cifar-10-batches-py
drwxr-xr-x 9 root root 4096 Aug 3 04:31 cifar-10-image
drwxr-xr-x 9 root root 4096 Aug 3 07:35 mydataset
drwxr-xr-x 3 root root 4096 Aug 3 04:31 smalltrain
drwxr-xr-x 2 root root 4096 Aug 3 04:31 work
作成したデータディレクトリmydataset
に新しく予測対象となる画像を追加します。ここでは例として、ネコの画像を準備し、cat1.jpg
, cat2.jpg
というようなファイル名で、mydataset
ディレクトリ内にコピーします。
(Tips Jupyter Lab Notebookを利用した簡易的ファイル操作)
続いて、データセット定義ファイルを編集します。先ほど追加したネコの画像を、予測対象に指定します。
- まず、CIFAR-10チュートリアルのデータセット定義ファイル
/var/data/cifar-10-image/data_set_def/train_cifar10_classification_small.csv
をコピーして、新しい定義ファイル/var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csv
を作成し、
$ cp /var/data/cifar-10-image/data_set_def/train_cifar10_classification_small.csv /var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csv
- データセット定義ファイルに用意したネコの画像を追加します。
$ vi /var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csv
data_set_id,label,sub_label,test,group
/var/data/mydataset/cat1.jpg,3,3,1,TRAIN <- add cat1 image as a test data
/var/data/mydataset/cat2.jpg,3,3,1,TRAIN <- add cat1 image as a test data
/var/data/cifar-10-image/data_batch_1/data_batch_1_i9_c3.png,3,3,0,TRAIN
/var/data/cifar-10-image/data_batch_1/data_batch_1_i90_c2.png,2,2,0,TRAIN
/var/data/cifar-10-image/data_batch_1/data_batch_1_i91_c3.png,3,3,0,TRAIN
/var/data/cifar-10-image/data_batch_1/data_batch_1_i92_c8.png,8,8,0,TRAIN
data_set_id
にファイルパスを、label
にラベル番号を(ここではCIFAR-10の学習済みモデルを利用しますので、CIFAR-10のラベル番号を指定します)、test
は1
(テストデータとして使う)、group
はTRAIN
(デフォルト値)を指定します。 (詳しくはデータセットの準備の仕方を参照してください)
以上でオペレーションの設定は完了です。
オペレーションを実行します
いよいよオペレーションを実行します。オペレーションは、次のようなスクリプトから実行することができます。
# オペレーションID(train_id)を指定
$ OPERATION_ID=IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN
# オペレーションを実行
$ nohup /var/smalltrain/tutorials/image_recognition/operation_tutorials.sh $OPERATION_ID &
- TensorBoardを確認したり(ブラウザから`http://<YOURHOST>:<TENSORBOARD_PORT>`にアクセス)、ログを確認します。
```sh
tail -f /var/smalltrain/logs/IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN.log
```
オペレーションの実行結果は/var/data/smalltrain/results/report/$OPERATION_ID/
に出力されます。99ステップの学習の後の予測結果を表示させてみましょう。
$ less /var/data/smalltrain/results/report/$OPERATION_ID/prediction_e99_all.csv
DateTime,Estimated,MaskedEstimated,True
/var/data/mydataset/cat1.jpg_0,2,0.0,3
/var/data/mydataset/cat2.jpg_0,3,0.0,3
/var/data/cifar-10-image/test_batch/test_batch_i9_c1.png_0,1,0.0,1
...
cat1.jpgはEstimated
が2(bird)
と間違っていますが、cat2.jpgに対してはEstimated
が3(cat)
と正しく分類できました。