2016-01-19 1 views
9

ランダム変数を生成して2回使用しようとしています。しかし、私が2回目にそれを使用すると、ジェネレータは最初のものと同じではない2番目のランダム変数を作成します。ここで実証するコードは次のとおりです。TensorFlowでランダムベクトルを生成し、それを今後も使用するにはどうすればよいですか?

import numpy as np 
import tensorflow as tf 

# A random variable 
rand_var_1 = tf.random_uniform([5],0,10, dtype = tf.int32, seed = 0) 
rand_var_2 = tf.random_uniform([5],0,10, dtype = tf.int32, seed = 0) 

#Op1 
z1 = tf.add(rand_var_1,rand_var_2) 

#Op2 
z2 = tf.add(rand_var_1,rand_var_2) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    z1_op = sess.run(z1) 
    z2_op = sess.run(z2) 
    print(z1_op,z2_op) 

私はz1_opz2_opが等しくなるようにしたいです。これは、random_uniform opが2回呼び出されるためです。これを達成するためにTensorFlow(NumPyを使用せずに)を使用する方法はありますか?

(私のユースケースはより複雑であるが、これは蒸留質問です。)

答えて

13

あなたが0にシードを設定しているので、彼らは内の同じ値を持つことになりますが、ランダム(sess.run()を呼び出すたびに新しいrand_var_1の値とrand_var_2を生成しますあなたのコードの現在のバージョンsess.run()への1回の呼び出し)。後で使用するためにランダムに生成されたテンソルの値を保持したい場合は

、あなたはtf.Variableに割り当てる必要があります。

rand_var_1 = tf.Variable(tf.random_uniform([5], 0, 10, dtype=tf.int32, seed=0)) 
rand_var_2 = tf.Variable(tf.random_uniform([5], 0, 10, dtype=tf.int32, seed=0)) 

# Or, alternatively: 
rand_var_1 = tf.Variable(tf.random_uniform([5], 0, 10, dtype=tf.int32, seed=0)) 
rand_var_2 = tf.Variable(rand_var_1.initialized_value()) 

# Or, alternatively: 
rand_t = tf.random_uniform([5], 0, 10, dtype=tf.int32, seed=0) 
rand_var_1 = tf.Variable(rand_t) 
rand_var_2 = tf.Variable(rand_t) 

が...その後tf.initialize_all_variables()が所望の効果を持っています

# Op 1 
z1 = tf.add(rand_var_1, rand_var_2) 

# Op 2 
z2 = tf.add(rand_var_1, rand_var_2) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init)  # Random numbers generated here and cached. 
    z1_op = sess.run(z1) # Reuses cached values for rand_var_1, rand_var_2. 
    z2_op = sess.run(z2) # Reuses cached values for rand_var_1, rand_var_2. 
    print(z1_op, z2_op) # Will print two identical vectors. 
+0

'sess.run'を制御できない場合、どうすれば動作しますか?私はEstimatorでそれを使用しているので、すべてのセッション管理は隠されています。私の関数 'g()'は 'f(t)'を同じ 't'で2回呼び出す必要があります。しかし、 'g()'を呼び出すたびに、別の 't'が必要です。基本的には、関数 'g()'の全期間、 'tf.random_uniform()'の結果をキャッシュします。 –

0

あなたの質問は、あなたがrandom_uniformを呼び出す場合二回使用すると、2つの結果を得るという点で、this questionと同じ問題があり、そのようなあなたのように2番目の変数を最初の変数の値に設定する必要があります。あなたはz1z2が等しくなるようにしたい場合は、なぜまったく別々の変数を持っている、とは言う、

rand_var_1 = tf.random_uniform([5],0,10, dtype = tf.int32, seed = 0) 
rand_var_2 = rand_var_1 

しかし:それはあなたがrand_var_1後から変更されていないと仮定すると、あなたがこれを行うことができ、ということを意味しますか?なぜない:

import numpy as np 
import tensorflow as tf 

# A random variable 
rand_var = tf.random_uniform([5],0,10, dtype = tf.int32, seed = 0) 
op = tf.add(rand_var,rand_var) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    z1_op = sess.run(op) 
    z2_op = sess.run(op) 
    print(z1_op,z2_op) 
+0

2つの結果が得られますが、両方のシードをゼロに設定しているので、2つの結果が同じでなければなりません。私の実際のユースケースでは、2番目の値がランダム変数の別の関数であるため、2番目の値を最初の値に設定することはできません。私は誤解を招く例をお詫びします。同様に、 'z1_op'と 'z2_op'は私のコードで異なります。ここでは、各ステップで異なる乱数が使用されていることを示すためにここで使用していました。 – Distopia

関連する問題