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

AzureML GPU中Keras/TF CNN模型训练非确定性冻结问题求助

问题描述

我在AzureML的GPU计算实例上训练Keras/TF的CNN模型,模型架构如下:

def define_model_1D_v17():
   model = Sequential()
   model.add( Conv1D(256, (5,), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(22, 20)))
   model.add(Flatten())
   model.add(Dense(1024, activation='relu', kernel_initializer='he_uniform',))
   model.add(Dense(1, activation='sigmoid'))
   opt = Adam(learning_rate=0.0005)
   model.compile(optimizer=opt, loss='binary_crossentropy ', metrics=['accuracy'])
   return model

训练时遇到非确定性冻结问题:部分调用history = model.fit(train_gen, epochs=10, validation_data=test_gen, verbose=1)时,训练损失和准确率在批次与轮次间几乎恒定(仅轻微波动)。示例输出如下(第一次训练冻结,第二次正常):

fold 2 a45db86ea43b5a95a96ef7be349d9f2f
Epoch 1/10
1846/1846 [==============================] - 50s 27ms/step - loss: 0.4508 - accuracy: 0.5489 - val_loss: 0.5220 - val_accuracy: 0.47
Epoch 2/10
1846/1846 [==============================] - 49s 27ms/step - loss: 0.4508 - accuracy: 0.5492 - val_loss: 0.5220 - val_accuracy: 0.47
Epoch 3/10
1846/1846 [==============================] - 49s 27ms/step - loss: 0.4508 - accuracy: 0.5492 - val_loss: 0.5220 - val_accuracy: 0.47
Epoch 4/10
1846/1846 [==============================] - 49s 27ms/step - loss: 0.4508 - accuracy: 0.5492 - val_loss: 0.5220 - val_accuracy: 0.47
Epoch 5/10
1846/1846 [==============================] - 49s 27ms/step - loss: 0.4508 - accuracy: 0.5492 - val_loss: 0.5220 - val_accuracy: 0.47
Epoch 6/10
1846/1846 [==============================] - 49s 27ms/step - loss: 0.4508 - accuracy: 0.5492 - val_loss: 0.5220 - val_accuracy: 0.47
Epoch 7/10
1846/1846 [==============================] - 49s 27ms/step - loss: 0.4508 - accuracy: 0.5492 - val_loss: 0.5220 - val_accuracy: 0.47
Epoch 8/10
1846/1846 [==============================] - 49s 27ms/step - loss: 0.4508 - accuracy: 0.5492 - val_loss: 0.5220 - val_accuracy: 0.47
Epoch 9/10
1846/1846 [==============================] - 49s 27ms/step - loss: 0.4508 - accuracy: 0.5492 - val_loss: 0.5220 - val_accuracy: 0.47
Epoch 10/10
1846/1846 [==============================] - 49s 27ms/step - loss: 0.4508 - accuracy: 0.5492 - val_loss: 0.5220 - val_accuracy: 0.47
14716/14716 [==============================] - 26s 2ms/step
fold 3 8fa8e37b3c345f05b5aeff167939cc96
Epoch 1/10
1875/1875 [==============================] - 51s 27ms/step - loss: 0.1372 - accuracy: 0.8224 - val_loss: 0.0954 - val_accuracy: 0.86
Epoch 2/10
1875/1875 [==============================] - 50s 27ms/step - loss: 0.1058 - accuracy: 0.8511 - val_loss: 0.0921 - val_accuracy: 0.87
Epoch 3/10
1875/1875 [==============================] - 51s 27ms/step - loss: 0.1038 - accuracy: 0.8539 - val_loss: 0.0944 - val_accuracy: 0.86
Epoch 4/10
1875/1875 [==============================] - 51s 27ms/step - loss: 0.1021 - accuracy: 0.8563 - val_loss: 0.0931 - val_accuracy: 0.86
Epoch 5/10
1875/1875 [==============================] - 51s 27ms/step - loss: 0.1003 - accuracy: 0.8590 - val_loss: 0.0912 - val_accuracy: 0.87
Epoch 6/10
 1875/1875 [==============================] - 50s 27ms/step - loss: 0.0982 - accuracy: 0.8623 - val_loss: 0.0915 - val_accuracy: 0.87
Epoch 7/10
1875/1875 [==============================] - 51s 27ms/step - loss: 0.0957 - accuracy: 0.8665 - val_loss: 0.0918 - val_accuracy: 0.87
Epoch 8/10
1875/1875 [==============================] - 51s 27ms/step - loss: 0.0924 - accuracy: 0.8723 - val_loss: 0.0928 - val_accuracy: 0.86
Epoch 9/10
1875/1875 [==============================] - 51s 27ms/step - loss: 0.0882 - accuracy: 0.8795 - val_loss: 0.0943 - val_accuracy: 0.86
Epoch 10/10
1875/1875 [==============================] - 51s 27ms/step - loss: 0.0835 - accuracy: 0.8874 - val_loss: 0.0950 - val_accuracy: 0.86

已尝试:更换he_uniform与默认核初始化器;确认内存未耗尽;验证模型预测结果确实异常,并非日志显示问题。此前在CPU机器(旧版Keras/TF)上也遇到过类似问题。

解决方案
  • 重置优化器与模型状态:每个fold训练前必须创建全新的模型和优化器实例,禁止复用之前的优化器——Adam的动量参数会保留上一轮训练状态,导致后续训练无法更新参数。确保每次调用define_model_1D_v17()时都生成新的模型和优化器。
  • 修复损失函数语法错误:代码中loss='binary_crossentropy '末尾有多余空格,可能触发TF/Keras的非预期行为,改为loss='binary_crossentropy'。
  • 添加梯度裁剪:在优化器中加入梯度裁剪,防止梯度消失或爆炸导致参数停滞:
    opt = Adam(learning_rate=0.0005, clipvalue=1.0)
    
    或使用范数裁剪:
    opt = Adam(learning_rate=0.0005, clipnorm=1.0)
    
  • 固定全局随机种子:消除训练的非确定性,在训练代码开头添加:
    import tensorflow as tf
    import numpy as np
    import random
    
    tf.random.set_seed(42)
    np.random.seed(42)
    random.seed(42)
    
  • 重置数据生成器:每个fold训练前重新初始化train_gen和test_gen,确保生成器的打乱顺序、数据加载状态是全新的,避免复用之前的状态。
  • 调整学习率:尝试将学习率降低至0.0001,观察是否还会出现训练冻结情况。
  • 启用GPU训练确定性:在TF中强制启用确定性操作,避免GPU并行导致的异常:
    tf.config.experimental.enable_op_determinism()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:36:32