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
相关产品推荐
相关产品推荐

