作業記録, 比較実験考察 8, Dec, 2019 Sun

8, Dec, 2019 Sun

- Annotation set を生成するプログラム作成
- 動画を7本使ってる annotation set と 3本だけ使ってる annotation set があることに気がついた。7v, 3v として 7v が隠れていた。7v の annotation set を作成。
-  比較実験 [annotation set, batch size]

# Cross validation
# 学習時間の計測
# scheduler 入れたか入れないか log の頭部に出力
# 7v ではなく 6v のデータで学習, 残りの 1v で評価をするべき? もしくはサンプリングしてから split する?
# 73, 7030がどれくらい直前じゃないのか確認して、なんなら 7x:3x で妥当と言ってもいい値を決める?
#-> 先生かサンマくんに聞いた方が良さそう。

# Optical flow 移行準備。

======
batch size あげて精度が微増 + 上昇傾向のまま終了 なので、じゃあ今までの annotation set でやったら精度あがるかなって
bs = 1028, 前後半7:3 で学習したけど train loss が下がっただけで特に得るものはなかった。
前後半7:3はやはり問題がある。


- アノテーションセットを生成するプログラム作成
前後半割合で出力するのは grep | [head | tail] ですぐできるため、学習データと評価データを交互に取り出すようにした。
3本の動画から 70枚学習, 30枚評価 を繰り返す annotation set "3v7030" を生成。
7本の動画から 70枚学習, 30枚評価 を繰り返す annotation set "7v7030" を生成。
7本の動画から 7枚学習, 3枚評価 を繰り返す annotation set "7v73" を生成。

*** 比較実験
RGB
bs = [32, 64, 1028], annotation_set =[7v7030, 7v73]

7v7030_bs-1028_lr-1e-4:
epoch 49, loss: 0.0179, val_loss: 0.2051, micro_precision: 0.8294, micro_recall: 0.8413
7v73_bs-1028_lr-1e-4:
epoch 49, loss: 0.0186, val_loss: 0.0976, micro_precision: 0.9044, micro_recall: 0.9274

7v7030_bs-64_lr-5: 
epoch 49, loss: 0.0445, val_loss: 0.1995, micro_precision: 0.8018, micro_recall: 0.8405
7v73_bs-64_lr-5: 
epoch 49, loss: 0.0464, val_loss: 0.1033, micro_precision: 0.8940, micro_recall: 0.9084

7v7030_bs-32_lr-1e-5:
epoch 49, loss: 0.0352, val_loss: 0.2096, micro_precision: 0.8159, micro_recall: 0.8411
7v73_bs-32_lr-1e-5:
epoch 49, loss: 0.0379, val_loss: 0.0978, micro_precision: 0.8981, micro_recall: 0.9222



7v73_6fps_bs-32_lr-1e-5_20191208-1733







現状どの batch size がいいということはない。
Annotation set は明らかに結果に影響を与えている。(統計ができないので優位かどうとかはわからない)
前後半 7:3 で分けた annotation set は 精度が 60% 付近で停滞する
前から70枚と30枚を交互に train, test に振り分けた 7v7030 は 80~84%
前から7枚と3枚を交互に train, test に振り分けた 7v73 は 89~92%

学習した直後のフレームを評価に使っている割合が高くなるため、小刻みにした annotation set で精度が上がるのはそれはそうだろうという感想。
でも学習と評価のデータのマップを同じにするっていうのはそういうことでは?
ランダムに分けて精度高くて喜んでたことを思い出す。

7v ではなく 6v のデータで学習, 残りの 1v で評価をするべき? -> まず精度出ないだろう。
もしくはサンプリングしてから split する? -> 6fps でもほぼ直前? 画像見る必要あり。
73, 7030がどれくらい直前じゃないのか確認して、なんなら 7x:3x で妥当と言ってもいい値を決める?

よくわからない、先生かサンマくんに聞いた方が良さそう。



***  20 epoch 付近で停滞が始まるので 20 epoch 目で lr*0.1
最終精度が良さそうなのだけ出してるけど
32, 64 の 7v7030 は lr=1e-6 だけが過学習してない。これに scheduler 導入したら変わるかもしれない。

7v7030_bs-64_lr-1e-6:
epoch 49, loss: 0.2930, val_loss: 0.2928, micro_precision: 0.6959, micro_recall: 0.8026

7v7030_bs-32_lr-1e-6
epoch 49, loss: 0.2415, val_loss: 0.2395, micro_precision: 0.7093, micro_recall: 0.8169

 

lr = 1e-6 一定と 20 epoch 目で下げたグラフ
7v7030_6fps_bs-64_lr-1e-6_20191208-16007v7030_6fps_bs-64_lr-1e-6_20191208-1738

loss は下がらず、精度が下がった。
loss のグラフが水平になってしまい精度上昇が止まる。
実装の見直しや step のタイミング、減少率を調整することはできるけど……。

===
/*
犬後輩に train loss と val loss の差が広いと モデル保存されないって言われて、val loss が低ければ保存したくなった。ただ、閾値よりは高いけど loss 差が少ないモデルを無視するのはもったいない気がしている。
val loss が高いやつはどうせ使わないから保存しなくても、と思うけど 閾値の決定にはトライ&エラーが必要なので新しく別の学習をしたくなったとき不便だと思う (両方に対応するのは面倒)。

今いい精度でた学習済モデルも多分使わないし、学習にそこまで時間がかかっていない (2時間くらい?) のでひとまずは放置、必要になったら学習し直すつもり。
*/

/*
同様の指摘で、multi stream で学習したときに batch size 32, 64 くらいが限界だったことも思い出した。
1028 でいい精度が出てもmulti stream 学習に活きないかも。

逆伝搬を諦めるならバラで学習したモデルの出力だけ concat でもいいけど……。
アーキテクチャ大きく変えないなら 32, 64 でも比較実験を行なっておくべき。
*/

コメント