はじめてKaggleの(画像)コンペに参加したので参加記録を書く
先に感想を書いておくとデータサイエンス難しい~、Deep Learning 難しい~ってことを痛感したコンペでした。どういう構造で書くと見やすいですかね。
- 出たコンペについて簡単に
- 現状のスキル
- やる前のKaggle画像コンペに対する想像
- 目的・目標
- やったこと
- できなかったけどやりたかったこと(次回への目標のようなもの)
こんな感じで書きたいと思います。
出たコンペについて簡単に
今回参加したのは
APTOS 2019 Blindness Detection | Kaggle
というコンペで、内容は眼底画像から糖尿病性網膜症の重症度を求めるというものでした。(昨年も似たようなものが行われたらしく、その時の前処理の方法などが共有されていました。) データも画像一式とid-重症度を紐付けるcsvだけで夏休みも期間に含まれるということで、コンペの中では比較的やりやすいものだったと思います。
今回友人と2人でチーム組んで参加しました。互いにKaggleはTitanic(Tutorial) 以外初めてだったので、機械学習勉強会を語っているからには出ておきたいなぁと。
現状のスキル
ゼロからはじめるディープラーニング既習。DenseNetやCNN, U-netなどの比較的実装の簡単なモデルは組める。少しDeepなことはやったことがない。最近論文読んで(記事読んで)実装してみることをやっている。 どちらかというととても弱いほうだと思っています。
やる前のKaggle画像コンペに対する想像
すごい失礼なのですが、画像のresizeしてCNN組んでtrainしてまでは固定で、その後ハイパーパラメータをいじり続けるみたいなことを想像していました。(実際は前処理色々種類あるし、modelもたくさんあるし、学習偏りまくるし大変だった。)
目標・目的
自分は英語がすごく苦手で、最初はRuleやTimeLineも友人に読んでもらう始末でした。そのため今回の目標は
- Kaggleのコンペに書いてある英語を現実的な時間で読めるようになる。
- Kaggleの一連の流れを学び、必要な時間コストを把握する。次回出ることへの心理的抵抗をなるべく減らす。
- 実践で動く機械学習のコードを一つ以上制作する。
- (途中から追加)データサイエンスの一連の流れを再現性を保った状態で行えるようになる。…※ としました。
ディープラーニングに限らないのですが、コードがとても長くなってしまう関係上、とてもではないのですがコードすべてを読んで共有することはコストが大きすぎるので、現実的な時間で内容がわかるようなMarkdownを作ることを心がけたつもりです。(できたとはいってない) また、再現性についてはrandをseedを用意しないまま使ってしまったため再現性がなくなったCommitをしてしまったため追加した目標です。
やったこと
- 各ラベルの枚数・画像を表示などの探索(EDA)
- 画像サイズを揃える。cropする
- kerasでモデルを組む(DenseNet, CNN)
- 前処理として昨年優勝者が使っていたものが共有されていたため写経する(cv2の扱いもここで覚えた。)
- optimizerをQHAdamに変えてみる。 こうみるとあんまり動けてませんね、、、それぞれの箇条書きのタスクの大きさが疎らな自覚があるので、体系的な知識を持てていないのだと思います。
できなかったけどやりたかったこと(次回への目標のようなもの)
- epochごとのlossとaccを見たいからTensorBoardを表示したかった(jupyter上で見る方法が難しくて断念)。せめてmatplotlib使え。
- 画像をそのまま突っ込みたかった(KaggleのKernelではメモリ足りないと怒られる。)→終わった後にbatchsizeを小さくするとメモリ少なくて済むと知る。どこがメモリで展開されているのかみたいなハードよりの知識が足りないらしい。反省。→Batchsize小さくするとepochごとのブレが大きくなるから小さくしすぎるのも良くないらしい。なるほど。
- 学習がよってしまうのを防ぎたかった。(0と2によってしまうんですよね。防ぎ方がわからない)
- 前処理を理論付けて行いたかった(Gaussぼかし入れる理由だけは理解できたと思ってます。(Edgeに強く反応するためノイズによる影響を下げる))。血管を強調するためにこういうこと頑張って画像処理したよってものが公開されていてなるほどなぁと思うなどした。
- Photoshopなどを利用したかった。直感的に画像を操作してどういう前処理がいいのか考えたかった。
- もっとモデルを使いたかった。実装スピードがめちゃくちゃに遅い自覚を持った。(競技プログラミングとは違うねんな)
- ドメイン知識を使いたかった。公開されているNotebookには垂直に反転させているAugumentionかけているものもあって、それは間違っていることを知っているので。また、LRの区別も前処理段階でわかるようにできたなぁと思うなどしました。
- AWSやGoogleColabが使いたかった。KaggleAPIを使えばこれらで学習が出来るらしく、GoogleColabでやればよかったと思いつつ、KaggleAPI周辺の理解が追いつかなかった。
- 学習結果を保存できなかった。一度ローカルに重みをDLすればコミットも早かったし色々利用できただろうに。
- KerasのDataAugumentionに対して理解したかった。何もわからないまま借りてしまったので。どういう形式で吐き出すのかがわからないんですよね、、、
以上です。色々と勉強させてもらいました。