已设置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
相关产品推荐
相关产品推荐

