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

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

根因分析

该问题属于训练环境/数据流程不一致导致的逻辑错误,和模型结构本身无关:

  1. TensorFlow版本差异:Colab不同实例预装的TensorFlow版本可能存在差异,不同版本的API行为(尤其是损失计算、卷积层初始化逻辑)存在微小区别,会导致训练完全失效
  2. 标签编码与损失函数不匹配:当前使用的categorical_crossentropy要求标签为one-hot编码,如果某次加载数据时标签被处理为整数编码,损失计算逻辑就会完全失效,直接卡在随机猜测水平,这也符合3分类卡33%、4分类卡25%的现象
  3. 数据预处理逻辑不一致:如果数据归一化/标准化的参数没有固定,每次重连runtime后重新计算统计量,或者加载了错误的数据集,都会导致模型无法从输入数据中学习到有效特征
  4. 模型加载不完整:如果仅保存模型权重、在新notebook中手动定义结构加载,很容易出现结构定义细微偏差导致权重加载失效,预测准确率直接降到随机水平

解决步骤

  1. 固定依赖版本:每次启动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'])
  1. 固定数据预处理流程:将数据归一化的均值、方差等参数和数据集一同存储在Google Drive中,每次加载数据后使用固定参数做预处理,训练前打印前几个样本的输入、标签值,和正常训练时的样本做对比,确认数据加载正确
  2. 完整存储与加载模型:保存模型时存储完整结构+权重,不要仅存权重:
# 保存完整模型
model_fm.save('optical_comm_model.h5')
# 加载模型
loaded_model = tf.keras.models.load_model('optical_comm_model.h5')
  1. 固定全局随机种子:在代码开头加入以下代码固定所有随机种子,避免不同实例的随机初始化带来的异常:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:24:06