【後編】 この前出たKaggleコンペの1stと4thが解法共有してたから復習する
1st solution
めっちゃ間空いてしまった。今から書くのは↓の和訳みたいなもの。コメントがところどころ挟まってます。
1st place solution summary | Kaggle
Validation Strategy
まず2015年にあった似たいような大会のデータセットを使った。可能であればそれで事前学習するのがとりあえず思いつくところだが、Labelの付け方が2019と違っていて、そのままでもやってみたけどPerfomanceが良くならなかった。
Preprocessing
データの状態がいいからResize以外していない
Models and Input size
4種類*2個(seed値を変えている)のモデルを学習させてそれの平均を最終スコアとしてsubmitした。
- InceptionNet v4
- InceptionNet とResnetを混ぜたもの(inception_resnet_v2)
- seresnext50
- seresnext101
InceptionNetはGoogLeNetなどで使われる構造で、枝分かれした先で別の種類の処理を施した後mergeする構造(を持ったネットワーク)のことと理解しています。
seResNetは知らなかったのですが、Chainerではライブラリに実装されてるんですね。Resnetの残差側(枝分かれして畳み込みする方)の最後に全結合層を入れた構造らしい。
https://arxiv.org/pdf/1409.4842v1.pdfより引用
以下数点箇条書き
- EfficientNet(4thの解法)はできれば使いたかったけど、それには時間が足りなかったとのこと。
- 入力サイズは大きいほうが2015年のコンペでいい結果を出していたらしく512*512にした。
- 最後のPoolingはAveragePoolingのほうがいい成績を残すらしい。
train and test
- まずそれぞれのmodelを教師あり学習させた。seedの違う2つのモデルの平均をその手法の評価値とした。
- その後に、public test dataや追加の外部データを用いて半教師学習をした。追加のデータセットを今回の形式に合わせる上での苦労話が載っているが割愛。
- 最後にもう一度教師あり学習をした。
感想(1st solutionにたいして)
- 前処理がresizeだけというのが意外。画面の色が大きく違ったけど、あんまり問題ないのかな? 平滑化くらいはしておかないとモデルが変なエッジで過学習起こすとかなんとか聞いていたけど、そういう言説は試すまで信じないのが正しいのかな。
- やらなかったけど間に合ったらやってたというEfficientNetは早急に読もう
- 半教師学習は思いつくべきだったなぁと。(物体検出やSegmentation ならともかく、分類タスクでは論文そのままで行けるはずなので)
感想(全体を通して)
- Kaggleにおけるモデルの掛け合わせ(複数のモデルの平均を取ってスコアを上げる手法)はよくあるテクニックらしい。
- Networkは比較的平易なものでも結果が出ている。
- テストデータセットも使えるものは使おう。
- 似たようなデータセットがないか探してくるのは割と必須っぽい。
というわけでkaggle反省会でした。