ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2023年3月26日日曜日

Dissipative Lagrangian Neural Networksについて

最近まで学業で研究をしていました。

その内容がDissipative Lagrangian Neural Networks(github)という先行研究のDissipative Hamiltonian Neural Networks(arxiv.org,github.com)とLagrangian Neural Networks(arxiv.org,github) を合体したものです。

具体的にどういうものかというと

ラグランジュ方程式に基づき、エネルギー散逸を考慮した力学系の学習が可能なニューラルネットワーク

  • Dissipative Hamiltonian Neural Networksでは必要であった正準座標系に依存しない
    • つまり、重さを知らなくても良い。 
  • Lagrangian Neural Networksでは考慮できない散逸を考慮できる
    • 保存場のみの計算が可能であるが、散逸場を含むと計算できない。
    • 空気抵抗などの粘性抵抗、摩擦などのエネルギーロスがあっても良い。

という感じです。
物理屋ではないので間違っていたら、書き換えると思います。たぶん。


ここでは苦労話を書こうと思います。


  1. DLNNで予測するモデル構造には複数のモデルが存在する

    ラグランジュ方程式を解くのですが、
    $$ \ddot{q} = - {\nabla _q \nabla _\dot{q} \cal{L}} + {\nabla _q \cal{L}} - {\nabla _\dot{q} \cal{D}} $$
    という微分方程式で表現することが最終的に求めることなのですが、この過程でヘッシアンで直接求めるか、頑張って二階微分するかです。
    ここで頑張って二階微分するとモデルとしての柔軟性が失われますが、一括で処理することができ、大幅な高速化が見込まれます。
    しかし、今回はvmapで並列化するという手法を取りました。
    これはすべての計算をニューラルネットワークのもつ自動微分で行わないので追跡性(backward?)を損なうと考えております。
    実際にはこのヘッシアンを使っています。
    なぜかそのほうが精度が良かったです。

  2. optimizerなにが良いのかがわからない
    投稿した現在もたくさんのoptimizerが出てきており、投稿時点ではLionというものがここ数週間で出てきた感じとなります。
    最初から備え付けのAdam,AdamW,自分でインストールしたDadapAdam,Lionを試しました。めんどくさくなって、サンプル結果だけAdanとかSGDとか見ました。
    他の方の検証によってはAdamWが良かったり、Adanが良かったり、Lionのタイパが良かったりするなどありました。

  3. optimizerやschedulerの扱いがよくわからない。

    今はdadaptationのAdamとtimmのCosineLRSchedulerを使っています。
    ただ、使用方法に書いてあるとおりに使用しておりません。
    何故かその通りに使用するとあまり芳しい結果が得られませんでした。
    dadaptationは
    「dadaptationがlrも管理するのでスケジューラーは使わないでね。それとd0は1r-6、lr=1でお願いね。」
    というふうに書いてあるように読み取れましたが、そのとおりにするとあんまり芳しくないんですよね。
    なんか試行錯誤の末、選んだ感じになりました。

  4. dadaptationはエポック数を稼ぎにくい

    試行回数が増えるほどnanやなんかdadaptのパラメータがおかしくなります。
    やだねぇ...。

  5. Lossの取り方がよくわからない

    一般的にMSE、平均二乗誤差を取るかと思います。
    これは一般的に有用であると考えます。バッチサイズにも影響を受けず、安定した値を返します。
    ただ、逆に細かな値の調整や外れ値に弱いと考えております。
    今回のような小さな値(0~100)を取り扱い、外れ値のような結果も外れではないという場合にはあまり良くないのではないかと考えております。
    $$ sum(abs(predict-train)) $$ という形でLossを取る場合、ノイズに弱くなると思うところがあるので、今後の課題の一つであるかと思います。

  6. バッチサイズが一般論とは違う
    リソースが許す限り、一般的にバッチサイズは大きければ大きいほど良いみたいな感じがあるのですが、これはそうではないです。
    なぜならば、Lossの取り方が$$ sum(abs(predict-train)) $$になっている場合、バッチサイズが大きくなればなるほどLossが大きくなります。
    しかし、エポック数を無闇矢鱈に増やす訳にはいかない...普通のものと比べるとエポック数を多少増やす必要があるようには思います。

  7. 活性化関数がよくわからない
    結局swishを使っているのですが、形としてはtanhshrinkが合いそうな気がするんですよね。
    結局は使っている活性化関数が答えですね。理由はわからないです。

  8. 隠れ層やその種類について
    現状はdenseで512次元です。
    これは最近になってどうするか考え出したので、結局答えはわからずじまいです。

