为啥 Keras 的 train_on_batch 在第二个 epoch 产生零损失和准确率?

Posted

技术标签:

【中文标题】为啥 Keras 的 train_on_batch 在第二个 epoch 产生零损失和准确率?【英文标题】:Why does Keras' train_on_batch produce zero loss and accuracy at the second epoch?为什么 Keras 的 train_on_batch 在第二个 epoch 产生零损失和准确率? 【发布时间】:2016-09-29 07:33:01 【问题描述】:

我正在使用一个大数据集,因此我正在尝试使用 train_on_batch(或适合 epoch = 1)

model = Sequential()
model.add(LSTM(size,input_shape=input_shape,return_sequences=False))
model.add(Dense(output_dim))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=["accuracy"])

for e in range(nb_epoch):
    for batch_X, batch_y in batches:
        model.train_on_batch(batch_X,batch_y)
        # or
        # model.fit(batch_X,batch_y,batch_size=batch_size,nb_epoch=1,verbose=1,shuffle=True,)

但是当训练开始时,会发生这种情况:

(0, 128)
Epoch 1/1
128/128 [==============================] - 2s - loss: 0.3262 - acc: 0.1130

(129, 257)
Epoch 1/1
128/128 [==============================] - 2s - loss: -0.0000e+00 - acc: 0.0000e+00

无论我等待多少个 epoch,它都不会改变。即使我更改批量大小,也会发生同样的事情:第一批具有良好的值,然后再次变为“loss: -0.0000e+00 - acc: 0.0000e+00”。

有人可以帮助了解这里发生了什么吗?

【问题讨论】:

如果您的训练数据包含非常少量的独特示例并且您的网络在第一批中学习了所有这些示例,则可能会发生这种情况。也许您不小心在数据集创建脚本中使用数组引用而不是副本来放置相同的元素。 是的,看看预测和标签,看看网络是否真的达到了 0 准确度。这将帮助您调试。 @DmitryKostyaev 相同的元素。这是一个小错误,我觉得很傻。感谢您的帮助。 投票结束:(1) Keras 自 4 年前以来发生了巨大变化; (2) 没有足够的调试细节; (3) 这是 OP 的唯一问题,因此 (2) 不太可能得到解决。 【参考方案1】:

这似乎是梯度爆炸/消失的问题。就像有人说的那样尝试调整你的学习率和/或你的神经网络层的深度/宽度

【讨论】:

【参考方案2】:

如果类别太多,如果你的数据集不好;当系统没有找到好的结果时,它会自动打印局部最小值。尝试改变学习率。

opt = keras.optimizers.Adam(learning_rate=0.01)
model.compile(loss='categorical_crossentropy', optimizer=opt)

【讨论】:

以上是关于为啥 Keras 的 train_on_batch 在第二个 epoch 产生零损失和准确率?的主要内容,如果未能解决你的问题,请参考以下文章

keras 中带有 train_on_batch 的自定义 Loss fnc 用于重放学习

Tensorflow+kerasKeras API两种训练GAN网络的方式

Tensorflow+kerasKeras API两种训练GAN网络的方式

在 keras 中制作自定义损失函数

为啥keras安装以后导入失败?

Keras:为啥 Sequential 和 Model 给出不同的输出?