打印出由tensorflow自动选择的随机种子

问题描述 投票:1回答:1

我正在研究神经网络的超参数优化。我正在运行20个时代的模型。找出最好的超参数后,我再次单独运行相同的模型(现在没有超参数优化)但我得到了不同的结果。不仅如此,我发现在执行超参数优化时达到的值(准确度)发生在最后一个时期(第20个)。另一方面,当我再次运行相同的模型时,我发现实现的准确度直到200个时期才开始。然而,价值略低。下图是这个数字:

enter image description here

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

非常感谢您的帮助!!

tensorflow random
1个回答
2
投票

This question非常相似,但它没有答案,请参阅评论主题。通常,您不能在任何给定时间“提取种子”,因为RNG开始工作后没有种子。

如果您只想查看初始种子,则需要了解有图层级和操作级别种子(请参阅tf.set_random_seed以及random_seed.py中的实现):

  • 如果两者都设置则两者组合以产生实际种子。
  • 如果设置了图表种子但是op种子不是,则从图表种子和“op id”确定性地确定种子。
  • 如果设置了op种子但图形种子不是,则使用默认的图种子
  • 如果没有设置它们,则产生随机种子。要查看它来自何处,请查看GuardedPhiloxRandom,它提供了PhiloxRandom最终使用的两个数字。在没有提供种子的情况下,选择/dev/urandom生成的两个随机值,如random.cc所示

顺便说一句,你可以在设置时看到这些。您只需要访问您感兴趣的特定随机操作,并阅读其属性seedseed2。请注意,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生成的随机值。这两个随机数被传递给PhiloxRandom,它使用它们来初始化它的内部key_counter_变量,无论如何都无法读出。

© www.soinside.com 2019 - 2024. All rights reserved.