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

在R中训练Keras模型时固定初始权重实现结果可复现的方法咨询

可复现Keras训练结果的实现方案

1. 固定所有关联随机源

你之前仅设置了R的全局随机种子,没有覆盖TensorFlow、numpy等后端依赖的随机状态,需要在脚本最开头、加载完依赖包后就添加以下配置:

# 固定R随机种子
set.seed(42)
# 固定TensorFlow随机种子
tensorflow::set_random_seed(42)
# 固定numpy随机种子(适配reticulate调用的Python依赖)
reticulate::py_run_string("import numpy as np; np.random.seed(42)")

2. 关闭运算非确定性

GPU或CPU多线程运算默认会使用非确定性算法提速,微小的运算误差积累后会导致损失值波动,最终触发早停的时机不一致,添加以下配置可强制使用确定性运算:

# 限制CPU运算线程数,关闭多线程带来的非确定性
tensorflow::tf$config$threading$set_inter_op_parallelism_threads(1)
tensorflow::tf$config$threading$set_intra_op_parallelism_threads(1)
# 强制开启所有运算的确定性实现(GPU训练时必须添加)
tensorflow::tf$config$experimental$enable_op_determinism()

3. 优化早停触发逻辑

你当前设置的min_delta = 0.00003阈值过小,微小的数值波动就会影响早停判断,可选择两种优化方案:

  • 适当调大min_delta到0.0001,过滤无意义的数值波动
  • 取消早停,固定训练轮次为3500 epoch,配合restore_best_weights参数直接获取整个训练过程的最优权重,完全规避早停触发时机的差异

4. 直接固定权重的最简方案

如果仅需要报告可用的固定结果,无需每次重新训练,可直接保存一次满意的训练权重,后续使用时直接加载即可100%复现结果:

# 保存权重
save_model_weights_hdf5(model, "report_fixed_weights.h5")

# 加载权重(需先初始化和训练时结构完全一致的模型)
model <- keras_model_sequential() %>% 
  layer_dense(units = 12, activation = "relu", input_shape = c(SHAPE)) %>%
  layer_dense(units = 24, activation = "relu") %>%
  layer_dense(units = 1, activation = "linear")
load_model_weights_hdf5(model, "report_fixed_weights.h5")

调整后可复现的完整训练代码
library(keras)
library(tensorflow)

# 开头统一固定所有随机源和确定性配置
set.seed(42)
tensorflow::set_random_seed(42)
reticulate::py_run_string("import numpy as np; np.random.seed(42)")
tensorflow::tf$config$threading$set_inter_op_parallelism_threads(1)
tensorflow::tf$config$threading$set_intra_op_parallelism_threads(1)
tensorflow::tf$config$experimental$enable_op_determinism()

BATCH <- nrow(x_train)
SHAPE <- ncol(x_train)

# 创建神经网络模型
model <- keras_model_sequential()
model %>% 
    layer_dense(units = 12, activation = "relu", input_shape = c(SHAPE)) %>%
    layer_dense(units = 24, activation = "relu") %>%
    layer_dense(units = 1, activation = "linear")

# 打印模型结构
print(summary(model))

# 初始化早停回调和优化器
early_stoping <- callback_early_stopping(
    monitor = "val_loss",
    min_delta = 0.0001, # 可根据需求调整,或取消早停固定训练轮次
    patience = 50,
    restore_best_weights = TRUE
)
optim <- optimizer_adam(learning_rate = 0.00005)

model %>% compile(
    optimizer = optim,
    loss = "mse",
    metrics = c("mse", "mae")
)

# 训练模型
val_data <- list(x_val = x_val, y_val = y_val)
hist <- model %>% fit(
    x = x_train,
    y = y_train,
    batch_size = BATCH,
    epochs = 6000,
    validation_data = val_data,
    shuffle = FALSE,
    callbacks = early_stoping
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:36:04