KerasRegressor固定输入训练集却每次输出不一致问题求助
解决Keras回归模型每次运行输出不同的问题
你的问题很典型——神经网络训练过程中的随机性导致了每次运行结果不一致。具体来说,这些随机性来自两个核心地方:神经网络权重的随机初始化和Adam优化器内部的随机状态。哪怕你的数据集是硬编码固定的,这些随机因素也会让模型训练的轨迹和最终输出产生差异。
下面是具体的解决步骤和修改后的代码:
核心解决方案:固定所有随机种子
我们需要为numpy、TensorFlow(Keras的默认后端)以及Keras本身设置全局随机种子,确保所有随机操作都可复现。
修改后的完整代码
from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasRegressor from sklearn.preprocessing import StandardScaler import numpy as np import tensorflow as tf from keras import backend as K # 固定所有随机种子 np.random.seed(42) # 锁定numpy的随机操作 tf.random.set_seed(42) # 锁定TensorFlow底层的随机运算 # 若使用Keras旧版本(如独立Keras或TF 1.x),可补充这行: # K.set_session(tf.Session(graph=tf.get_default_graph(), config=tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1))) X = np.array([[1,2], [3,4], [5,6], [7,8], [9,10]]) sc_X=StandardScaler() X_train = sc_X.fit_transform(X) Y = np.array([3, 4, 5, 6, 7]) Y=np.reshape(Y,(-1,1)) sc_Y=StandardScaler() Y_train = sc_Y.fit_transform(Y) N = 5 def brain(): #Create the brain br_model=Sequential() # 给每个Dense层的权重初始化指定种子,确保初始权重完全一致 br_model.add(Dense(3, input_dim=2, kernel_initializer=tf.keras.initializers.RandomNormal(seed=42), activation='relu')) br_model.add(Dense(2, kernel_initializer=tf.keras.initializers.RandomNormal(seed=42), activation='relu')) br_model.add(Dense(1, kernel_initializer=tf.keras.initializers.RandomNormal(seed=42))) #Compile the brain:给Adam优化器指定种子,锁定优化过程的随机状态 br_model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(seed=42)) return br_model # 给KerasRegressor添加random_state参数,进一步增强复现性 estimator = KerasRegressor(build_fn=brain, epochs=1000, batch_size=5, verbose=0, random_state=42) estimator.fit(X_train,Y_train) prediction = estimator.predict(X_train) print(Y) print(sc_Y.inverse_transform(prediction.reshape(-1,1)))
关键修改点说明
- 全局随机种子:设置
np.random.seed和tf.random.set_seed,确保numpy的随机操作(如后续有数据洗牌需求)和TensorFlow底层的随机运算都固定下来。 - 权重初始化种子:给每个
Dense层的kernel_initializer指定seed,保证每次模型初始化的权重完全一致,避免初始状态差异影响训练轨迹。 - 优化器种子:给Adam优化器指定
seed,确保优化过程中的随机梯度更新轨迹一致。 - KerasRegressor的random_state:这个参数会传递给模型构建的随机状态,进一步消除训练过程中的不确定性。
这样修改后,每次运行代码得到的预测结果就会完全相同了。
内容的提问来源于stack exchange,提问作者Thanatos
相关产品推荐
相关产品推荐

