【问题标题】:NAN values with SGD optimizer in Keras for regression NN在 Keras 中使用 SGD 优化器进行回归 NN 的 NAN 值
【发布时间】:2021-04-15 15:40:31
【问题描述】:

我尝试训练一个神经网络进行回归。当使用 Keras 的 SGD 优化器类时,我在第一步之后突然从我的网络中得到 NAN 值作为预测。在我使用 Adam 优化器类进行培训之前,一切都运行良好。我已经尝试过改变 SGD 的学习率,但在第一步和编译之后仍然会出现 NAN 值作为模型预测。

自从我使用 Adam 优化器进行培训以来,我认为我的输入不会导致 NAN。我已经检查了 NaN 的输入值并删除了所有这些值。那么是什么导致了这种行为呢?

这是我的代码:

from keras.optimizers import Adam
from keras.optimizers import SGD
model = Sequential()

model.add(Dense(300,input_shape=(50,), kernel_initializer='glorot_uniform', activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(300, kernel_initializer='glorot_uniform', activation='relu')) model.add(Dropout(0.3)) 
model.add(Dense(500, kernel_initializer='glorot_uniform', activation='relu')) model.add(Dropout(0.3)) 
model.add(Dense(400, kernel_initializer='glorot_uniform', activation='relu')) model.add(Dense(1, kernel_initializer='glorot_uniform', activation='linear'))

opt = SGD(lr=0.001, decay=1e-6)

model.compile(loss='mse', optimizer=opt)

model.fit(x_train, y_train, epochs=100, batch_size=32, verbose=0, validation_data=(x_test, y_test))

#print(type(x_train)) ='pandas.core.frame.DataFrame'>
#print( x_train.shape) = (10000 , 50)

【问题讨论】:

    标签: python optimization keras nan sgd


    【解决方案1】:

    使用 ANN 进行回归有点棘手,因为输出没有上限。

    损失函数中的 NaN 很可能是因为你有爆炸梯度。 使用 Adam 时不显示 NaN 的原因是 Adam 调整了学习率。 Adam 大部分时间都在工作,因此只要您没有特定原因,请避免使用 SGD。

    我不确定您的数据集包含什么,但您可以尝试:

    • 添加 L2 正则化
    • 标准化输入
    • 增加批量大小。

    【讨论】:

    • 感谢您的回复。我的输入是用 sklearn 标准缩放器缩放的,你是对的,在我的训练开始进一步降低学习率之后。在我的设置中,我想通过流数据重放来实现增量学习算法。因此,我收集数据直到达到一个批次,并用新批次训练我的网络。你认为亚当适用于这种情况吗?是否可以将 Adam 优化器与 train_on_batch() 一起使用?是否需要在每次train_on_batch之后保存学习率,并在下一次调用train_on_batch之前加载到Adam优化器中?
    • 不客气。你可以试试 Adam,如果它没有给你一个很好的收敛,你可以考虑尝试另一个。我不确定保存和加载 LR,所以我会创建一个跟踪 LR 的回调。然后如果没有加载我会考虑加载它。
    猜你喜欢
    • 2020-11-15
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2019-05-07
    • 1970-01-01
    相关资源
    最近更新 更多