无法使用tensorflow将随机生成的值复制到变量中

时间:2017-01-25 10:16:14

标签: python random tensorflow

我在一个数组中有数据说大小[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'时生成的随机值,因为我需要在另一个上进行测试。 我打印多少次它应该显示相同的值而不再重新生成。 怎么做 ?

我尝试导入随机

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) `

1 个答案:

答案 0 :(得分:1)

tf.random_shuffle()操作(通常是其他tf.random_*()操作)会在每次调用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]'