引き続いて、Generative Deep Learning [1] の 8章 Diffusion Models のサンプル (ddm.ipynb)[2]を実行。
このような画像を学習するのに、fitにかかった時間は、RTX A2000 (6GB) をGPUに使って1時間38分ほどかかった。
![](https://blogimg.goo.ne.jp/user_image/2b/6e/15893efca55089e267158fc92ac2eb53.png)
最初はこんなところだが、
![](https://blogimg.goo.ne.jp/user_image/60/11/312a0c61c8a7572f9cae4ba435691707.png)
Epoch 8になるとこの様になんとなくそれっぽい画像を生成し、
![](https://blogimg.goo.ne.jp/user_image/02/2d/40904c04645f0ef42f064c0bb0a5f5ae.png)
Epoch 19では、ここまでの画像を生成するようになった。
![](https://blogimg.goo.ne.jp/user_image/21/c9/c2a8725e7f7cf27d4fd46e4ac543e95e.png)
Epoch 50の学習終了で、最終的にはこのようなリアルな画像が生成できるようになった。
![](https://blogimg.goo.ne.jp/user_image/32/30/8b13915b945e64152577ff5841d0bbe1.png)
Denoisingで画像が改善されてゆく過程の例がこちら。
![](https://blogimg.goo.ne.jp/user_image/12/4d/dcf4de9b12e7419f6f45cd538fd3006e.png)
また、内挿で連続的に変化する画像を生成した例がこちら。
![](https://blogimg.goo.ne.jp/user_image/0a/ed/dd1a97087a4deecd60340b71e8f60537.png)
と、ここまではサンプルをそのまま実行しただけ。
この章では、ノイズを載せるプロセスで、linear, cosine, offset cosine の三つのスケジュールが紹介されていて、前記はoffset cosine での結果。
サンプルコードには、linearやcosineのコードもあるようなので、試してみた。
まずは、linear を試してみた。最初 (Epoch 2)がこんななのは当然として、
![](https://blogimg.goo.ne.jp/user_image/44/3b/1e28e3466f6bd31b97cffcbe2e69a08a.png)
それが、最後のEpoch 50でもこんな感じのまま。
![](https://blogimg.goo.ne.jp/user_image/6d/01/599d7e60f5be5eb7291309af7da5e611.png)
TensorBoardでみたepoch_n_loss がこのようなので、まったく学習が働いていないわけではないはずなのだが。
![](https://blogimg.goo.ne.jp/user_image/30/81/ef76e3ce58434c1d9959d5bf768caa1d.png)
次に、cosine を試してみる。
cosineの場合、Epoch 8になるとこのように何らかの画像らしきもを生成するようになるが、
![](https://blogimg.goo.ne.jp/user_image/2e/72/2c3fd3277e45bb28c7f3634af2f4c208.png)
そこから先は、Epoch 50になっても大して向上していない。
![](https://blogimg.goo.ne.jp/user_image/62/da/291cddf8457acd04a2c41600cad6d95f.png)
最終的に生成できるようになった画像がこちら
![](https://blogimg.goo.ne.jp/user_image/2a/9d/cb6bb72d1cf9efd1fdef68c855f75a49.png)
![](https://blogimg.goo.ne.jp/user_image/0f/97/d2a28fc5376999060e382e2c930419e1.png)
linear や cosineのスケジュールでも結果を出すにはどうすればよいだろうか。このサンプルでは64ステップだが、ステップ数を増やして細かく学習させたらどうだろうか。ということで、BATCH_SIZEを 128にして cosineで試してみたのがこちら。学習に6時間14分を費やして、最終的に生成するようになった画像だが、あまり改善した印象はない。
![](https://blogimg.goo.ne.jp/user_image/15/3b/98a163e8c61477e241f3674366b0bbd7.png)
さてここで、n_lossの視点で比較整理してみるとこうなる。生成する画像では実感できないものの、ステップ数を増やすことでn_lossは確実に改善される。128からもっと増やせばlinearやcosineでもよい結果を出せるのだろうが.. 6GBしかメモリを積んでいないRTX A2000 ではここが限界。CPUのみの方で実行すればもっと増やせるだろうが、実行時間がねぇ...
なお、この図でX軸 (epoch数)は対数表示であることに注意。この感じからすると、10 epochもやれば結果は見えたようなもの、かな。
![](https://blogimg.goo.ne.jp/user_image/09/fc/0cbf49d0c0bdd03fec1110952ea50254.png)
実際にやってみて思ったのだが、筋のよいアイディアを思いついたとしても、そこから先、実際に良い結果を出せるところまでがまた長いなと。一つすごい成果が出た後にわらわらと後追いが出てくるが、これは、実際にできたのが居るのだから私だってできるはずと頑張った、という事なのかもしれない。
[1] Generative Deep Learning, 2nd Edition by David Foster, Released May 2023, Publisher: O'Reilly Media, Inc. ISBN: 9781098134181
[2] https://github.com/davidADSP/Generative_Deep_Learning_2nd_Edition
[2] https://github.com/davidADSP/Generative_Deep_Learning_2nd_Edition