DeepLearning E資格 G検定

SIGNATE開催CDLEハッカソン2020予測性能部門「画像データに基づく気象予測」に参加した。

はじめに

G検定/E資格合格者(CDLEメンバー)のみが参加できるCDLEハッカソン2020の予測性能部門(SIGNATE開催)に参加し、1位を獲得することができました!

コンペのタスク内容は、気象衛星ひまわり8号により撮影された過去の日本全域の雲画像と、対応する気象解析データを使って未来の雲の変化を予測し、向こう24時間の雲画像を生成するというものでした。

以下、簡単ではありますが私の解法を共有いたします。

予測結果

まず初めに、今回のコンペで作成したモデルでの予測結果を一部紹介します。

下図の左側が正解画像、右側が予測画像です。 ぼやけてはいますが、雲の移動をなんとなく予測できているのかなと思います。

アプローチ

データは衛星画像と気象データ(7要素)とあり、種別が多いため、データを一括してモデルに入力し予測するのは難しい問題だと感じました。
そのため、今回のアプローチは種別ごとの特徴を効率的に捉えることに着目してモデル設計から取り掛かりました。
一種のマルチモーダル学習と考えて、種別ごとの特徴を効率的に捉えるために複数のエンコーダを使用することとしました。

ネットワークモデル

モデルの入出力

直近24時間(24個)の衛星画像データと直近1個の気象データを入力データとし、未来24時間分(24個)の衛星画像データ予測値を出力します。

特徴量の工夫点

■入力する特徴量データ
 ①直近24時間分(24個)の衛星画像データ
 ②直近1個(全高度)の気象データ(下記5要素)

  • 東西風(UGRD), 南北風(VGRD) -> Windデータ
  • 海面気圧(PRMSL), 湿度(RH), 気温(TMP) -> Otherデータ

衛星画像の直近24時間分をメインの特徴量とし、補助的に気象データの直近1つを使用しています。
気象データを直近1個としたのはGPUのメモリ節約のためです。
また、気象データは全部で7要素ありますが、生データを確認し予測に寄与しそうな5要素を(カンで)選びました。

■欠損データの扱い
 衛星画像データは前後データから加重平均による線形補間をしています。
 気象データはチュートリアルと同じ補間をしています。

■特徴量のサイズ
 いづれの特徴量も(168, 128)のサイズに統一しています。
 ・入力の衛星画像データはサイズを1/4にbilinearで縮小しています。
 ・出力の衛星画像データはサイズを4倍にbilinearで拡大しています。

■特徴量の正規化
 特徴量はそれぞれ[-1, +1]の範囲で正規化しています。
 なお、Windデータ(東西風と 南北風)に関して、風向きを表すため正負を考慮し、ゼロ点は変化させないように最大値+1に合わせて標準化をしています。

モデル構成

今回のモデルは Multi-path EfficientUNET です。(勝手に名付けました。)

3つのエンコーダを持ったMulti-pathの構造が特徴です。
また、モデル軽量化のためエンコーダにはEfficientNetの構造を取り入れています。
デコーダ部分は各エンコーダの特徴マップを結合したものを入力としてアップサンプリングしています

モデリングの工夫点

以下、細かいですが自分なりに工夫した点です。

・モデルはUNETをベースとしたシングルモデルとしシンプルにしています。
 ⇒RNN系と比べて省メモリで学習が効率的だと考えました。
  (ConvLSTM、PredRNNなども試したのですが、実装が悪いのか精度が出ませんでした。。。)

・UNETのエンコーダ部にEfficientNet構造を採用しました。
 ⇒少ないパラメータ数でありながら高い精度が期待できます。

・UNETに入力するデータを3種(衛星画像、windデータ、otherデータ)に分け、エンコーダを別々に3つ用意しました。
 ⇒データ種別ごとにエンコーダを用いることで、データ種別に合わせた効率的な学習が期待できます。

・活性化関数はFReLUを採用しました。
 ⇒画像認識特化型の活性化関数により精度向上が期待できます。

・EfficientNet内のSEモジュールをscSE(Concurrent Spatial and Channel Squeeze & Excitation)に変更しました。
 ⇒SEモジュールはSelf-Attentionと考えられます。scSEではチャンネル方向に加えて空間方向も合わせることで精度向上が期待できます。

・UNETの最終出力層の活性化関数はtanhの後、1.1倍を乗じています。
 ⇒今回の衛星画像データは境界値(uinr8で0と255)の値を多く含みます。
  そのため、tanhだけでは境界値(-1,1)に近づこうと重みが大きくなってしまいます。
  そこで、ラベル平滑化と同様の処理を追加し、tanh後に1.1倍を乗じて[-1.1, +1.1]で出力させています。
  教師データは[-1, +1]のままですので、これにより重みが大きくなりすぎない効果が期待できます。
  実際に予測する際は境界値でクリッピングしています。

・損失関数にはMAE+MSE+SSIMを採用しました。
 ⇒今回の評価指標がSSIMのため、SSIMも追加しています。
 (SSIM単独ではスコア上がらず。MAE+MSE+SSIMが最も効果的でした。)

さいごに

以上が私の解法となります。

CDLEハッカソンのオリエンテーションにて本コンペの内容を知り、おもしろそ~という何気ない気持ちで参加させて頂きましたが、いざ参加してみると、ディープラーニングとコンペの楽しさにどっぷり浸かってしまいました。笑
私にとって本格的なディープラーニング実装は初めてで四苦八苦することも多々ありましたが、学ぶことが多く大変貴重な経験ができました。

末筆ではございますが、この度は大変興味深いコンペティションを企画・開催してくださり、JDLA様、SIGNATE様、Weathernews様に感謝申し上げます。

-DeepLearning, E資格, G検定

Copyright© Program as Life , 2020 All Rights Reserved Powered by AFFINGER5.