Keras TensorFlow模型设置随机种子且用CPU训练仍无法复现结果
TensorFlow 2.5 Keras模型训练结果不可复现排查方案
1. 随机种子设置顺序与生效问题
原因:你在代码运行过程中才设置PYTHONHASHSEED环境变量,这个变量必须在Python解释器启动前配置才能生效;同时TensorFlow 2.x默认使用Eager执行模式,你写的TF1.x Session相关配置不会生效,且当前设置的不同框架种子不统一(numpy、random用sd=1,tf用seed=0),也会引入随机性。
解决方法:- 运行脚本前先配置环境变量:Linux/Mac执行
export PYTHONHASHSEED=1,Windows执行set PYTHONHASHSEED=1,再启动Python运行代码 - 删除原有TF1.x Session相关代码,统一所有框架的随机种子,新增TF2.x确定性配置:
sd = 1 np.random.seed(sd) random.seed(sd) tf.random.set_seed(sd) tf.keras.utils.set_random_seed(sd) # 开启算子确定性 tf.config.experimental.enable_op_determinism() # 固定线程数 tf.config.threading.set_intra_op_parallelism_threads(1) tf.config.threading.set_inter_op_parallelism_threads(1)- 运行脚本前先配置环境变量:Linux/Mac执行
2. 代码逻辑错误引入的随机性
原因:你的代码存在两处明显错误:定义的模型变量是model_cnn,但调用summary()和fit()方法时用的是未定义的model变量;同时callbacks中传入的tensorboard没有提前实例化,两次运行的实际执行逻辑不一致,自然无法复现结果。
解决方法:- 把
model.summary()修改为model_cnn.summary(),训练代码修改为model_cnn.fit(...) - 提前实例化TensorBoard回调,固定日志存储路径:
tensorboard = TensorBoard(log_dir='./logs/fixed_path')- 把
3. 数据预处理引入的随机性
原因:你使用的tf.keras.preprocessing.text.one_hot函数底层基于哈希实现,即使设置了全局种子,部分版本下仍可能出现编码结果不一致的问题。
解决方法:
抛弃one_hot函数,自行构建固定的核苷酸到整数的映射表,所有序列编码都用该映射表完成,完全避免哈希随机性:# 示例:构建固定映射 all_nuc = sorted(list(get_categ(train_data[0]).union(get_categ(train_data[1])))) nuc_map = {n:i+1 for i,n in enumerate(all_nuc)} # 0留作padding # 编码时直接查表 embedded_seq_tr_0 = [[nuc_map[c] for c in seq] for seq in train_data_0]4. 模型层初始化未固定种子
原因:你只给Dropout层设置了随机种子,Embedding、Conv1D、Dense等层的权重初始化默认是随机的,没有固定种子的话每次初始化权重都不同。
解决方法:
给所有带随机初始化的层添加固定seed的初始化器,示例:model_cnn.add(layers.Embedding(nuc_len, 20, input_length=train_01.shape[1], embeddings_initializer=keras.initializers.GlorotUniform(seed=sd))) model_cnn.add(layers.Conv1D(64, 5, activation='relu', padding='same', kernel_initializer=keras.initializers.HeNormal(seed=sd))) # 其余Conv1D、Dense层都按上述方式添加固定seed的初始化器5. 优化器非确定性问题
原因:Adam优化器内部的自适应学习率、动量计算在部分TensorFlow版本下存在非确定性实现,即使固定了所有种子也可能出现微小差异。
解决方法:
可以尝试将优化器替换为SGD,或者给Adam优化器设置固定的epsilon参数:opt_cnn = tf.keras.optimizers.Adam(learning_rate=1e-3, epsilon=1e-7)
内容的提问来源于stack exchange,提问作者mark Lan
相关产品推荐
相关产品推荐

