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

如何在Jupyter Notebook中复现深度学习模型的相同损失结果?

问题:TensorFlow模型每次运行损失结果不一致,即使设置了随机种子

我正在学习深度学习教程,使用如下简单数据集:

# Create feature
X = np.array([-7.0, -4.0, -1.0, 2.0, 5.0, 8.0, 11.0, 14.0])

# Create labels
y = np.array([3.0, 6.0, 9.0, 12.0, 15.0, 18.0, 21.0, 24.0])

X = tf.cast(tf.constant(X), dtype=tf.float32)
y = tf.cast(tf.constant(y), dtype=tf.float32)
X,y

输出结果:

(<tf.Tensor: shape=(8,), dtype=float32, numpy=array([-7., -4., -1.,  2.,  5.,  8., 11., 14.], dtype=float32)>,
 <tf.Tensor: shape=(8,), dtype=float32, numpy=array([ 3.,  6.,  9., 12., 15., 18., 21., 24.], dtype=float32)>)

基于此,我在Jupyter Notebook中构建了一个简单的深度学习回归模型,但每次重新运行时,得到的损失值都不同:

# Set random seed
tf.random.set_seed(42)

#1. Create a model using the sequantial API
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1)
])

# 2. Compile the model
model.compile(loss=tf.keras.losses.mae, # mae is short for mean absolute error
              optimizer=tf.keras.optimizers.SGD(), # sgd is short for stochastic gradient descent
              metrics=['mae'])

# 3. Fit the model
model.fit(tf.expand_dims(X, axis=-1),y, epochs=5)

某次运行结果:

Epoch 1/5
1/1 [==============================] - 0s 272ms/step - loss: 21.7067 - mae: 21.7067
Epoch 2/5
1/1 [==============================] - 0s 6ms/step - loss: 21.3136 - mae: 21.3136
Epoch 3/5
1/1 [==============================] - 0s 3ms/step - loss: 20.9205 - mae: 20.9205
Epoch 4/5
1/1 [==============================] - 0s 6ms/step - loss: 20.5380 - mae: 20.5380
Epoch 5/5
1/1 [==============================] - 0s 8ms/step - loss: 20.2568 - mae: 20.2568

再次运行时得到了不同的损失结果,尽管我已设置随机种子以期望得到相同结果:

Epoch 1/5
1/1 [==============================] - 0s 291ms/step - loss: 11.0655 - mae: 11.0655
Epoch 2/5
1/1 [==============================] - 0s 4ms/step - loss: 10.9330 - mae: 10.9330
Epoch 3/5
1/1 [==============================] - 0s 5ms/step - loss: 10.8005 - mae: 10.8005
Epoch 4/5
1/1 [==============================] - 0s 4ms/step - loss: 10.6680 - mae: 10.6680
Epoch 5/5
1/1 [==============================] - 0s 7ms/step - loss: 10.5355 - mae: 10.5355

请问如何在Jupyter Notebook中重新运行模型时得到相同的损失结果?


解决方法

只设置tf.random.set_seed(42)不足以保证完全可复现性,因为Keras层的权重初始化还依赖Python和NumPy的随机种子,且Jupyter环境中变量可能未完全重置导致模型复用旧状态。要实现一致的运行结果,需完成以下步骤:

  1. 设置全链路随机种子
    在创建模型前,同时设置Python、NumPy和TensorFlow的随机种子,覆盖所有可能引入随机性的环节:

    import random
    import numpy as np
    import tensorflow as tf
    
    random.seed(42)
    np.random.seed(42)
    tf.random.set_seed(42)
    
  2. 确保模型每次都重新初始化
    Jupyter中重复运行单元格时,model变量可能已存在,导致未重新创建模型。可以在定义模型前显式清理旧变量:

    if 'model' in locals():
        del model
    
  3. GPU环境下启用确定性操作
    若使用GPU训练,TensorFlow的GPU操作可能引入额外随机性,可通过以下代码禁用:

    tf.config.experimental.enable_op_determinism()
    

完整可复现代码

import random
import numpy as np
import tensorflow as tf

# 设置所有随机种子
random.seed(42)
np.random.seed(42)
tf.random.set_seed(42)
# GPU环境下启用确定性操作
tf.config.experimental.enable_op_determinism()

# 定义数据集
X = np.array([-7.0, -4.0, -1.0, 2.0, 5.0, 8.0, 11.0, 14.0])
y = np.array([3.0, 6.0, 9.0, 12.0, 15.0, 18.0, 21.0, 24.0])
X = tf.cast(tf.constant(X), dtype=tf.float32)
y = tf.cast(tf.constant(y), dtype=tf.float32)

# 清理旧模型变量
if 'model' in locals():
    del model

# 创建并训练模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1)
])

model.compile(loss=tf.keras.losses.mae,
              optimizer=tf.keras.optimizers.SGD(),
              metrics=['mae'])

model.fit(tf.expand_dims(X, axis=-1), y, epochs=5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:35:18