tensorflow-gpu/keras的结果可重复

经过测试,tensorflow-gpu即使在设置各种随机种子,训练数据完全相同的情况下,随着epoch的增加,结果差别会越来越大。所以最好的方法就是放弃tf,使用pytorch!

亲测pytorch在同一台机器上可以实现结果完全复现。附上pytorch的代码

import numpy as np
import torch
seed=args.seed
torch.manual_seed(seed)            # 为CPU设置随机种子
torch.cuda.manual_seed(seed)       # 为当前GPU设置随机种子
torch.cuda.manual_seed_all(seed)   # 为所有GPU设置随机种子
from torch.backends import cudnn
cudnn.benchmark = False             # if benchmark=True, deterministic will be False
cudnn.deterministic = True
import random
random.seed(seed)
np.random.seed(seed)

——————————————————————————————————————
下面的方法只能相对控制结果,比如在30epoch的时候,得到两个模型精度分别是96.55555和96.55666,但是反应在测试数据集上的精度差别会很大
——————————————————————————————————————

使tensorflow-gpu/keras的结果可重复/复现:

因为最近的研究要对模型做对比,需要得到可重复的实验结果,参考网上众多的讲解还是不能复现

只用CPU时:
# -*- coding: utf-8 -*-
##### 设置随机种子,使每次训练可重复
# Seed value
# Apparently you may use different seed values at each stage
seed_value= 0
# 1. Set the `PYTHONHASHSEED` environment variable at a fixed value
import os
os.environ['PYTHONHASHSEED']=str(seed_value)
# 2. Set the `python` built-in pseudo-random generator at a fixed value
import random
random.seed(seed_value)
# 3. Set the `numpy` pseudo-random generator at a fixed value
import numpy as np
np.random.seed(seed_value)
# 4. Set the `tensorflow` pseudo-random generator at a fixed value
import tensorflow as tf
tf.set_random_seed(seed_value)
# 5. Configure a new global `tensorflow` session
from keras import backend as K
session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)

因为我是用gpu跑的,设置完后每次跑完还是无法得到相同的结果。

使用GPU时:

这个包提供了GPU的可重复性实验帮助,包的地址
https://pypi.org/project/tensorflow-determinism/
确定性TensorFlow解决方案
对于大多数深度学习应用程序而言,当前有两种主要方法可以访问TensorFlow中的GPU确定性功能。第一种方法是使用NVIDIA NGC TensorFlow容器。第二种方法是使用带有GPU支持的TensorFlow的版本1.14、1.15或2.0,以及此存储库中提供的补丁的应用。

pip install tensorflow-determinism

一定要看这个详细的说明:https://github.com/NVIDIA/framework-determinism

主要影响可重复性的因素(但不仅仅包括):
卷积、
最大池化、
交叉熵损失函数、
tf.image.resize、
UpSampling2D、
depthwise_conv_op_gpu、

下面的可以不看,尝试性的方案,但是没有成功

方案1:
从tf1.13.0换到1.14尝试失败,然后又换的tf2.3.0。。。
用tf-gpu2.3.0,设置一堆随机种子,设置卷积权重初始化方式为固定值, tensorflow.keras.initializers.Constant(value=gen_random())
然后自定义一个随机数生成函数,我是这样写的

# -*- coding: utf-8 -*-
##### 设置随机种子,使每次训练可重复
seed_value= 10
# 1. Set the `PYTHONHASHSEED` environment variable at a fixed value
import os
os.environ['PYTHONHASHSEED']=str(seed_value)
os.environ['TF_DETERMINISTIC_OPS'] = '1'
os.environ['TF_CUDNN_DETERMINISTIC'] = '1'
os.environ['HOROVOD_FUSION_THRESHOLD']='0'
import random
random.seed(seed_value)
import numpy as np
np.random.seed(seed_value)
import tensorflow as tf
from tfdeterminism import patch
patch()
tf.compat.v1.set_random_seed(seed_value)
from keras import backend as K
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)
K.set_session(sess)

# 自定义的随机数生成函数
def gen_random():
    aaa = random.uniform(-1,1)
    return aaa
conv1 = Conv2D(32, (3, 3), activation="relu", padding="same",kernel_initializer=Constant(value=gen_random()))(x)

方案2:

这是之前的尝试,tf1.14应该也是可以的

pip install tensorflow-gpu==1.14
pip install keras==2.2.5
## 测试是否安装成功
python
import tensorflow as tf
import keras
tf.__version__
keras.__version__

tensorflow-gpu/keras的结果可重复_第1张图片

最后

附上tensorflow-gpu、keras、cudatoolkit、cudnn对应的版本
tensorflow-gpu/keras的结果可重复_第2张图片
tensorflow-gpu/keras的结果可重复_第3张图片

你可能感兴趣的:(深度学习,tensorflow,深度学习,人工智能,神经网络,gpu)