深度學習模型訓練中如何控制隨機性

訓練模型過程中哮内,會遇到很多的隨機性設置溶弟,設置隨機性并多次實驗的結果更加有說服力。但是現(xiàn)在發(fā)論文越來越要求模型的可復現(xiàn)性胖翰,這時候不得不控制代碼的隨機性問題臼节,小編最近也遇上這些問題撬陵,所以在這里總結一下如何控制模型的隨機性珊皿,但是我用的tensorflow的框架,適用于keras框架:

1.設置numpy, random, os的隨機性

全局中固定numpy, random, os的隨機性

import numpy as np
import random
np.random.seed(seed) # seed是一個固定的整數即可
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)

有時候也會經常用到shuffle打亂順序巨税,這時候也需要設置shuffle的隨機性

import random
random.Random(seed).shuffle(arr) 
# 試驗過其他shuffle的設置蟋定,均無法復現(xiàn),只有這種shuffle可以復現(xiàn)結果

2. 劃分訓練集和測試集時random_state的設置

在模型的訓練中草添,會劃分訓練集和測試集驶兜。無論是使用train_test_split還是KFold劃分,都需要設置random_state的具體數值

from sklearn.model_selection import train_test_split, StratifiedKFold
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2020)
cv = StratifiedKFold(n_splits=10, random_state=2020) # 10折

3.設置tensorflow的隨機性

import tensorflow as tf
tf.random.set_seed(seed) # tensorflow2.0版本的設置远寸,較早版本的設置方式不同抄淑,可以自查

4.設置深度學習中各層的隨機性

在我的深度學習框架中,會用到Conv2D和Dense層(tensorflow2.0中Keras的API)驰后。在官方的文檔中肆资,這兩個層的初始化也存在一定的隨機性。
Conv2D層的官網說明

# Conv2D層的初始化參數
__init__(
    filters,
    kernel_size,
    strides=(1, 1),
    padding='valid',
    data_format=None,
    dilation_rate=(1, 1),
    activation=None,
    use_bias=True,
    kernel_initializer='glorot_uniform',
    bias_initializer='zeros',
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    **kwargs
)

從上面的初始化參數中可以看見

kernel_initializer='glorot_uniform'

查閱glorot_uniform的相關資料后發(fā)現(xiàn)灶芝,該初始化是具有一定的隨機性的郑原,所以需要設置其隨機性種子

from tensorflow.keras.layers import Conv2D
from tensorflow.keras.initializers import glorot_normal
conv = Conv2D(kernel_initializer=glorot_normal(seed=seed))  
# 卷積層的其他參數自己設置,只需要注意kernel_initializer的參數設置即可

同樣的設置也存在于Dense層和Dropout層

from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.initializers import glorot_normal
dense = Dense(kernel_initializer=glorot_normal(seed=seed))
drop = Dropout(seed=seed)

5.深度學習訓練過程中的隨機性

model.fit(X_train, y_train, shuffle=False) # 注意shuffle=False

當然如果使用GPU訓練模型的話夜涕,因為cudnn中分配GPU多線程的隨機問題犯犁,所以你會發(fā)現(xiàn)相同模型和數據的結果還是不一樣,這是stackoverflow上的大神對該問題的解答女器。
How to handle non-determinism when training on a GPU?

6.GPU多線程訓練的隨機性

session_conf = tf.compat.v1.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
sess = tf.compat.v1.Session(graph=tf.compat.v1.get_default_graph(), config=session_conf)
tf.compat.v1.keras.backend.set_session(sess)

tensorflow是無法控制GPU多線程的隨機性的栖秕,但是pytorch是可以的

torch.manual_seed(SEED)
torch.cuda.manual_seed_all(SEED)
torch.backends.cudnn.deterministic=True

7.tensorflow-determinism項目

在github上發(fā)現(xiàn)了tensorflow-determinism的項目,這個項目的官方解釋為:

This repository serves three purposes:
1.Provide up-to-date information (in this file) about non-determinism sources and solutions in TensorFlow and beyond, with a focus on determinism when running on GPUs.
2.Provide a patch to attain various levels of GPU-specific determinism in stock TensorFlow, via the installation of the tensorflow-determinism pip package.
3.Be the location where a TensorFlow determinism debug tool will be released as part of the tensorflow-determinism pip package.

修復了GPU上no-determinism的問題晓避。有需要的可以自行pip安裝

pip install tensorflow-determinism

調用格式

from tfdeterminism import patch
patch()

這個東西很管用的簇捍,真的非常管用!G喂啊暑塑!

總結

以上就是我總計的深度學習模型訓練中涉及到的隨機性,希望對大家有所幫助锅必,如果有其他需要注意的內容事格,歡迎大家?guī)臀已a充!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末搞隐,一起剝皮案震驚了整個濱河市驹愚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劣纲,老刑警劉巖逢捺,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異癞季,居然都是意外死亡劫瞳,警方通過查閱死者的電腦和手機倘潜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來志于,“玉大人涮因,你說我怎么就攤上這事∷耪溃” “怎么了养泡?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奈应。 經常有香客問我瓤荔,道長,這世上最難降的妖魔是什么钥组? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任输硝,我火速辦了婚禮,結果婚禮上程梦,老公的妹妹穿的比我還像新娘点把。我一直安慰自己,他們只是感情好屿附,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布郎逃。 她就那樣靜靜地躺著,像睡著了一般挺份。 火紅的嫁衣襯著肌膚如雪褒翰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天匀泊,我揣著相機與錄音优训,去河邊找鬼。 笑死各聘,一個胖子當著我的面吹牛揣非,可吹牛的內容都是我干的。 我是一名探鬼主播躲因,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼早敬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了大脉?” 一聲冷哼從身側響起搞监,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镰矿,沒想到半個月后琐驴,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年棍矛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抛杨。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡够委,死狀恐怖,靈堂內的尸體忽然破棺而出怖现,到底是詐尸還是另有隱情茁帽,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布屈嗤,位于F島的核電站潘拨,受9級特大地震影響,放射性物質發(fā)生泄漏饶号。R本人自食惡果不足惜铁追,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茫船。 院中可真熱鬧琅束,春花似錦、人聲如沸算谈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽然眼。三九已至艾船,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間高每,已是汗流浹背屿岂。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鲸匿,地道東北人雁社。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像晒骇,于是被迫代替她去往敵國和親霉撵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容