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)

# 剩餘代碼 ...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章