tf.random.Normal() 未生成不同的值

tf.random.Normal() not generating different value

我正在尝试使用 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([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)

我建议检查 this。不要使用 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)


每个随机分布中的 returns 两个样本根据均值和标准差定义:

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

根据 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)