浮世絵作者予測 1位解法
参加者の皆様&運営さんお疲れさまでした。
先に0.940を出して一位だったCamaroさんが途中で消えて、なんだろうと思っていたら辞退だったようで、辛うじて一位になれたようで嬉しいです。
途中10個くらいモデル作ってましたが、最終的に2モデルの平均で0.940が出ました。
ソースコードはこちらです。
https://github.com/ak110/probspace_ukiyoe
- ネットワーク: 40層くらいのResNet+Erase ReLU+MaxBlurPool+GeMPooling+その他諸々入ったオリジナルなやつ
- Data Augmentation: mixup+RandomErasingとその他適当に(affine, blur, unsharpmask, brightness, などなど)。
- Epoch数: 1800 + Refined Data Augmentationを50epochくらいしたりしなかったり
- optimizer: SGD+Nesterov momentum
- lr: 1e-3 * バッチサイズ * GPU数 + Cosine Annealing without restart
- バッチサイズ: 16
- GPU数: 2
- L2: 1e-4
- TTA: 25crops × mirror
- アンサンブル: 5-FoldのCV×2モデルの平均
10個くらい作ったのは上記の範囲内の細かいバリエーションで、CVスコアは大体0.90~0.92くらいでした。
そのうち3モデルくらい以上で平均を取るとLBで0.929~0.937くらいは安定して出てましたが、テストデータが少ないためにCVスコアとの相関はほとんど無く、最後(0.937→0.940)は配合を変えて投げまくる感じになってしまいました。
Refined Data Augmentationは学習率などのハイパーパラメータにかなり敏感な感じがしますが、うまくいけば効果的な気がしてます。
Epoch数はくずし字の時の反省からほぼずっと1800epochでやってました。途中300epochでも実験してみましたがCVスコアが0.88くらいに落ちたので(少なくとも自分の実装では)それなりに回す必要がありそうでした。(普段別のデータセットで1800epochで調整してるのでData Augmentationの強さとかが影響されてるかも)
一応このデータに特化した話として、元々が224x224と小さいので、ネットワークの最初の方を(GPUメモリの許す範囲で)出来るだけ手厚くするのが有効だった気がします。(CVスコアを見た限りでは。LB上は誤差でした…。)