【问题标题】:tf.random.Normal() not generating different valuetf.random.Normal() 不产生不同的值
【发布时间】:2021-08-13 21:40:14
【问题描述】:

我正在尝试使用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 对多次,我如何确保获得随机结果?

【问题讨论】:

    标签: python tensorflow random normal-distribution


    【解决方案1】:

    我建议检查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)
    
    
    

    从均值和标准差定义的每个随机分布中返回两个样本:

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

    【讨论】:

      【解决方案2】:

      这对我有用:

      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)
      

      【讨论】:

      • 哦!我不知道它会以这种方式工作。感谢您的回答。但是,如果我想要每对均值和标准差有多个样本怎么办?因为如果我只使用一个均值和 stddev 的 [4],那么它会为我提供 4 个该分布的样本。
      • 假设你想要10个样本,那么你可以这样做tf.random.normal([10, 4],mean,stddev, tf.float32).numpy()
      【解决方案3】:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-27
        • 2022-01-23
        • 2012-08-15
        • 2019-06-16
        • 1970-01-01
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        相关资源
        最近更新 更多