使用tf.random多次运行会话会返回conv2d的不同值

时间:2017-01-13 15:26:03

标签: random tensorflow convolution

import tensorflow as tf 
import numpy as np 

x_tf = tf.placeholder('float',[None, 2, 5, 1])
x_np = np.random.noraml(0,1,[1,2,5,1])

# ======== filter option1 and option2 ===========
f_np = np.random.normal(0,1,[1,3,1,1])
f_tf = tf.constant(f_np,'float') # option 1
f_tf = tf.random_normal([1,3,1,1]) # option 2
# ===============================================

x_conv = tf.nn.conv2d(x_tf,f_tf,[1,1,1,1],'SAME')

with tf.Session() as sess:
     tf.global_variables_initializer().run()
     x_conv_np  = sess.run(x_conv, feed_dict={x_tf: x_np})
     x_conv_np2 = sess.run(x_conv, feed_dict={x_tf: x_np})

如果我使用option1运行上面的代码,我会得到x_conv_npx_conv_np2的相同值 但是,当我使用option2运行上述内容时,我会为x_conv_npx_conv_np2获取不同的值。

我猜每次会话运行时都会初始化tf.random_normal。 这是否意味着发生? 即使我执行了tf.set_random_seed,也会发生这种情况 有人可以解释TensorFlow在会话运行时如何初始化其随机变量?

1 个答案:

答案 0 :(得分:3)

TensorFlow中的所有random number ops(包括tf.random_normal())每次运行时都会采样一​​个新的随机张量:

  

TensorFlow有几个ops可以创建具有不同分布的随机张量。随机操作是有状态的,每次评估时都会创建新的随机值。

如果您想对分发进行一次采样然后重新使用结果,则应使用tf.Variable并通过运行tf.random_normal()一次对其进行初始化。例如,以下代码将两次打印相同的随机值:

f_tf = tf.Variable(tf.random_normal([1, 3, 1, 1]))
# ...
init_op = tf.global_variables_initializer()
# ...
with tf.Session() as sess:
  sess.run(init_op)
  print(sess.run(f_tf))
  print(sess.run(f_tf))