nattochaduke
Model:
Shallow and / or Narrow ResNet
ResNetを浅くしたりチャンネル数を半分にしたり
Data Augmentation:
Random Cropping
28x28の画像を36x36にパディングし,32x32の部分をランダムにクロップ.
回転 15°を上限に画像全体を回転.回転角は一様分布からサンプリング.
その他
Pseudo-Labeling
Label smoothing($\epsilon=0.1$)
Unsupervised Pretraining
画像を回転させたりフリップしたりしてその操作を推測させて事前学習するやつ(もとの論文を忘れたので誰か教えてください)
Average Ensemble
いろいろと実験をしたのだが,嫌になってデータをすべて消したので以下はうろ覚え.
Random Cropping (ResNetは128x128を入力とした)とmean subtractionのみを前処理とし,batchsize=128, lr=0.2, Momentum SGD, cosine annealingによって30 epoch学習した結果,5-fold CVにおいて,validation accuracyが
SE-ResNeXt: 0.96
Shallow ResNet: 0.95
Narrow ResNet: 0.93
ShakeShake: 0.99
ShakeDrop: 0.95
となった.ろくにハイパーパラメーターチューニングをしていないので,不公平な実験であることは明らかにしておく.この結果を受けてShakeShakeを使うことにした. ShakeShakeとShakeDropはchainercv2の実装を使った.ShakeDropはdtypeのcastにバグがあったので修正しないと実行できなかった(どこかは忘れた).
Label Smoothing, 回転,Cutoutを適用し,5-fold CVで得られたモデルをaverage ensembleすることで,test setにおけるスコア0.992を得られた.
Test setに対する推測をPseudo-Labelingし,同じくShakeShakeをrandom initilizationから学習した.
このとき,pseudo-labelingはモデルたちの推測結果の平均をラベルとし,label smoothingとの兼ね合いで0.9を上限にクリップした.
異なったランダムシードによって異なったtraining/validation splitを作成し,合計で30のモデルを学習し,validaition errorの低いモデルを10個選んで同じくaverage ensembleを行い,最終的にスコア0.994を得られた(実用性?知らない子ですね・・・).
ak1100氏の二位解法をみると,300 epochと私の設定の10倍で,さらには"300epochしか回さなかったのは足りてなかったかもしれません"と述べている. Cosine annealingもShakeShakeもエポックを多くすることがキモだが,shakeshakeの効率が悪すぎて(volatile gpu-utilが20%を超えない)あまりにまだるっこしいし学習曲線がサチって見えたので短縮してしまった. 短気は損気(確信).
今回のコンペではわりとオーソドックスな手法を様々試し,組み合わせることで3位に入賞することができた.もっと参加者が多かったり難しい課題だったりするコンペも基本を抑えれば結構戦えるのではないだろうか.夢が広がる.
dkobayashi
Unsupervised Representation Learning by Predicting Image Rotations
こちらですかね?事前学習については完全に頭から抜け落ちていたので非常に参考になりました。
nattochaduke
dkobayashiさん ありがとうございます