#【概要】
画像を入力にして画像を出力できるpix2pixで、数値流体力学(CFD)シミュレーションの結果(具体的には、同一の物理条件に対して高解像度格子で計算した場合と低解像度格子で計算した場合の密度)の分布図を学習して、低解像度格子の計算結果から高解像度格子の計算結果を生成できるか否かを検討しました。そして、密度の不均質度をある程度の精度で再現した分布図を生成できることを示すことが出来ました。
#【動機】
昨年、日本ディープラーニング協会(JDLA)のE資格を取得したのですが、認定講座の講義でGANsを知って、これは面白い!と思ったのがまず一つ目の動機です。E資格の試験勉強で知識を体系的に得ることは出来たのですが、自分で手を動かす経験をしないとその先には進めないと思ったのが二つ目の動機です。そして大学生の時から長い期間CFDシミュレーションに関わって来ており、それなりに思い入れがあるのでGANsとシミュレーションとで何か面白いことが出来ないかと考えたのが三つ目の動機です。
#【内容】
使用した[ソースコード][1]と内容についてまとめた[レポート][2]をGitHubに上げましたので、興味を持って頂けた方は参照ください。以降では、レポートには書かなかったが有用と思われる事項について記載します。
[1]:https://github.com/bright1998/GANsxSimulation/tree/master/pix2pix
[2]:https://github.com/bright1998/GANsxSimulation/blob/master/pix2pix/GANxSimulation.pdf
#【アーキテクチャの選択】
"GANZOO"と言われるように、GANには非常にたくさんのアーキテクチャが存在します。自分でオリジナルのアーキテクチャを設計する場合を除き、既存のアーキテクチャを活用することになります。どのアーキテクチャを活用すればよいかを判断するのは非常に難しかったですが、[こちらのサイト][3]である程度当たりをつけることが出来ました。いくつかの質問に答えていくと、該当するアーキテクチャの候補をあげてくれます。
[3]:http://www.thothchildren.com/thothnator/service/main/0/5ce14a32e1a5c628ba458a50?lang=ja
#【実装】
1から実装するのは勉強になりますが、非常に大変なので公開されているソースコードを利用させていただきました(自分のやりたい事を実現するために、一部の改変は必要になりましたが)。[こちらのサイト][4]には、多くのアーキテクチャのPytorch実装が公開されており、非常に有用でした。また、無料かつオンラインで行われた[勉強会][5]では、ソースコードつきで実行方法まで解説していただき、今回の検討を実現する上でのターニングポイントであったと言っても過言ではありません。
勉強会で配布されたソースコードに対して加えた大きな変更点は、4チャンネル目に情報を付加できるようにしたことです(今回は速度ベクトルの矢印プロット、もしくは速度の発散のコンタープロットの付加を検討しました)。ソースコードのmodel.pyへの変更は、in_channelsとout_channelsというパラメータで両チャンネル数を変更できるようにした程度ですが、画像の読み込みを行うdatasets.pyでは2枚の画像を組み合わせて4チャンネルのデータを作成するような変更を加えています(torch.catで結合)。in_channelsとout_channelsに同じ値を指定すれば、元々のソースコードと同じ動作となります。
[4]:https://github.com/eriklindernoren/PyTorch-GAN
[5]:https://aifashion.connpass.com/event/149576/
#【今後】
入力データ(密度の分布図)を作成するために実行した数値シミュレーションは、非定常計算です。つまり時間変化を解いているので、時系列の概念があります。そこでpix2pixとLSTM(Long short-term memory)を結合させたネットワークを作成し、時系列画像(動画)から時系列画像(動画)への変換に取り組みます。
現在執筆中の論文が書き終わって一段落したら、記事にしたいと思っています。
[記事][6]を書きました。
[6]:https://qiita.com/bright1998/items/71819ce6f0f53f7972ae