見出し画像

cifar10

画像認識の比較的小さなデータセットにcifar10というのがある.Google Colab上のfast.ai v1のデフォルトでどのくらいの精度が出るか試してみた.

Cifar10は上にあげたような粗い画像から,10種類の物体を当てる問題である.

データを読み込んだ後に,get_ransform()でデータ増大(data augmentation)を行うためのオブジェクトtfms を生成する.画像データ束クラス ImageDatabunch のfrom_forder()メソッドでデータを生成するが, その際に引数df_tfmsにtfmsを渡して訓練時に画像を多少変えて行うように設定し,最後に,データ束をnormalize()メソッドで正規化する.

tfms = get_transforms()
data = ImageDataBunch.from_folder(path, valid='test',ds_tfms=tfms)
data.normalize()

次に,データとアーキテクチャ(ワイド残差ネットワーク)をあわせて学習器を生成する.メトリクスは精度(accuracy)とする.また,to_fp16()メソッドで混合精度(floating point を32ビットでなく16ビットで計算する) ようにする.訓練はfit_one_cycleを用いる.エポック数は25とし,過剰適合を避けるために,重み減衰のパラメータwdは0.4と大きめに設定する.

learn = Learner(data, models.wrn_22(), metrics=accuracy).to_fp16()
learn.fit_one_cycle(25, wd=0.4)

結果はこんな感じで,92%が出た.

Total time: 3:20:58
epoch train_loss valid_loss accuracy
1 1.230103 1.127558 0.595500
2 0.988168 0.979095 0.661900
3 0.847955 1.012877 0.663300
4 0.803126 0.834432 0.715200
5 0.763791 0.787263 0.728800
6 0.759712 0.827707 0.718700
7 0.763642 1.117438 0.632300
8 0.764936 1.365362 0.586000
9 0.726698 0.881222 0.712100
10 0.706573 0.858986 0.706600
11 0.702239 0.681822 0.764500
12 0.705610 0.735147 0.752300
13 0.697909 0.900621 0.703500
14 0.645437 0.708900 0.764800
15 0.630382 0.672743 0.770600
16 0.577261 0.842925 0.727700
17 0.513260 0.790494 0.751300
18 0.495181 0.668702 0.776900
19 0.433109 0.439049 0.848000
20 0.386401 0.371708 0.873100
21 0.332771 0.315914 0.891400
22 0.276771 0.283706 0.901800
23 0.224303 0.258870 0.910500
24 0.188823 0.235979 0.916700
25 0.183530 0.228434 0.92080

こちらをみると2015年あたりの世界記録は更新したようだ.wide residual networkだと96%が出るようだが,パラメータはwdだけ設定したので,こんなもんだろう.

しかし,数行のコードをチューニング(ほとんど)なしで,しかも無料のGPUクラウドで十分に実務で使えそうな結果が得られるとは,良い時代になったものだ.

訓練と検証の損出関数もついでにプロットしておく.



この記事が気に入ったらサポートをしてみませんか?