深度学习模型训练中如何控制随机性

训练模型过程中,会遇到很多的随机性设置,设置随机性并多次实验的结果更加有说服力。但是现在发论文越来越要求模型的可复现性,这时候不得不控制代码的随机性问题,小编最近也遇上这些问题,所以在这里总结一下如何控制模型的随机性,但是我用的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的设置,均无法复现,只有这种shuffle可以复现结果

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的相关资料后发现,该初始化是具有一定的随机性的,所以需要设置其随机性种子

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多线程的随机问题,所以你会发现相同模型和数据的结果还是不一样,这是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上发现了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()

这个东西很管用的,真的非常管用!!!

总结

以上就是我总计的深度学习模型训练中涉及到的随机性,希望对大家有所帮助,如果有其他需要注意的内容,欢迎大家帮我补充!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容