2017-01-25 8 views
0

1つの配列にサイズ[1x9]というデータがあり、乱数1から9を生成してシャッフルしています。テンソルを使用してランダムに生成された値を変数にコピーできません

# generating an array of number 
BCI = tf.concat(0, [tf.fill([1,3],1),tf.fill([1,3],2),tf.fill([1,3],3)]) 
# making it in to 1x9 
BCI1 = tf.reshape(BCI,[-1]) 
# generating random numbers with length of BCI and shuffling it 
rn = tf.random_shuffle(tf.range(tf.shape(BCI1[0])) 
rna = tf.cast(rn,tf.int32) 
# rearranging data 
BCI2 = tf.gather(BCI1,rna) 

print(sess.run(BCI1)) 
print(sess.run(rn)) 
print(sess.run(BCI2)) 
# output is 
[1 1 1 2 2 2 3 3 3] 
[3 5 0 2 6 1 4 8 7] 
[2 2 1 3 1 2 1 3 3] # expected to be [2 2 1 1 3 1 2 3 3] 

sess.runを変更するたびにrn値を定数としてコピーできません。 しかし、私は 'rn'で生成された乱数値を最初に生成する必要があります。別のものでテストする必要があります。 rnを何回印刷すると、同じ値が出力され、出力が再生成されます。 どうすればいいですか?

は私がランダム

n = tf.shape(BCI1) 
rna = random.sample(list(range(n[0].eval())),9) 

をインポートしてみましたが、それはValueError: Cannot evaluate tensor using eval(): No default session is registered. Use with sess.as_default() or pass an explicit session to eval(session=sess) `

+0

'のSES = tf.InteractiveSessionを(追加)'あなたの最初の 'sess.run'前に –

答えて

1

tf.random_shuffle() OPを与える(と一般的に他のtf.random_*() OPS)はsess.run()を呼び出すたびに新しいランダムな値を生成します。ランダムテンソルの特定の値を取得し、sess.run()への複数の呼び出しで使用する場合は、tf.Variableに割り当てる必要があります。たとえば、次のような問題を解決するために、あなたのプログラムを再構築できます。

# generating an array of number 
BCI = tf.constant([1, 1, 1, 2, 2, 2, 3, 3, 3]) 

# generating random numbers with length of BCI and shuffling it 
rn = tf.Variable(tf.random_shuffle(tf.range(9))) 

rna = tf.cast(rn,tf.int32) 

# rearranging data 
BCI2 = tf.gather(BCI1, rna) 

sess.run(tf.global_variables_initializer()) 
print(sess.run(BCI1)) # ==> '[1 1 1 2 2 2 3 3 3]' 
print(sess.run(rn)) # ==> '[2 8 3 0 1 4 6 5 7]' 
print(sess.run(BCI2)) # ==> '[1 3 2 1 1 2 3 2 3]' 
print(sess.run(BCI2)) # ==> '[1 3 2 1 1 2 3 2 3]' 
関連する問題