代码之家  ›  专栏  ›  技术社区  ›  I. A Ziang Yan

用tensorflow自动打印出随机种子

  •  1
  • I. A Ziang Yan  · 技术社区  · 7 年前

    我在研究神经网络的超参数优化。我把这个模型运行了20个时代。在找出最佳超参数后,我再次单独运行同一个模型(现在没有超参数优化),但得到了不同的结果。不仅如此,我还发现在执行超参数优化时达到的值(精度)发生在上一个历元(20)。另一方面,当我再次运行同一个模型时,我发现精度要到200个时代才能达到。然而,这些价值却略低。下图为:

    enter image description here

    因此,我想知道张量流在那一刻选择的随机种子是什么。因此,我对将随机种子设置为某个常量不感兴趣,但我想看看tensorflow选择了什么。

    1 回复  |  直到 7 年前
        1
  •  2
  •   javidcf    7 年前

    This question 很相似,但没有答案,请看评论帖。一般来说,您不能在任何给定的时间“提取种子”,因为一旦RNG开始工作,就没有种子了。

    tf.set_random_seed random_seed.py ):

    • 如果设置了图种子但没有设置op种子,则根据图种子和“op id”确定种子。
    • 如果设置了op种子,但未设置图形种子,则使用默认图形种子
    • 如果没有设置任何种子,则生成一个随机种子。看看这是从哪里来的 GuardedPhiloxRandom 它提供了 PhiloxRandom /dev/urandom random.cc

    顺便说一下,当它们被设置好的时候,你可以看到它们。您只需要访问您感兴趣的特定随机操作并读取其属性 seed seed2 . 请注意,TensorFlow公共函数会返回一些操作(缩放、置换)的结果,因此您必须“向上爬”一点图形才能得到有趣的结果:

    import tensorflow as tf
    
    def print_seeds(random_normal):
        # Get to the random TensorFlow op (RandomStandardNormal) and print seeds
        random_op = random_normal.op.inputs[0].op.inputs[0].op
        print(random_op.get_attr('seed'), random_op.get_attr('seed2'))
    
    print_seeds(tf.random_normal(()))
    # 0 0
    print_seeds(tf.random_normal((), seed=100))
    # 87654321 100
    tf.set_random_seed(200)
    print_seeds(tf.random_normal(()))
    # 200 15
    print_seeds(tf.random_normal((), seed=300))
    # 200 300
    

    不幸的是,当种子未指定时,无法检索由TensorFlow生成的随机值。这两个随机数被传递给 ,它使用它们初始化其内部 key_ counter_

    推荐文章