【问题标题】:Which seeds have to be set where to realize 100% reproducibility of training results in tensorflow?哪些种子必须设置在哪里才能实现 tensorflow 中训练结果的 100% 可重复性?
【发布时间】:2017-06-20 17:57:33
【问题描述】:

在一般的张量流设置中,如

model = construct_model()
with tf.Session() as sess:
    train_model(sess)

construct_model() 包含模型定义,包括权重的随机初始化 (tf.truncated_normal),train_model(sess) 执行模型的训练 -

我必须设置哪些种子,以确保重复运行上述代码 sn-p 之间的 100% 可重复性? The documentation for tf.random.set_random_seed 可能很简洁,但让我有点困惑。我试过了:

tf.set_random_seed(1234)
model = construct_model()
    with tf.Session() as sess:
        train_model(sess)

但每次都得到不同的结果。

【问题讨论】:

  • 您还需要从计算中删除并行性,因为这通常是不确定的,关闭 GPU 并使用sess = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=1,intra_op_parallelism_threads=1)
  • 另外,一些不确定性是由使用 SSE 等现代指令集引起的(请参阅 here ),因此要获得 100% 的可重复性,您可能需要在不使用 SSE 的情况下重新编译 TF
  • 为了澄清起见,上述 cmets 中的 sess = tf.Session... 并没有关闭 GPU,正如 watch nvidia-smi 所观察到的那样(在 nvidia gpu 的情况下,如在 AWS EC2 p2.xlarge 实例上) )

标签: python tensorflow random-seed


【解决方案1】:

目前与 GPU 一起工作的最佳解决方案是安装 tensorflow-determinism,如下所示:

pip install tensorflow-determinism

然后在您的代码中包含以下代码

import tensorflow as tf
import os
os.environ['TF_DETERMINISTIC_OPS'] = '1'

来源:https://github.com/NVIDIA/tensorflow-determinism

【讨论】:

    【解决方案2】:

    一个可能的原因是在构建模型时,有一些代码使用了 numpy.random 模块。所以也许你也可以尝试为 numpy 设置种子。

    【讨论】:

    • 我不在模型中使用 np ,但是对于 truncated.normal 有额外的种子参数,我也不使用。我是否必须将这些种子另外设置为 tf.set_random_seed ?
    • 我无法获得可重现的模型,尽管我什至控制了 truncated_normal 和 droupout 的状态。 :-(
    • 通常我只是在源文件的开头为 numpy 和 tensorflow 设置随机种子,它对我来说效果很好。
    【解决方案3】:

    对我有用的是关注this answer 并进行了一些修改:

    import tensorflow as tf
    import numpy as np
    import random
    
    # Setting seed value
    # from https://stackoverflow.com/a/52897216
    # generated randomly by running `random.randint(0, 100)` once
    SEED = 75
    # 1. Set the `PYTHONHASHSEED` environment variable at a fixed value
    os.environ['PYTHONHASHSEED'] = str(SEED)
    # 2. Set the `python` built-in pseudo-random generator at a fixed value
    random.seed(SEED)
    # 3. Set the `numpy` pseudo-random generator at a fixed value
    np.random.seed(SEED)
    # 4. Set the `tensorflow` pseudo-random generator at a fixed value
    tf.random.set_seed(SEED)
    

    我不知道如何设置session seed(第 5 步),但似乎没有必要。

    我在高 RAM TPU 上运行 Google Colab Pro,我的训练结果(损失函数图)连续三次使用这种方法完全相同。

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      相关资源
      最近更新 更多