【问题标题】:Tensorflow: tf.random_normal get different results with the same initial seedTensorflow:tf.random_normal 使用相同的初始种子获得不同的结果
【发布时间】:2019-04-10 00:08:39
【问题描述】:

我想创建一个可重用的RANDOM TENSOR x 并将相同的张量分配给VARIABLE y。这意味着它们在Session.run() 期间应该具有相同的值。

但事实并非如此。那么为什么y 不等于x

更新: 在一行中多次应用sess.run(x)sess.run(y)后,确认x每次都在变化,而y保持稳定。为什么?

import tensorflow as tf

x = tf.random_normal([3], seed = 1)
y = tf.Variable(initial_value = x) # expect y get the same random tensor as x

diff = tf.subtract(x, y)
avg = tf.reduce_mean(diff)

sess = tf.InteractiveSession()
sess.run(y.initializer)

print('x0:', sess.run(x))
print('y0:', sess.run(y))
print('x1:', sess.run(x))
print('y1:', sess.run(y))
print('x2:', sess.run(x))
print('y2:', sess.run(y))
print('diff:', sess.run(diff))
print('avg:', sess.run(avg)) # expected as 0.0

sess.close()

输出:TENSOR x 每次 sess.run(x) 都会发生变化

x0: [ 0.55171245 -0.13107552 -0.04481386]
y0: [-0.8113182   1.4845988   0.06532937]
x1: [-0.67590594  0.28665832  0.3215887 ]
y1: [-0.8113182   1.4845988   0.06532937]
x2: [1.2409041  0.44875884 0.33140722]
y2: [-0.8113182   1.4845988   0.06532937]
diff: [ 1.2404865  -1.4525002   0.05412297]
avg: -0.04116

【问题讨论】:

  • 请尝试sess.run(tf.global_variable_initilizer()) 而不是您的初始化。这有帮助吗?并且可能将张量的长度设置为 2,以便您可以直观地比较两者。
  • @Lau sess.run(tf.global_variable_initilizer()) 与 sess.run(y.initializer) 相同。并应用 sess.run(tf.equal(x, y)) 你将得到一个全为 False 的张量。试一试。
  • 好的,对不起。我现在测试了一些代码。 tf.random_normal 在每次通话时绘制正态分布。这是有意的,因为您希望有时会产生噪音。如果您的变量是静态的,请使用:tf.get_variable("test", shape=[3], initializer=tf.random_normal_initializer()).

标签: tensorflow random initializer


【解决方案1】:

真正的原因是: x = tf.random_normal(seed = initial_seed) 在每次应用 sess.run() 时都在发展,但如果 restart 运行脚本,则会产生相同的张量序列 x0-x1-x2Here 提供了关于随机种子的一些解释。

为了保证每次首次运行后x 相同,我们需要重新初始化它。不确定我的情况是否有合适的方法。但是我们可以将x 设置为变量并使用固定种子进行初始化。 tf.get_variabletf.Variable 都可以。我发现this answer 适合我的问题。

这是我的最终代码。它有效。

import tensorflow as tf

initializer = tf.random_normal_initializer(seed = 1)
x = tf.get_variable(name = 'x', shape = [3], dtype = tf.float32, initializer = initializer)
y = tf.Variable(initial_value = x)

diff = tf.subtract(x, y)
avg = tf.reduce_mean(diff)

sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())

print('x0:', sess.run(x))
print('y0:', sess.run(y))

print('x1:', sess.run(x))
print('y1:', sess.run(y))

print('x2:', sess.run(x))
print('y2:', sess.run(y))

print('diff:', sess.run(diff))
print('avg:', sess.run(avg))
sess.close()

x0: [-0.8113182   1.4845988   0.06532937]
y0: [-0.8113182   1.4845988   0.06532937]
x1: [-0.8113182   1.4845988   0.06532937]
y1: [-0.8113182   1.4845988   0.06532937]
x2: [-0.8113182   1.4845988   0.06532937]
y2: [-0.8113182   1.4845988   0.06532937]
diff: [0. 0. 0.]
avg: 0.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    相关资源
    最近更新 更多