用tf.get_variable
初始化的变量(据我所知),默认情况下,从Glorot/Xavier分布中采样。
如何用numpy.random
重现该分布?
它可能归结为设置正确的随机种子-然而,我没有成功(请参阅下面的最小工作示例)。有人知道如何使下面示例中的模式的输出相同或理解它们为什么不同吗?
import tensorflow as tf
import numpy as np
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--mode', type=int)
args = parser.parse_args()
fan_in = 2
fan_out = 3
glorot_scale = 1. / max(1., (fan_in + fan_out) / 2.)
glorot_limit = limit = np.sqrt(3.0 * glorot_scale)
mode = args.mode
tf.set_random_seed(0)
if mode in [4,5]:
np.random.seed(0)
print(mode)
if mode == 0:
variable = tf.compat.v1.get_variable(name='variable', shape=[fan_in, fan_out])
elif mode == 1:
variable = tf.compat.v1.get_variable(name='variable', shape=[fan_in, fan_out],
initializer=tf.glorot_uniform_initializer(seed=0))
elif mode == 2:
variable = tf.Variable(tf.glorot_uniform_initializer(seed=0)(
shape=[fan_in, fan_out], dtype=tf.float32))
elif mode == 3:
variable = tf.random.stateless_uniform(
shape=(fan_in,fan_out), seed=[0, 0],
minval=-glorot_limit, maxval=glorot_limit)
elif mode == 4:
variable = tf.Variable(
np.random.uniform(-glorot_limit, glorot_limit, (fan_in, fan_out)),
dtype=tf.float32)
elif mode == 5:
variable = np.array(np.random.uniform(-glorot_limit, glorot_limit, (fan_in, fan_out)),
dtype=np.float32)
if mode in range(5):
sess = tf.compat.v1.Session()
sess.run(tf.compat.v1.global_variables_initializer())
variable = sess.run(variable)
print(variable)
输出如下:
0
[[-0.39295787 0.4208691 0.53050697]
[ 0.8091326 1.007618 0.95607924]]
1
[[-1.0521597 -1.0800165 -0.6794561 ]
[ 0.60745895 -0.17927146 0.5341264 ]]
2
[[-1.0521597 -1.0800165 -0.6794561 ]
[ 0.60745895 -0.17927146 0.5341264 ]]
3
[[-0.6331334 0.45134532 0.657406 ]
[ 0.59327614 -0.24409002 0.81141686]]
4
[[ 0.10694503 0.4714563 0.22514328]
[ 0.09833413 -0.16726395 0.31963798]]
5
[[ 0.10694503 0.4714563 0.22514328]
[ 0.09833413 -0.16726395 0.31963798]]
1条答案
按热度按时间a14dhokn1#
事实证明,底层的伪随机数生成器不同:虽然TensorFlow默认使用Philox,但numpy默认使用Mersenne-Twister。因此,在相同的随机种子下,它们会为均匀分布产生不同的值。