【问题标题】:Printing out the random seed automatically chosen by tensorflow打印出张量流自动选择的随机种子
【发布时间】:2018-09-14 13:57:17
【问题描述】:

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

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

非常感谢您的帮助!

【问题讨论】:

  • Related question。结果的变化不仅仅是由于选择了伪随机数生成种子。

标签: tensorflow random


【解决方案1】:

This question 非常相似,但没有答案,请参阅 cmets 线程。通常,您不能在任何给定时间“提取种子”,因为一旦 RNG 开始工作,就没有种子了。

如果你只是想看初始种子,你需要了解有图级和操作级种子(见tf.set_random_seed,以及random_seed.py中的实现):

  • 如果两者都设置了,则将两者结合起来生成实际的种子。
  • 如果设置了图形种子但未设置操作种子,则种子是根据图形种子和“操作 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_ 变量,无论如何都无法读出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多