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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:32:50