yakataの情報奮闘記

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

【前編】 この前出たKaggleコンペの1stと4thが解法共有してたから復習する

www.kaggle.com

自分の参戦期はこちら

はじめてKaggleの(画像)コンペに参加したので参加記録を書く - yakataの情報奮闘記

まぁまぁ翻訳っぽい某になると思います。()は自分がつけた文章

4th solution

ソースはこれ 4th place solution (2nd after LB cleaning) | Kaggle

Data

  • 2015年にあったコンペのDatasetで予めtrainしておいたよ!そうしたら0.73~0.75くらいのスコアはでた。(文中のスコアは競技中に把握できるPublic Score)

Models

試したModel

  • se-resnext50
  • se-resnext101
  • densenet

これらはあんまり良くなかった。(どうやって判断したんだろ) だけど、efficient-netはいいパフォーマンスが出たから最終スコアもこれで出したよ。efficient-netに必要なimagesizeは以下のようにしたよ

  • B3 image size: 300
  • B4 image size: 460
  • B5 image size: 456

Preprocessing

CropとResizeだけした。チームメンバーがそれ以外はスコアあんまり変わらんかったし使わなかった。Publicに共有されていたBen's color preprocessingも試しはしたけど。

Augumentations

今までで一番Augumentationしたぜ!全部 "albumentations" ってライブラリから貸してもらったよ! (箇条書きしているところは原文に会ったところですが、":"の後の説明は自分が説明として加えたものです。)

  • Blur
  • Flip
  • RandomBrightnessContrast(これ意味あるの初めて知った。光の指す方法をぼかして情報を消してる感じかな~)
  • ShiftScaleRotate
  • ElasticTransform
  • Transpose(転置。体の構造を考えるとこれはやらないほうがいいと思うのだけどどうだろう?あまり変わらないのかな)
  • GridDistortion(直訳: グリッド(市松)のねじれ、ゆがみ。血管のちょっとした曲がり方とかに対して過学習するのを防いでいるのか?)
  • HueSaturationValue: HSV(色相・彩度・明度)をランダムに変えている。(RandomBrightnessContrastと同じような感じかな)
  • CLAHE: ヒストグラム平坦化(Photoshopとかでコントラスト上げる方法のひとつ)をコントラスト制限をつけて適応させる
  • CoarseDropout: 矩形領域に対してCoarseDropoutを適応させる。( [1708.04552] Improved Regularization of Convolutional Neural Networks with Cutout albumentationsのDocumentをみたら説明なしでArxivのってた。これArxivくらいにしか載ってないんだけどどうなの?)

( というわけでAugumentationの所感

ドメイン知識で殴れるところがありそうな一方、RandomBrightContrast みたいな過学習しないためにどうAugumentationするかみたいなことに対して熱心に考えた末のところはまだまだ追いつかないなという印象。 )

Training

昔のデータでpretrain: b3に80epoch, b5に15epoch 今回のデータでtrain: b3に50epoch, b5に15epoch topperformanceがでるepochらを使ってsimpleに平均をとったよ。(efficientnetしらないからここら辺の意味があっているかわからない) TTAのためにFlipした画像も使ったよ (※TTAって何?についてはこちら Test Time Augmentation (TTA) ... worth it? | Kaggle)

隠し味

test dataに対して疑似ラベルを付け、train dataだけじゃなく疑似ラベルも用いて、ネットワークをチューニングした。 これが結構よかったので、前の(おそらくは2015のDataSetの)コンペのテストデータセットにも疑似ラベルをつけました。

yakataくんの感想

※ここからは本当にただの感想です。 これでEfficientNetを知ったのですが、調べてみると(Arxivでは)今年の5月に出た論文らしく、新しいものをキャッチする能力が高いなぁという感想がまずありました。

最後の方にある疑似ラベルというのが、ドメイン知識で殴ってlabelを付けたという意味なのか、半教師あり学習としてモデルを再設計したという意味なのかが怪しい。ただ、Traindataをincreaseするためにって言ってるから後者っぽいなぁ。SemanticSegmentationばかりやっていて普通のClassificationの知識が弱いんですよね、、、有名どころはおさえているつもりですけど。

DataAugumentationはどれくらいの根拠ある論文のものは採用していいのでしょうか?というのは気になります。ただ概ねどういう過学習を避けたいかが伝わってくるAugumentationだったので理解しやすかったな。

というわけで前編でした。