理乃美

ソフトとハードと論理の覚え書き

RealNVP を試す

2024-05-05 01:34:48 | AI
引き続いて、Generative Deep Learning [1] の 6章 Normalizing Flow Models のサンプル (realnvp.ipynb)[2]を実行。

6GBしか載っていないRTX A2000でも実行できて、fitに掛かった時間は1分55秒。
得られた変換と逆変換がこちら。


RealNVPは、データ空間のうち興味のある部分は拡大し興味の無い部分は縮小する可逆な変換を学習することで、latent空間の任意の点を選ぶことが興味のある部分の中の任意の点を選ぶことになるような手段を得ることだと理解した。
Variational autocodersのところでKL divergenceを使ってlatent空間がスカスカにならないよう工夫したが、それに近いところがあるのだろうか。だが私には今のところ使い所がピンと来ない。

[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

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

LSTMを使った文書生成や画像生成を試す

2024-05-01 23:38:41 | AI
引き続いて、Generative Deep Learning [1] の 5章 Autoregressive Modelsのサンプル (lstm.ipynb,pixelcnn.ipynb, pixelcnn_md.ipynb)[2]を実行。

まずは、long short-term memoryを使った文章生成(lstm.ipynb)。
実行自体は簡単。6GBしか載っていないRTX A2000でも実行できた。
fitに掛かった時間は10分。
もともとのサンプルでは"recipe for roasted vegetables | chop 1 /" の次の1単語を生成させていたが、それもつまらないので4単語先まで生成させてみた。
temperature = 0.2での生成例
recipe for roasted vegetables | chop 1 / 4 cup of the
recipe for roasted vegetables | chop 1 / 2 cup of the
temperature = 1.0での生成例
recipe for roasted vegetables | chop 1 / 4 cup of chard
recipe for roasted vegetables | chop 1 / 2 cup tometoes and


tempertureが 0.2でも1.0でも、chop 1 / の次は 2 か 4 が来るのが同じくらいにもっともらしく、その次には cup が来るのが最もありそうというところまでは変わらない。
で、temperature が低いと cup の先が高い確度のもと of the と続く一方で、temperatureが高いと cup の先に続く単語がばらけてくる。

なお、上記の例では4単語先まで生成させているが、さらに長く生成させることもできる。だが、長い文章を生成させるとだんだんと可笑しくなってしまう。
また、temperatureは低ければ元のレシピ文章のなぞりに近くなるはずだが、temperatureが高いほうが同じパターンを繰り返すような場合もあった。このサンプルでは学習に使ったレシピの数が25と少ないので、その影響かなと推測する。つまり、temperatureが高いことで出現頻度の低い単語が一度選ばれてしまうとその単語に続く文言がワンパターンしか学習していないので他のパターンを選びようがない、という事が起きたのではなかろうか。


次にPixelCNNによる画像生成
このようなトレーニング画像をPixelCNNで学習するサンプル。


これも、6GBしか載っていないRTX A2000でも実行できたが、fitに 48分31秒も掛かった。
temperature=1.0で生成した画像がこちら。まあ、なんとなく微妙だなぁ。


じゃあ、temperatureを下げたらどうなるかと試したのがこちら。0.5にするとまともな画像にならないのはなぜだろう。

PixelCNNは左上から順に画像を作る。学習するどの画像も中央に画像があって周囲は白。という事は「上や右が白ならこのpixelも白」と強く学習されていると思われる。temperatureが低いとその学習にひっぱられていつまでも白以外のpixelが現れず仕舞いとなったのだろう。


最後に、Tensorflow distributionsを使ったPixelCNNのサンプル. (pixelcnn_md.ipynb)
6GBしか載っていないRTX A2000で実行し、fitに20分11秒掛かった。
で生成した画像の例がこちら。生成に1分49秒も掛かっているところからワッパが悪いなと感じる。


[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

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CGANは学習が重い

2024-03-11 01:27:49 | AI
引き続いて、Generative Deep Learning [1] の 4章 Conditional GAN (CGAN)のサンプル (cgan.ipynb)[2]を何とか実行。多少パラメータをいじることで、やっとそれらしい結果を得られた。
cgan.ipynbは、セレブ顔画像セットを Blond_Hairであるかどうかでラベル付きで学習し、生成する画像をブロンドにするかどうかをラベルで制御できるようにするというもの。

前回のサンプルまではそのままで動いたが、cgan.jpynbは2か所ほど手を加える必要があった。
変更点1: トレーニングデータ不足を補うため、下記のようにrepeatメソッドを追加。これをしないと学習の途中でデータが尽きたといって止まってしまう。

変更点2: ブラウザとjupyter labの負荷軽減のため途中経過の画像出力の頻度を制限。これをしないと、ブラウザあるいはjpyterのサーバがクラッシュすることがある。


実行環境は、メモリが16GBでCPUが Core i5 10600 (3.3GHz) 6 コア 12 Thread.
前回のWGANがRTX A2000だと無理だったので、最初からあきらめてCPUでの実行とした。

最初は、動かすための前記変更だけを行ったサンプルコードの場合。
全部で2000epoch のうち、500epochごとの進捗がこちら. おなじlatent空間の点からlabelだけ変えて生成した画像を並べている。
501/2000

1001/2000

1501/2000

1991/2000

そして、学習完了後に生成画像がこちら。なお、latent空間の点はお互いにばらばら。

金髪か否かで生成し分けているのだが、どうだろう。 言われればそうかもしれないが、よくわからない。そもそも、顔イメージそのものが学習しきれていないように思うがどうだろう。
ちなみに、学習にかかった時間は120分30秒

まず試したのがcriticの回数をepockあたり3回から5回に増やすこと。
501/2000

1001/2000

1501/2000

1981/2000

Generate imagesの結果

所要時間 3時間6分 (186分)

次に、criticをepockあたり5回で、さらにepochの回数を倍の4000にした。
1001/4000

2001/4000

3001/4000

3951/4000

Generate imagesの結果

所要時間 6時間12分(372分)

ばらばらのlaten vectorから作った画像を並べた Generate images の結果だと分かりにくいが、同じlatent vectorからlabelだけ変えて作った画像を並べた3951epochでの画像をみると、Blond Hair という属性を学習して画像を作り分けられるようになったと言えるだろう。

CGANサンプルの実行にはかなり時間がかかりしんどかった。学習に費やされる時間が長かったのはもちろんだが、エラー終了してしまって無駄になった時間がさらに長かった。延々とCPUを走らせて、そろそろ終わりかなというところブラウザがクラッシュとかなると、ちょっと辛い。
いろいろと試すには大容量VRAMを搭載したGPUが必須かな...
24GBを積んだP40ならヤフオクでも3万円で出品されているけれど、パッシブ冷却だからパワフルな送風ファンが必須。AI実験用のサブPCは、古いタワーなので 送風ファンのスペースが足りなくてP40は使えない。メインPCは、そのつもりで買った大型ケースなので送風ファンごと収まるけれど、AIの実験でメインPCが長い時間使えなくなるのが不便。それが理由でAI実験環境にサブPCに移したのだからなぁ。

[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
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

WGAN-GPは安定していたが...

2024-02-25 23:31:50 | AI
引き続いて、Generative Deep Learning [1] の 4章 Wasserstein GAN with Gradient Penalty (WGAN-GP)のサンプル (wgan_gp.ipynb)[2]を試し、学習の安定性が向上していることは見て取れた。一方で、Gradient Penalty のためにInterpolated imageを使うことによってアーティファクトが発生していた。実用的には単純なinterpolationではなくもっと工夫が必要なことが見て取れた。

このサンプルは、VRAM 6GBのRTX A2000では メモリ不足で実行できなかったが、GPU無し用のdocker imageを使いCPUのみを使って実行した。

このサンプルでは、下記のような64x64のカラー画像の画像セットで学習する。

学習は、1epochあたり判別機の学習をCRITIC_STEPS 回 行って 200 epoch 行う。
まずは、サンプルそのままに CRITIC_STEPS = 3 で実行。
その学習の進捗を50 epochごとに示すと、
1/200
.
50/200

100/200

150/200

199/200

となる。
最終的に生成される画像の例がこちら。

教科書figure 4-14の生成例と比べるといまいち。WGAN-GPの学習の安定性を見るために学習と生成を3回行い、その結果を並べてみるとこの通りで、DCGANを試した時と比べるとずっと学習が安定している。しかし、教科書にあるほど良い結果にはなってない。あれは良い画像だけを選んだものかな?




ちなみに、学習にかかった時間は約120分。 マシンは、メモリが16GBでCPUが Core i5 10600 (3.3GHz) 6 コア 12 Thread.
結果がいまいちに思えたので、CRITIC_STEPSを変えて試してみた。CRITIC_STEPSが 2, 3, 5, 7 で最終的な生成画像を並べてみるとこうなる。この結果で言うとサンプルのCRITIC_STEPSはちょっと少なかったかな。ただ回数を増やせば学習の所要時間も増して、それに見合うほどの画質向上が得られるかというところがある。
CRITIC_STEPS=2 使用時間 85分

CRITIC_STEPS=3 所要時間 118分

CRITIIC_STEPS=5 所要時間 186分

CRITIC_STEPS=7 所要時間 253分


下記は生成された画像の一つだが、二重写しのように見える。思うに、Gradient Penalty のためにオリジナルと生成物の二つをミックスしてほどほどの評価点の物として学習させているため、二重写しもそれなりに受け入れられる画像として学習してしまっているのかと推測した。


[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
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

DCGANはなかなか難しい

2024-02-10 22:35:58 | AI
Generative Deep Learning [1] の 4章 deep convolutional GANのサンプル (dcgan.ipynb)[2]を試してみたところ、DCGANで思うような結果を出すのが難しいと実感できた。
このサンプルでは、下記のようなレゴブロックのモノクロ画像(64x64 dot)を教師データとしてレゴブロックの画像生成を行う。

生成器と識別器がだまし/だまされないように互いに切磋琢磨(?)するのが、敵対的生成ネットワーク (Generative adversarial networks: GAN) で、生成器と識別器が畳み込みニューラルネットワークでできたGANが deep convolutional GAN: DCGAN.

で、上手く訓練ができれば、このように画像が生成できる。出来がいまいちだって? DCGANの規模が小さいからかな。でも、これは4回目にやっとできた上出来の結果なんだ。

一回目だと、最初は良い感じに訓練できていたものの途中でこんな風に偏ってしまい、

結果としてこういう画像を生成するようになってしまった。

二回目もやっぱり、途中までは良いものの突然このように道を踏み外して、

結果はこれ。

三回目もやっぱり、途中で偏ってしまってこの結果。



識別器が、画像の特定の特徴のみを見て真偽判定するように訓練され、生成器もそれに合わせてその特徴のみを模倣するように訓練されてしまったという事なのだろう。

教科書では、「GANは生成モデルにブレークスルーをもたらしたが、GANはとても訓練が難しい」とさらっと書いてある。が、実際にコードを動かしてみると長々待ってできたのが使えない生成器という繰り返しは結構しんどい。
このサンプルは、VRAM 6GBの RTX A2000で動かしている。一つのstepに二十数秒かかっていてそれを300回繰り返しているから、トータルで1時間以上かかる。それだけ時間をかけて出てきた結果が使えない生成器だとがっかり。

何事もやってみないと分からない。

[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
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする