os.environ[‘PYTHONHASHSEED‘] = ‘0‘ | 如何在 Keras 开发过程中获取可复现的结果?

来自:Keras中文文档

在模型的开发过程中,能够在一次次的运行中获得可复现的结果,以确定性能的变化是来自模型还是数据集的变化,或者仅仅是一些新的随机样本点带来的结果,有时候是很有用处的。

首先,你需要在程序启动之前将 PYTHONHASHSEED 环境变量设置为 0(不在程序本身内)。对于 Python 3.2.3 以上版本,它对于某些基于散列的操作具有可重现的行为是必要的(例如,集合和字典的 item 顺序,请参阅 Python 文档和 issue #2280 获取更多详细信息)。设置环境变量的一种方法是,在这样启动 python 时:

$ cat test_hash.py
print(hash("keras"))          
$ python3 test_hash.py                  # 无法复现的 hash (Python 3.2.3+)
-8127205062320133199
$ python3 test_hash.py                  # 无法复现的 hash (Python 3.2.3+)
3204480642156461591
$ PYTHONHASHSEED=0 python3 test_hash.py # 可复现的 hash
4883664951434749476
$ PYTHONHASHSEED=0 python3 test_hash.py # 可复现的 hash
4883664951434749476

hash: https://www.zhihu.com/question/26762707

此外,当使用 TensorFlow 后端并在 GPU 上运行时,某些操作具有非确定性输出,特别是 tf.reduce_sum()。这是因为 GPU 并行运行许多操作,因此并不总能保证执行顺序。由于浮点数的精度有限,即使添加几个数字,也可能会产生略有不同的结果,具体取决于添加它们的顺序。你可以尝试避免某些非确定性操作,但有些操作可能是由 TensorFlow 在计算梯度时自动创建的,因此在 CPU 上运行代码要简单得多。为此,你可以将 CUDA_VISIBLE_DEVICES 环境变量设置为空字符串,例如:

$ CUDA_VISIBLE_DEVICES="" PYTHONHASHSEED=0 python your_program.py

下面的代码片段提供了一个如何获得可复现结果的例子 - 针对 Python 3 环境的 TensorFlow 后端。

import numpy as np
import tensorflow as tf
import random as rn

# 以下是 Numpy 在一个明确的初始状态生成固定随机数字所必需的。

np.random.seed(42)

# 以下是 Python 在一个明确的初始状态生成固定随机数字所必需的。

rn.seed(12345)

# 强制 TensorFlow 使用单线程。
# 多线程是结果不可复现的一个潜在因素。
# 更多详情,见: https://stackoverflow.com/questions/42022950/

session_conf = tf.ConfigProto(intra_op_parallelism_threads=1,
                              inter_op_parallelism_threads=1)

from keras import backend as K

# `tf.set_random_seed()` 将会以 TensorFlow 为后端,
# 在一个明确的初始状态下生成固定随机数字。
# 更多详情,见: https://www.tensorflow.org/api_docs/python/tf/set_random_seed

tf.set_random_seed(1234)

sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)

# 剩余代码 ...

 

你可能感兴趣的:(机器学习,深度学习)