TensorFlow相同模型重训损失从首epoch停滞,准确率固定为随机猜测值
Colab光通信模型训练准确率异常问题排查与解决
问题现象
- 首次训练4分类模型:训练准确率最高接近99%,验证准确率达97%,runtime过期重连后重训,准确率从首个epoch就固定在25%,完全等于随机猜测水平
- 多次重启runtime后可偶尔恢复正常训练,但问题会反复出现
- 后续3分类任务中,同样出现准确率卡在33%(随机猜测水平)的问题:已训练好的99%准确率模型,加载到其他notebook测试时准确率降至33%
相关参考代码
模型定义与训练代码
model_fm = tf.keras.Sequential([ tf.keras.layers.Conv1D(256,kernel_size = 3, activation = 'relu', input_shape = x_train.shape[1:]), tf.keras.layers.Dropout(0.3), tf.keras.layers.Conv1D(128,kernel_size = 3, activation = 'relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Conv1D(64,kernel_size = 3, activation = 'relu'), tf.keras.layers.Flatten(), tf.keras.layers.Dense(256, activation = 'relu'), tf.keras.layers.Dense(128, activation = 'relu'), tf.keras.layers.Dense(128, activation = 'relu'), tf.keras.layers.Dense(64, activation = 'relu'), tf.keras.layers.Dense(4, activation = 'softmax') ]) model_fm.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy']) model_fm.fit(x_train, y_train, batch_size=256, verbose=1, epochs=60,validation_data=(x_val, y_val), callbacks = [earlystopping, reduce_lr])
正常训练日志示例
Epoch 1/60 612/612 [==============================] - 170s 275ms/step - loss: 0.9359 - accuracy: 0.5621 - val_loss: 0.7793 - val_accuracy: 0.6299 Epoch 2/60 612/612 [==============================] - 168s 274ms/step - loss: 0.5998 - accuracy: 0.7369 - val_loss: 0.4597 - val_accuracy: 0.8002
异常训练日志示例
Epoch 1/60 409/409 [==============================] - 112s 273ms/step - loss: 1.3865 - accuracy: 0.2493 - val_loss: 1.3862 - val_accuracy: 0.2594 Epoch 2/60 409/409 [==============================] - 111s 271ms/step - loss: 1.3863 - accuracy: 0.2501 - val_loss: 1.3864 - val_accuracy: 0.2435
根因分析
该问题属于训练环境/数据流程不一致导致的逻辑错误,和模型结构本身无关:
- TensorFlow版本差异:Colab不同实例预装的TensorFlow版本可能存在差异,不同版本的API行为(尤其是损失计算、卷积层初始化逻辑)存在微小区别,会导致训练完全失效
- 标签编码与损失函数不匹配:当前使用的
categorical_crossentropy要求标签为one-hot编码,如果某次加载数据时标签被处理为整数编码,损失计算逻辑就会完全失效,直接卡在随机猜测水平,这也符合3分类卡33%、4分类卡25%的现象 - 数据预处理逻辑不一致:如果数据归一化/标准化的参数没有固定,每次重连runtime后重新计算统计量,或者加载了错误的数据集,都会导致模型无法从输入数据中学习到有效特征
- 模型加载不完整:如果仅保存模型权重、在新notebook中手动定义结构加载,很容易出现结构定义细微偏差导致权重加载失效,预测准确率直接降到随机水平
解决步骤
- 固定依赖版本:每次启动runtime后第一时间安装指定版本的TensorFlow,避免版本差异:
!pip install tensorflow==2.15.0
安装完成后按提示重启runtime再运行后续代码
2. 校验标签与损失匹配:每次训练前输出标签样本校验格式,如果是整数标签,直接更换损失函数即可:
# 校验标签格式,输出前5个标签 print(y_train[:5]) # 如果是整数形式的标签,将损失替换为sparse_categorical_crossentropy model_fm.compile(loss='sparse_categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
- 固定数据预处理流程:将数据归一化的均值、方差等参数和数据集一同存储在Google Drive中,每次加载数据后使用固定参数做预处理,训练前打印前几个样本的输入、标签值,和正常训练时的样本做对比,确认数据加载正确
- 完整存储与加载模型:保存模型时存储完整结构+权重,不要仅存权重:
# 保存完整模型 model_fm.save('optical_comm_model.h5') # 加载模型 loaded_model = tf.keras.models.load_model('optical_comm_model.h5')
- 固定全局随机种子:在代码开头加入以下代码固定所有随机种子,避免不同实例的随机初始化带来的异常:
import random import numpy as np import tensorflow as tf SEED = 42 random.seed(SEED) np.random.seed(SEED) tf.random.set_seed(SEED)
内容的提问来源于stack exchange,提问作者Yuvi Dhelawat
相关产品推荐
相关产品推荐

