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

时间:2018-09-14 13:57:17

标签: tensorflow random

我正在研究神经网络的超参数优化。我将模型运行了20个时期。在找出最佳的超参数之后,我再次单独运行了相同的模型(现在没有超参数优化),但是得到了不同的结果。不仅如此,我还发现执行超参数优化时达到的值(准确性)发生在最后一个时期(第20个)。另一方面,当我再次运行相同的模型时,我发现达到的精度要到200个纪元。但是,这些值略少一些。如下图:

enter image description here

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

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

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

  • 如果同时设置了两者,则将两者合并以产生实际的种子。
  • 如果设置了图种子,但未设置op种子,则根据图种子和“ op id”确定种子。
  • 如果设置了操作种子,但未设置图种子,则使用默认的图种子
  • 如果未设置它们,则将生成随机种子。要了解其来源,您可以查看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_变量,无论如何都无法读出它们。

相关问题