所以最好的方法就是放弃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,但是反应在测试数据集上的精度差别会很大 ——————————————————————————————————————
因为最近的研究要对模型做对比,需要得到可重复的实验结果,参考网上众多的讲解还是不能复现
因为我是用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主要影响可重复性的因素(但不仅仅包括): 卷积、 最大池化、 交叉熵损失函数、 tf.image.resize、 UpSampling2D、 depthwise_conv_op_gpu、
从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)这是之前的尝试,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、cudatoolkit、cudnn对应的版本