You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras TensorFlow模型设置随机种子且用CPU训练仍无法复现结果

TensorFlow 2.5 Keras模型训练结果不可复现排查方案
  • 1. 随机种子设置顺序与生效问题

    原因:你在代码运行过程中才设置PYTHONHASHSEED环境变量,这个变量必须在Python解释器启动前配置才能生效;同时TensorFlow 2.x默认使用Eager执行模式,你写的TF1.x Session相关配置不会生效,且当前设置的不同框架种子不统一(numpy、random用sd=1,tf用seed=0),也会引入随机性。
    解决方法:
    1. 运行脚本前先配置环境变量:Linux/Mac执行export PYTHONHASHSEED=1,Windows执行set PYTHONHASHSEED=1,再启动Python运行代码
    2. 删除原有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)
    
  • 2. 代码逻辑错误引入的随机性

    原因:你的代码存在两处明显错误:定义的模型变量是model_cnn,但调用summary()和fit()方法时用的是未定义的model变量;同时callbacks中传入的tensorboard没有提前实例化,两次运行的实际执行逻辑不一致,自然无法复现结果。
    解决方法:
    1. 把model.summary()修改为model_cnn.summary(),训练代码修改为model_cnn.fit(...)
    2. 提前实例化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:09:02