我试图使用tf.random.normal(mean, stddev)
,其中mean和stddev都像以下
mean = np.array([0.5, 0.9, 0.5, 0.8])
stddev = np.array([0.1, 0.08, 0.1, 0.15])
但是对于同一对,生成的值总是相同的
tf.random.normal([1],mean,stddev, tf.float32).numpy()
例如,
array([0.52523446, 0.92018753, 0.52523446, 0.83785176], dtype=float32)
每次运行输出都不同,但相同参数的生成值总是相同的。
我想避免得到0.52523446两次。我怎么能确保得到随机结果,即使有相同的平均值,stddev对多次?
我建议检查一下。而不是使用tf.random.normal
,设置一个RNG,然后使用它来获得可重复的结果和处理它的行为。你可以这样做:
TF_RNG1 = tf.random.Generator.from_seed(seed=1312) # Set the RNG for example in global scope.
def random_samples(num_samples): # Call this func whenever you want new samples from each distr.
mean_ar = np.array([0.5, 0.9, 0.5, 0.8])
stddev_ar = np.array([0.1, 0.08, 0.1, 0.15])
a = np.empty([0, num_samples])
for mean, stddev in zip(mean_ar, stddev_ar):
a = np.vstack([a, TF_RNG1.normal([num_samples], mean=mean, stddev=stddev).numpy()])
return a
example_1 = random_samples(num_samples=2)
example_2 = random_samples(num_samples=2)
从means和stddvs定义的每个随机分布返回两个样本:
[[0.64746159 0.28875741]
[1.07901216 0.96285772]
[0.68051326 0.48751786]
[1.10349631 0.70149976]]
[[0.52678907 0.34632182]
[1.1144588 0.97134733]
[0.5085696 0.70959347]
[0.78321898 0.57734704]]
这个适合我:
tf.random.normal([4],mean,stddev, tf.float32).numpy()
收益率:
tf.random.normal([4],mean,stddev, tf.float32).numpy()
Out[20]: array([0.48897663, 0.94428 , 0.4471385 , 0.8360004 ], dtype=float32)
tf.random.normal([4],mean,stddev, tf.float32).numpy()
Out[21]: array([0.7033355 , 0.93688935, 0.43403187, 0.5589987 ], dtype=float32)
从https://www.tensorflow.org/guide/random_numbers和我自己的经验来看,tf.random.normal
以及任何其他使用旧机制生成随机数的api都是错误的和不可靠的。tf.random.Generator
是产生随机数的新机制。它内部使用tf.Variable
来确保事情按预期工作。
您可以向量化从多个具有不同均值和方差的正态分布生成的随机数,如下所示:
@tf.function
def vectorized_rand_gen(rand_gen,means,stds,n):
return rand_gen.normal((n,)) * stds + means
rand_gen = tf.random.Generator.from_seed(8883)
means = tf.constant([5.0,10.0,5.0,1000.0])
stds = tf.constant([1.0,2.0 ,1.0,4.0])
print(vectorized_rand_gen(rand_gen,means,stds,4))
print(vectorized_rand_gen(rand_gen,means,stds,4))
print(vectorized_rand_gen(rand_gen,means,stds,4))
预期输出:
tf.Tensor([ 4.797662 11.434001 5.6649933 1000.5652 ], shape=(4,), dtype=float32)
tf.Tensor([ 4.5091076 9.176998 4.685211 1005.33514 ], shape=(4,), dtype=float32)
tf.Tensor([ 4.285514 8.202658 6.342854 1004.9558 ], shape=(4,), dtype=float32)