yakataの情報奮闘記

プログラミングの話をします

【後編】 この前出た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する構造(を持ったネットワーク)のことと理解しています。

f:id:ponyo4869yakata398:20191005060533p:plain
Inception

seResNetは知らなかったのですが、Chainerではライブラリに実装されてるんですね。Resnetの残差側(枝分かれして畳み込みする方)の最後に全結合層を入れた構造らしい。

https://arxiv.org/pdf/1409.4842v1.pdfより引用

f:id:ponyo4869yakata398:20191005062034p:plain
https://arxiv.org/pdf/1709.01507.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反省会でした。