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