如何在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环境中变量可能未完全重置导致模型复用旧状态。要实现一致的运行结果,需完成以下步骤:
设置全链路随机种子
在创建模型前,同时设置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)确保模型每次都重新初始化
Jupyter中重复运行单元格时,model变量可能已存在,导致未重新创建模型。可以在定义模型前显式清理旧变量:if 'model' in locals(): del modelGPU环境下启用确定性操作
若使用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
相关产品推荐
相关产品推荐