以上より、なかなかに苦労したところでもあり、今後の参考になる部分ではないかと思います。

 

まとめ

 最近は力学系ニューラルネットワークが盛んになってきている傾向があると思います。これはHamiltonian Neural Networks(arxiv.org,github.com)を提案したSam Greydanus氏が恐ろしいほどすごい人であるからと考えております。

普通こんな事考えないよねと思ったりもしますが、いつの日かこういうニューラルネットワークが普通になるのかもしれない日が来るのかもしれないですし、来ないのかもしれないです...。 


余談

LNNは自身の環境では再現できませんでした。

再現できた方はおめでとうございます。

再現できた環境をネットの海に放流してください。

2022年6月5日日曜日

VS Code上のjupyter notebookでmatplotlibのアニメーションを再生する方法(How to play matplotlib's animation with jupyter notebook on VS Code)

こんにちは、WhiteTiger-21です。

タイトル通りの答えは(The answer of title is below)

from IPython.display import HTML
from matplotlib import animation, rc
from matplotlib import pyplot as plt

"""
animへアニメーション処理を行う
"""

HTML(anim.to_jshtml())

です。

細かい話を順に追って

matplotlibでアニメーションを表示する際に、普通は


from matplotlib import animation, rc
from matplotlib import pyplot as plt

def init():
	"""
    アニメーションの処理
    """

def animate(i):
	"""
    アニメーションの処理
    """

"""
ゴニョゴニョしたなにか
"""

anim = animation.FuncAnimation(fig, animate, init_func=init,frames=Nt, interval=1000*(t[2]-t[1])*0.8, blit=True)

plt.show()


という感じで書きますよね。

ただ、jupyter notebookでは

 

from IPython.display import HTML
from matplotlib import animation, rc
from matplotlib import pyplot as plt

def init():
	"""
    アニメーションの処理
    """

def animate(i):
	"""
    アニメーションの処理
    """

"""
ゴニョゴニョしたなにか
"""

anim = animation.FuncAnimation(fig, animate, init_func=init,frames=Nt, interval=1000*(t[2]-t[1])*0.8, blit=True)
HTML(anim.to_html5_video())

という感じで書きますよね。

 これでは画面に真っ黒なプレイヤーの画像が出るだけで再生されません。

これの原因は、VS Codeではビデオコーデックが入っていないからだそうです。

Cannot playback video clip in Jupyter within VSCode #7753 

その参照で、別のシステム(plotly)を使うことをおすすめされていますが、matplotlibで構築したシステムならば、こちらを使うほうが楽ですよね。

 

というわけで、

HTML(anim.to_jshtml())

を使うことがVS Code上でjupyter notebookを動かし、アニメーションを再生する方法として楽なものだと思います。

2021年8月22日日曜日

ZIPで圧縮した画像をZIPで圧縮したまま、画像のリサイズするスクリプトを書きました

みなさん、お久しぶりです。白虎21です。

皆さんは「P1×1v Faиb0×」や「Faиt1a」、「Patre0и」などをご活用されていますでしょうか?

絵師さんをサポートしている場合、画像を見返りとして受け取ることが多いかと思います。

その場合、 画像をZIPで圧縮されたデータとして受け取ることがあるかと思います。

その圧縮されたデータをスマホで見ることがあるかと思いますが、画像サイズが大きくて読み込みに時間がかかったりすることがあるのではないかと思います。

そもそもにスマホでは画素数が多すぎても意味がないと思うところがあります。

そのため、ZIPで圧縮された画像を新たなファイルなどを生成することなく、画像のリサイズを行うことができるスクリプトを書きました。

https://github.com/WhiteTiger-21/python_resize_zip_images

このサイトの「zip.py」が上記の内容が可能なスクリプトです。

他のファイルは開発段階の副産物です。

 

利用方法は該当のZipファイルが存在するところでPowerShellやターミナルを開いて、pythonを実行できる状態にしてください。

そして、次のようなコマンドを入力します。

python zip.py 「任意のファイル」

 

具体例として、「Sample.zip」のイメージをリサイズしたい場合は、次のようになります。

python zip.py Sample.zip


ただし、このスクリプトが利用するにはいくつかの条件があります。

  1. 第一に実行環境である「python」と開発するにあたって使用したパッケージファイルが入っていること。
    pythonが入っていなければ、pythonをインストールする必要がありますが、ただ単にこのスクリプトをダウンロードして、実行したいだけであれば、マイクロソフトの「ストア」アプリから「python」をダウンロードしてください。
    マイクロソフトストアのPythonのダウンロードサイト

  2. MITライセンスに同意する。
    端的に言うと何が起こっても一切の責任を負いません。
    必ずバックアップを取ってください。
    そもそもスマホ向けに画像を圧縮するようなツールなので、劣化なしの元のデータをしっかり取っておいてください。

  3. gifファイルが含まれていないこと。
    gifファイルは連番によりアニメーションのようになっているものがあります。
    それに対する対処を行っていないためです。

  4. ディレクトリが入れ子構造になっていないこと
    具体的には以下のようなディレクトリ構造となっていることが好ましいです。
        
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    `-- 09.png
     
    入れ子であったとしても、二分木などではなく、完全なる入れ子、マトリョーシカ状態になっていれば、一番階層の深いところから、一番上に来るだけです。

    具体例として問題のない例は、以下のように、完全なマトリョーシカ状態。

    他、二分木の状態になっていても、ファイル名が異なる状態。
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    |-- 09.png
    `-- Inside01
        |-- INSIDE_01.png
        |-- INSIDE_02.png
        |-- INSIDE_03.png
        |-- INSIDE_04.png
        |-- INSIDE_05.png
        |-- INSIDE_06.png
        |-- INSIDE_07.png
        |-- INSIDE_08.png
        `-- INSIDE_09.png
     
    上記の2つ所状態に値するものは問題ありません。
    しかし、以下のように、二分木状態であり、なおかつ、ファイル名が同じ場合、ファイルの上書きがされ、Inside03の中身のみが残ります。
        
    Sample
    |-- 01.png
    |-- 02.png
    |-- 03.png
    |-- 04.png
    |-- 05.png
    |-- 06.png
    |-- 07.png
    |-- 08.png
    |-- 09.png
    |-- Inside01
    |   |-- 01.png
    |   |-- 02.png
    |   |-- 03.png
    |   |-- 04.png
    |   |-- 05.png
    |   |-- 06.png
    |   |-- 07.png
    |   |-- 08.png
    |   `-- 09.png
    |-- Inside02
    |   |-- 01.png
    |   |-- 02.png
    |   |-- 03.png
    |   |-- 04.png
    |   |-- 05.png
    |   |-- 06.png
    |   |-- 07.png
    |   |-- 08.png
    |   `-- 09.png
    `-- Inside03
        |-- 01.png
        |-- 02.png
        |-- 03.png
        |-- 04.png
        |-- 05.png
        |-- 06.png
        |-- 07.png
        |-- 08.png
        `-- 09.png
    
    
  5.  

以上が利用するにあたっての利用条件です。

 

今回の記事は以上となります。

皆さんのお役に立つスクリプトとなれば幸いです。

また、改善点がございましたら、githubのREADME.mdにも記載している通り、Twitterにまでご連絡ください。

2016年7月4日月曜日

MMDBridgeでの不具合(2016/7/4時点)

IKなどの改善は日々行われているのですが、「全ての親」が派手に動くモーションは破綻しやすいようです。
また、pythonを32bitで入れているせいかしてMMDBridgeの一部機能でフリーズします。

皆様の知識をコメントにてお菓子いただけると幸いです(^^)