我正在研究神经网络的超参数优化。我正在运行20个时代的模型。找出最好的超参数后,我再次单独运行相同的模型(现在没有超参数优化)但我得到了不同的结果。不仅如此,我发现在执行超参数优化时达到的值(准确度)发生在最后一个时期(第20个)。另一方面,当我再次运行相同的模型时,我发现实现的准确度直到200个时期才开始。然而,价值略低。下图是这个数字:
因此,我想知道当时tensorflow选择的随机种子是什么。因此,我对将随机种子设置为某个常量不感兴趣,但我想看看tensorflow选择了什么。
非常感谢您的帮助!!
This question非常相似,但它没有答案,请参阅评论主题。通常,您不能在任何给定时间“提取种子”,因为RNG开始工作后没有种子。
如果您只想查看初始种子,则需要了解有图层级和操作级别种子(请参阅tf.set_random_seed
以及random_seed.py
中的实现):
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生成的随机值。这两个随机数被传递给PhiloxRandom
,它使用它们来初始化它的内部key_
和counter_
变量,无论如何都无法读出。