[[山内のサイト]]

*Chainer-VAEを試す 2017-04-16 [#c2b4f76c]
-[[pfnet-chainerexamples-vae:https://github.com/pfnet/chainer/tree/master/examples/vae]]
-[[RyotaKatoh/chainer-Variational-AutoEncoder:https://github.com/RyotaKatoh/chainer-Variational-AutoEncoder]]

**Katoh-バージョン 2017-04-16 [#f74ea2ca]
[[RyotaKatoh/chainer-Variational-AutoEncoder:https://github.com/RyotaKatoh/chainer-Variational-AutoEncoder]] をダウンロード

別の人がこれを試したレポート
-[[Variational Autoencoderでアルバムジャケットの生成:http://ryotakatoh.hatenablog.com/entry/2015/09/01/075301]]
-[[Variational Autoencoder(VAE)で生成モデル:http://qiita.com/RyotaKatoh/items/b353d14a5d7c3edc0f3e]]
--[[chainer-Variational-AutoEncoderを使ってみた:http://studylog.hateblo.jp/entry/2015/09/21/103835]]~
Chainerのバージョンが古くないとダメという話が書いてある。

---

で、修正点は
-2to3で、特にprint文の2-3変換~
中でsixを使ってなるべく対応しようとしているが、printは未対応

-pickle関連の2-3問題対応で
--python2ではcPickleを使っていたが、python3ではcPickleは無くなってpickleに統一された(らしい)。ついては、pickleに乗り換える必要がある。まずは、import文を書き直すと同時に、cPickleの呼び出しをpickleの呼び出しに書き換える。さらに次の変更が必要になった。

--pickleのloadでについては、ASCII codec errorが出るので、 [[たとえばここ:https://teratail.com/questions/28932]] を参考に、
 (dataset.py) 
     with open('%s/mnist/mnist.pkl' % data_dir, 'rb') as mnist_pickle:
         #mnist = six.moves.cPickle.load(mnist_pickle)
             ↓
         mnist = pickle.load(mnist_pickle, encoding='latin-1')

で対応。

--pickleのdumpについては、TypeError: write() argument must be str, not bytesが出るので、[[たとえばここ:http://www.trusted-design.net/archives/459/]] を参考に、
 (train_VAE.py)
         #with open(model_path, "w") as f:
             ↓
         with open(model_path, "wb") as f: 
             pickle.dump(copy.deepcopy(model).to_cpu(), f)
および
 (train_VAE_yz_x.py)
         # with open(model_path, "w") as f:
             ↓
         with open(model_path, "wb") as f:
             pickle.dump(copy.deepcopy(model).to_cpu(), f)
で対応。

-何と、python v2とv3で、整数の割り算「/」の扱いが違うので、エラーが起きた。~
v2: (int)/(int)の結果は(int)で小数点以下切り捨て 1/2 -> 0 になる 〜 C言語などと同じ~
v3: (int)/(int)で小数になれば、結果は(float)に変換 1/2 -> 0.5 になる~
~
従って、v2で<結果(int)小数点以下切捨て>を仮定したプログラムは、エラーを起こす。~
~
対処は簡単で、v3の (int)//(int) (=(int)で小数点以下切捨て)に書き換えればよい。
 # output_image[im_size[0]*(j / n_y):im_size[0]*((j / n_y)+1), im_size[1]*(j % n_y):im_size[1]*((j % n_y)+1)] = im 
           ↓
 output_image[im_size[0]*(j // n_y):im_size[0]*((j // n_y)+1), im_size[1]*(j % n_y):im_size[1]*((j % n_y)+1)] = im


------

で、MNISTを試してみた。

まずM1モデル作製
 python train_VAE.py --dataset mnist --gpu 1
data_dir(=dataset)とoutput_dir(=model), log_dir(=log)はデフォルト値を使った。~
生成されたのは、./model/mnist_100.pkl

次にM1データ生成
 python generate.py --dataset mnist --model model/mnist_100.pkl --gpu 1
output_dir(=generated)はデフォルト値を使用。~
生成されたのは、./generated/0.jpg 〜 99.jpg。下図の、左上から横に順に0, 1, 2, ...とし、1行あたり10枚ずつ、全部で10行分で100マイ表示。

&ref(generated.jpg);

次にM2モデル作成
 python train_VAE_yz_x.py --dataset mnist --gpu 1
data_dir(=dataset)とoutput_dir(=model)はデフォルト値を使用。~
生成されたのは、./model/mnist_VAE_YZ_X_100.pkl 〜 1000.pkl

最後にM2データ生成
 python generate_yz_x_py --model model/mnist_VAE_ZY_X_1000.pkl --dataset mnist --gpu 1
data_dir(=dataset)、output_dir(=generated_yz_x)、n_samples(=10)はデフォルト値を使用。~~
生成されたのは、./generated_yz_x/0.jpg 〜 9.jpg。下図のそれぞれの行が0.jpgから9.jpgに対応する。

&ref(generated_yz_x.jpg);

動画生成の処理は、
 python run_flying.py --dataset mnist --model model/mnist_VAE_ZY_X_1000.pkl --output_file flying.mp4 --gpu 1
data_dir(=dataset)、output_dir(=flying)はデフォルト値を使用。~
生成されたのは、./flying/flying.mp4

&ref(flying.mp4);

-------------

**VAE on MNIST (pfnのchainer examplesにある例) 2017-04-12 , 2017-05-04 [#x7754283]

[[ソースはここからダウンロード:https://github.com/pfnet/chainer/blob/master/examples/vae/]]。

ネットワークグラフは、~
&ref(graph.png,,660x1277);
&ref(graph.png,,1024x2010);

実行は
 python train_vae.py [--gpu 0 ←あれば]
実行ログ
 (testchainer) [yamanouc@ginger vae2]$ python train_vae.py --gpu 0
 GPU: 0
 # dim z: 20
 # Minibatch-size: 100
 # epoch: 100
 
 load MNIST dataset
 Downloading train-images-idx3-ubyte.gz...
 Done
 Downloading train-labels-idx1-ubyte.gz...
 Done
 Downloading t10k-images-idx3-ubyte.gz...
 Done
 Downloading t10k-labels-idx1-ubyte.gz...
 Done
 Converting training data...
 Done
 Converting test data...
 Done
 Save output...
 Done
 Convert completed
 epoch 1
 graph generated
 train mean loss=148.59899799346923, mean reconstruction loss=124.50837924957276
 test  mean loss=125.18526237487794, mean reconstruction loss=98.57060981750489
 epoch 2
 train mean loss=123.04057464599609, mean reconstruction loss=96.353647702535
 test  mean loss=118.93990997314454, mean reconstruction loss=92.34232131958008
 epoch 3
 train mean loss=118.02712524414062, mean reconstruction loss=91.34297876993816
 test  mean loss=115.37630790710449, mean reconstruction loss=88.64173065185547
 epoch 4
 train mean loss=114.901012840271, mean reconstruction loss=88.36450468699137
 test  mean loss=112.70116027832032, mean reconstruction loss=85.9324210357666
 epoch 5
 train mean loss=112.8132208887736, mean reconstruction loss=86.36892550150553
 test  mean loss=111.18254699707032, mean reconstruction loss=85.45186782836915
 epoch 6
 train mean loss=111.23203309377034, mean reconstruction loss=84.92290086110432
 test  mean loss=109.96828285217285, mean reconstruction loss=84.15437156677245 
 (中略 )
 epoch 98
 train mean loss=100.26071676890055, mean reconstruction loss=74.77274569193523
 test  mean loss=101.09095085144043, mean reconstruction loss=75.59276359558106
 epoch 99
 train mean loss=100.2337767791748, mean reconstruction loss=74.78483655293782
 test  mean loss=100.93597717285157, mean reconstruction loss=75.5415592956543
 epoch 100
 train mean loss=100.23028344472249, mean reconstruction loss=74.74699109395345
 test  mean loss=101.30174774169922, mean reconstruction loss=76.02072853088379
 save the model
 save the optimizer

出来上がったmodelを使って、~
(A)train側データを画像表示 [1, 3, 5, 10, 2, 0, 13, 15, 17]
| 元画像 x | 学習結果画像 model(x) |
| &ref(train.png,,400x400); | &ref(train_reconstructed.png,,400x400); |

(B)test側データを画像表示  [3, 2, 1, 18, 4, 8, 11, 17, 61]
| 元画像 x | 学習結果画像 model(x) |
| &ref(test.png,,400x400); | &ref(test_reconstructed.png,,400x400); |

(C)ベクトルzをランダムに生成したときの画像 ~
  N(a, b, (c, d)) は、平均:a、分散:b の正規分布に従う乱数を(cxd)の行列で出力する
| model.decode(N(0, 1, (9, 20))) |
| &ref(sampled.png,,400x400); |

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS