如何用numpy重现tf.get_variable的默认行为?(TensorFlow v1.15.0)

eagi6jfj  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(97)

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]]
a14dhokn

a14dhokn1#

事实证明,底层的伪随机数生成器不同:虽然TensorFlow默认使用Philox,但numpy默认使用Mersenne-Twister。因此,在相同的随机种子下,它们会为均匀分布产生不同的值。

相关问题