tf.random.Normal()不产生不同的值



我试图使用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)

相关内容

  • 没有找到相关文章

最新更新