23

N セットの独立した乱数を生成しようとしています。10個の乱数の3セットの問題を示す簡単なコードがあります。tf.set_random_seedを使用してシードを設定しても、異なる実行の結果は似ていないことに気付きました。ヘルプやコメントは大歓迎です。

(py3p6) bash-3.2$ cat test.py 
import tensorflow as tf
for i in range(3):
  tf.set_random_seed(1234)
  generate = tf.random_uniform((10,), 0, 10)
  with tf.Session() as sess:
    b = sess.run(generate)
    print(b)

これはコードの出力です:

# output :
[9.604688  5.811516  6.4159    9.621765  0.5434954 4.1893444 5.8865128
 7.9785547 8.296125  8.388672 ]
[8.559105  3.2390785 6.447526  8.316823  1.6297233 1.4103293 2.647568
 2.954973  6.5975866 7.494894 ]
[2.0277488 6.6134906 0.7579422 4.6359386 6.97507   3.3192968 2.866236
 2.2205782 6.7940736 7.2391043]

私は何かが欲しい

[9.604688  5.811516  6.4159    9.621765  0.5434954 4.1893444 5.8865128
 7.9785547 8.296125  8.388672 ]
[9.604688  5.811516  6.4159    9.621765  0.5434954 4.1893444 5.8865128
 7.9785547 8.296125  8.388672 ]
[9.604688  5.811516  6.4159    9.621765  0.5434954 4.1893444 5.8865128
 7.9785547 8.296125  8.388672 ]

更新 1:実際、シード初期化子を for ループ内に配置した理由は、それらを別の方法で設定したいからです (たとえば、別の MCMC 実行の場合と考えてください)。これは仕事をする私のコードですが、効率的かどうかはわかりません。基本的に、0 から 2^32-1 の間でいくつかのランダム シードを生成し、実行ごとにシードを変更します。メモリ/RAMの効率を高めるためのヘルプやコメントは大歓迎です。

import numpy as np
import tensorflow as tf
global_seed = 42
N_chains = 5
np.random.seed(global_seed)
seeds = np.random.randint(0, 4294967295, size=N_chains)

for i in range(N_chains):
    tf.set_random_seed(seeds[i])
    .... some stuff ....
    kernel_initializer = tf.random_normal_initializer(seed=seeds[i])
    .... some stuff
    with tf.Session() as sess:
         .... some stuff .....
 .
 .
 .
4

7 に答える 7

0

generateグラフには 1 つではなく3 つの変数 (操作) が定義されているため、実行ごとに異なる結果が得られます。これは、3 つの操作につながる for ループ内に生成操作があるためです。(Tensor("random_uniform:0"), Tensor("random_uniform_1:0"), Tensor("random_uniform_2:0")). print(generate)forループ内で行うだけです。上記の 3 つの異なる操作が表示されます。

tf.set_random_seedグラフ レベルでシードを設定します。したがって、グラフ内の各操作のシードを決定論的に選択します。したがって、3 つのgenerate操作には、実行ごとに同じ 3 つのシードが割り当てられます。これが、実行ごとに、3 つの変数すべてに対応して同じ結果が表示される理由です。ランダム シードの設定の詳細については、こちらをご覧ください。

したがって、セッションを実行するたびに同じ結果を得たい場合は、次のようにすることができます。

tf.set_random_seed(1234)
generate = tf.random_uniform((10,), 0, 10)
for i in range(3):
    with tf.Session() as sess:
        b = sess.run(generate)
        print(b)

しかし、なぜnセッションを作成したいのでしょうか。理想的には、1 つのセッションを作成してから、セッションn時間を実行する必要があります。実行ごとに新しいセッションを作成する必要はなく、グラフ内の変数と操作をデバイス (GPU または CPU) に配置しようとするたびに作成します。

于 2018-07-09T18:50:41.970 に答える