algonote

機械学習とか

Kaggle Carvanaに参加したが成果を出せなかった

KaggleでCarvana Image Masking Challengeに参加しました。 結果はPrivate Leaderboardで737人中227位。メダルには程遠いですね。

コンペ概要

f:id:hiromichinomata:20171003034656p:plain

写真から車のうつっている部分のみを切り出すセグメンテーションのタスク。 車かそうでないかの2値をあてるだけなので、セマンティックな分類としては簡単な方。

評価はダイス係数で行われる。 ダイス係数は以下の式で算出でき、予測と実際の合致具合を表している。

f:id:hiromichinomata:20171004024631p:plain

DiscussionにKerasとPyTorchのU-netでのベースラインが上がっていて、Kerasの方はGithubに公開されており、0.995のスコアを出している。(手元の環境だとReadmeの0.996出なかった)

github.com

要はベースラインの時点で99.5%あっていて、残りは0.5%を詰めるのが勝負になる。

最終的なPublic Leaderboard上のスコアでBronze 0.996806、Silver 0.997001、 Gold 0.997182が下限。Private Leaderboard無視すればベースライン+0.1806%でBronze、+0.2001%でSilver、+0.2182%でGoldとなる。

最初見たとき桁が細かすぎて計算間違っているのかと思ったが、どうやらKaggleでは普通のようだ。

やったこ

ベースラインモデルは入力サイズを変えられるようになっており、batch size 1で128x128だとval_dice_coeff: 0.9931 (8h27m)、1024x1024だと0.9950(16h20m)。ローカルの時間短縮のため128x128を改修し、筋がいいモデルを1024x1024に流すことにした。GPUGeForce GTX1060 6GB。

Optimizerの変更

SGDにすると汎化性能が上がるという話もあるのでOptimizerまわりを変更してトライ。

  • Momentum SGD (4h8m)
    val_dice_coeff: 0.9910
    悪化した

  • Adam (8h43m)
    val_dice_coeff: 0.9912
    悪化した

活性化関数の変更

CIFAR100ではELUの方がReLUより精度が上がるらしい。FReLUの方が結果がいいがKerasのLambdaであらわせなかったので断念。ついでにSELUも。

  • ELU (6h40m)
    val_dice_coeff: 0.9927
    悪化した

  • SELU (8h34m)
    val_dice_coeff: 0.9931
    変わらなかった

CNNベースでの比較を元にLeaky ReLUでも。

  • LEAKY RELU alpha=5.5 (5h37m)
    val_dice_coeff: 0.9910
    悪化した

正規化の変更

Batchサイズが小さい状況だとBatch Renormalizationが有効らしい

  • Batch Renormalization (8h5m)
    val_dice_coeff: 0.9928
    悪化した

入力サイズの変更

ベースラインでは1918x1280の画像を正方形にリサイズしている。それをやめてみる。

  • 192x128 (4h17m)
    val_dice_coeff: 0.9919
    悪化した。が、trainのdice_coeffが0.9902から0.9905にあがっていたので、大きい入力でも試す。

  • 1920x1280 (41h12m)
    val_dice_coeff: 0.9962
    +0.12%改善した😄
    これを提出。

所感、得られた知見

CIFAR100だと精度上がるという論文でも99%以上あるベースラインのさらなる向上には寄与しなかった。つらい。

Submit作成にもだいぶ時間がかかった(6h47m)。数が多いとつらい。もっとGPU欲しい。

AWSのG3でブーストかけようとしたがGTX 1060 6GBより遅くて断念。Cudaコアは負けているのに速いのは世代の差なんだろうか。

kaggle-cli便利。1コマンドでデータセット一括できるのは良い。

Hyperdash便利。時間も測れて、外でログを見てニヤニヤできる。