0~255で表現された画像を255で割ることはよくあることで,それを学習に用いたりします
すると画像が0~1の値を取ります これを0か1を取る確率に見立てる方法があります
これは学習ごとに画像をサンプリングするデータオーギュメントとしての意味があるそうです
Tutorial on Variational AutoEncodersにそんな事が書いてあります
少し調べると安定のNumpyかEdwardかとなりましたので,これらを比較しました
tensorflow.contrib.distributions.Binomial
なんてのもあるみたいですが使い方がわからなかった……
ImageNetの画像が(224,224,3)だったと思うので以下のx
で比較します
環境はGeForce 1080TiとXeon(R) CPU E5-1650 v4 @ 3.60GHz
Jupyterの%timeit
コマンドで各セルを計測します
import tensorflow as tf
import numpy as np
import edward
x = np.random.uniform(0, 1, [200,224*224*3])
Edwardは以下2つ Graphを使うか使わないか
with tf.Graph().as_default():
with tf.Session() as sess:
sess.run(edward.models.Bernoulli(probs=x))
with tf.Session() as sess:
sess.run(edward.models.Bernoulli(probs=x))
np.random.binomial(1, x)
870 ms ± 6.67 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.21 s ± 362 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.01 s ± 564 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
なる結果でした EdwardをちゃんとGraph使って計算すると早いって感じです
tensorflow.contrib.distributions.Binomial
も多分早いんじゃないかな…?