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

已设置np.random.seed()与tf.random.set_seed(),为何神经网络结果仍不一致?

解决Keras神经网络固定随机种子后结果仍不一致的问题

要实现每次运行代码得到完全一致的结果,需要覆盖更多可能引入随机性的环节,以下是具体修正步骤:

1. 补充全链路随机种子设置

除了NumPy和TensorFlow的种子,还要设置Python原生random模块的种子,避免其他依赖该模块的操作引入随机性:

import random
random.seed(0)

2. 固定验证集划分

不要依赖fit方法中的validation_split参数(其内部随机划分可能受环境或执行顺序影响),改用手动划分并固定随机状态:

from sklearn.model_selection import train_test_split
# 划分时设置random_state=0,stratify保证类别分布一致
Train_X_train, Train_X_val, Train_Y_train, Train_Y_val = train_test_split(
    Train_X2_Tfidf, Train_Y2, test_size=0.2, random_state=0, stratify=Train_Y2
)
# 训练时使用划分好的验证集
history1 = model1.fit(Train_X_train, Train_Y_train, epochs=200, verbose=1,
                      validation_data=(Train_X_val, Train_Y_val), batch_size=32, 
                      callbacks=[es])

3. 为Adam优化器设置种子

TensorFlow 2.4及以上版本的Adam优化器支持seed参数,用于固定优化过程中的随机性:

opt = tf.keras.optimizers.Adam(learning_rate=0.01, seed=0)

4. 启用TensorFlow确定性操作

如果使用GPU训练,需要设置环境变量强制TensorFlow使用确定性的底层操作,避免CUDA/CuDNN引入的非确定性:

import os
os.environ['TF_DETERMINISTIC_OPS'] = '1'
os.environ['TF_CUDNN_DETERMINISTIC'] = '1'

完整修正后的代码

import os
# 先设置环境变量,再导入TensorFlow
os.environ['TF_DETERMINISTIC_OPS'] = '1'
os.environ['TF_CUDNN_DETERMINISTIC'] = '1'

import random
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping

# 设置所有随机种子
random.seed(0)
np.random.seed(0)
tf.random.set_seed(0)

# 手动划分固定的训练/验证集
Train_X_train, Train_X_val, Train_Y_train, Train_Y_val = train_test_split(
    Train_X2_Tfidf, Train_Y2, test_size=0.2, random_state=0, stratify=Train_Y2
)

# 构建模型
model1 = Sequential()
model1.add(Dense(100, input_dim=Train_X_train.shape[1], activation='sigmoid'))
model1.add(Dense(1, activation='sigmoid'))

# 带种子的Adam优化器
opt = Adam(learning_rate=0.01, seed=0)
model1.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
model1.summary()

es = EarlyStopping(monitor="val_loss", mode='min', patience=10)
history1 = model1.fit(Train_X_train, Train_Y_train, epochs=200, verbose=1,
                      validation_data=(Train_X_val, Train_Y_val), batch_size=32, 
                      callbacks=[es])

内容的提问来源于stack exchange,提问作者andryan86

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:25:01