Skip to content

Instantly share code, notes, and snippets.

@funwarioisii
Last active August 12, 2018 03:49
Show Gist options
  • Save funwarioisii/1bbfa23e031f21264ae219a6e9a15f0c to your computer and use it in GitHub Desktop.
Save funwarioisii/1bbfa23e031f21264ae219a6e9a15f0c to your computer and use it in GitHub Desktop.
二項分布からの乱数生成速度比較(Python)

二項分布からの乱数生成速度比較(Python)

動機

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も多分早いんじゃないかな…?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment