signateの雲画像予測コンペに初参加したので、そのログ。
個人の備忘録と技術メモのつもりで簡単にやったことつづってきます。
まず結果は17位。1位との精度差は10%くらいだった。初参加にしては上々なできかな。レベル高くて驚いた。
コンペのデータ構成
データは雲画像とmetaデータの2種類。metaデータは湿度、温度、風の向きとかの格子状の2次元データ(グレースケール画像)。【データの特徴把握のため使った方法】
・TSNEで雲量を分布を可視化
・類似画像検索でmetaデータと雲画像と相関関係の深いデータを調べた
・天気関係の本で気象庁がどうやって雲を予測しているかとか、雲の発生する流れの理解
metaデータの中で、湿度(RH)と風(VGRD)が雲画像と一番関係しているけど、活用方法が思いつかなったので保留した。
使うアルゴリズムは、動画のフレーム予測を予測するGAN系ネットワーク(VideoGAN, Recycle-GAN)とかを調べた中で、convLSTMの発展系のprednetが一番使えそうなので、改良して使用。
prednetを改良
以下の点でprednetを改良
・prednet にresnetを追加することでextrapolationや精度をよくした。
・訓練回数を増やしてなるべく精度を上げた
・prednetの活性化関数のA_activation='relu'なのを、差分をとりたいなら"tanh"にすると有効だった。
・画像を簡単にするよりも、なるべく多くの画像群での一連の動作を何回も学習させた方が効果的。
resnetを入れて、時刻tの予測画像をt+1の予測画像にaddした。そうすることで一から学習することなく、前の画像をもらいながら予測できる。
【extrapolationで24時間分の画像予測部分】
公開されてたprednetは複雑でネットワークがかなり改造しにくかったので、もっと改造しやすいprednetを実装すればよかった。
【convLSTM系ネットワーク改造例】
【他にも色々試して無駄だったこと】
・opencvのaddWeightメソッドで合成する
・cycleGANで予測した画像の補正とかUnetで予測するとかのアイデアと実装してしまったこと
精度を上げるには、metaデータをもっと使ったり、過去データを上手く活用する必要があったかもしれない。
結果まとめ
【一位の人の画像】
等高線の軌跡があるので、metaデータと雲量の相関関係を出して、関係のあるmetaデータを予測して、雲と関係の高い値のところをヒートみたいに染めるとかの手法でも使ったのか?
【予測する前の3h分の画像のgif(GroundTruth)】
【そこから自分が予測した24h分の画像のgif】
はじめてのコンペだったので、下調べに時間使いすぎたり、上手く精度を上げる方法がわからなかった。
投稿した回数は数回で、結果は17位。1位との精度差は10%くらいだった。
とにかく「まず投稿→feedback→改善→投稿」の繰り返しでPDCAサイクルを効率よく回せるかが、精度上げてくののカギっぽい。上位の人ほど投稿数が多い傾向にあった。
ちなみに自分は少ししか投稿しなかったので、何が精度アップに直結するのか把握する余裕がなかったのが後悔した点。
初参加で学んだこと
・とりあえずゴミのような駄作でも一度submitまでやってしまうこと。PDCAサイクルが回しやすくなる。
・アイデアは先人の知恵を奪うこと
・なるべく高得点を出せるパターンを見つけてPDCAサイクルを回して改善していく
・とりあえずやったデータやアイデアのログは後から見返せるように、dropboxに保存したり、ノートに記録しておいた。
・いい手法を思いつくには大量に良質なインプットして考えまくるのは変わらない
・今の手法がいいか迷ったらとにかくsubmitして得点だし、feedbackを得ること
はじめてのコンペでわからないことも多かったので、勝つより、経験を積むための初戦だった気がする(もちろん勝つ気でいたけど、当たり前的にレベルが高かった)。
こんなに考えたのは機械学習の中でも1、2位を争うくらいだったので、スキルも上がった。何より発想力、技術力がメッチャ上がるし、気軽に始められるし、勝てればリターンでかいし、いいことずくめだと思った。
(基本、土日も考えるので終わった後の疲労感はやばい)