训练前保存TensorFlow模型导致训练失效的原因咨询
训练前保存TensorFlow模型导致训练效果暴跌的原因
我发现训练前保存TensorFlow模型会导致训练效果极差。虽然知道解决办法是训练后再保存,但想搞懂这一现象的根本原因。
正常运行的代码及输出
以下代码训练MNIST数据集时表现正常:
import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.Sequential([ layers.Flatten(input_shape=(28,28)), layers.Dense(16, activation='relu'), layers.Dense(16, activation='relu'), layers.Dense(10) ]) loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) model.compile(optimizer='adam', loss=loss_fn, metrics=['accuracy']) ### model.save('my_model') ### model.fit(x_train, y_train, epochs=3, verbose=1)
训练输出:
Epoch 1/3 1875/1875 [==============================] - 3s 1ms/step - loss: 0.4513 - accuracy: 0.8688 Epoch 2/3 1875/1875 [==============================] - 2s 1ms/step - loss: 0.2326 - accuracy: 0.9333 Epoch 3/3 1875/1875 [==============================] - 2s 1ms/step - loss: 0.1974 - accuracy: 0.9432
取消注释后的异常情况
取消倒数第二行model.save('my_model')的注释后,训练效果严重恶化:
修改后的关键代码:
# ... 其余代码与上述一致 ... model.save('my_model') model.fit(x_train, y_train, epochs=3, verbose=1)
训练输出:
INFO:tensorflow:Assets written to: my_model\assets Epoch 1/3 1875/1875 [==============================] - 3s 1ms/step - loss: 0.4156 - accuracy: 0.0948 Epoch 2/3 1875/1875 [==============================] - 2s 1ms/step - loss: 0.2149 - accuracy: 0.1000 Epoch 3/3 1875/1875 [==============================] - 2s 1ms/step - loss: 0.1840 - accuracy: 0.0998
根本原因分析
这是因为Keras在保存模型时会触发模型计算图的构建流程,而部分TensorFlow/Keras版本存在bug:训练前保存会重置模型权重与优化器状态。
具体逻辑:
- 调用
model.compile后,模型完成了优化器、损失函数的配置,但权重仍为随机初始化状态,且未执行过任何前向/反向传播。 - 调用
model.save时,Keras会将模型序列化为SavedModel格式,这个过程中会强制构建模型的计算图,但此时会意外触发权重的重新随机初始化,同时优化器的内部状态(比如Adam的动量项、学习率调度参数)也会被重置。 - 后续
model.fit实际是在使用一套全新的、未与优化器正确绑定的随机权重训练,模型完全无法收敛,准确率接近随机猜测的10%(对应MNIST的10个类别)。
简单来说:训练前保存模型会打乱刚配置好的模型状态,相当于重新初始化了一遍,自然训不出正常效果。
内容的提问来源于stack exchange,提问作者Jonomyster
相关产品推荐
相关产品推荐

