Tensorflow:tf.random_normal 使用相同的初始种子得到不同的结果

标签 tensorflow random initializer

我想制作一个可重用的随机张量x并将相同的张量分配给变量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

最佳答案

真正的原因是: x = tf.random_normal(seed = initial_seed)每次应用sess.run()时都会演变,但会产生相同的张量系列x0-x1-x2 如果重新启动运行脚本。 Here提供一些关于随机种子的解释。

为了保证每次第一次运行后都有相同的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

关于Tensorflow:tf.random_normal 使用相同的初始种子得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53174610/

相关文章:

tensorflow - 根据 TENSORFLOW 中的 if 语句使用不同的优化器

python - 自动编码器适用于 MNIST,但对于较大尺寸的图像会崩溃

python - 不支持 TensorFlow 2.0 的 Keras。我们建议使用 `tf.keras` ,或者降级到 TensorFlow 1.14

swift - "Argument passed to call that takes no arguments"创建对象时

algorithm - 具有相同输出的伪随机生成器

c - C 编程中对数组中的字符进行打乱

ios - 初始化器不会覆盖其父类(super class)中的指定初始化器

python - Tensorflow 是否应该始终使用尽可能多的 Cuda 核心?

python - Tensorflow 数据集 API 评估输出形状需要 10 多分钟

c++ - 如果我们在不同的机器上将 c++11 mt19937 作为相同的种子,我们会得到相同的随机数序列吗