训练神经网络时如何在准确性/减少损失方面给予特定输出更高的优先级
Posted
技术标签:
【中文标题】训练神经网络时如何在准确性/减少损失方面给予特定输出更高的优先级【英文标题】:How to give specific outputs higher priority in accuracy / reducing loss, when training Neural Network 【发布时间】:2019-12-04 22:09:28 【问题描述】:所以我正在处理一个具有 10 个输入和一个输出的简单神经网络。我可以有尽可能多的隐藏层,但是我使用的是 2。我还使用了“mean_squared_error”损失函数和 RMSProp 优化器。
无论如何,我的问题是,假设我的输出值是这样的: [0,0,3,0,0,0,5,0,0,2,0...] 等。请注意,值 0 重复的频率更高。所以我想做的是尝试强制神经网络在“输出端非零值”的情况下学习得更好。给予这些价值观更多的“重要性”。 因为如果我使用 'mean_squared_error',训练会尝试根据整个数据集进行优化,这将主要导致优化案例,其中 0 是输出值。
编辑: 我正在处理的问题可能是物理系统的简单建模。假设我们有一个已知输入的黑盒系统。这个黑盒有一个输出(让我们说温度)。根据我们的输入和相应的输出,我们可以使用神经网络作为“黑盒”对系统进行建模,然后使用经过训练的 NN 来预测温度。
编辑: 所以我现在使用不同的训练/验证集。我怀疑前一个有问题。 现在我得到了类似上图的东西(请查看即时峰值) 是什么原因造成的?
请记住,我在神经网络方面没有经验,因此欢迎任何反馈:)
【问题讨论】:
【参考方案1】:ML 中有两个重要的概念。
“欠拟合”和“过拟合”,在你的情况下我认为它是欠拟合的。
解决这个问题有一些方法:
-
通过添加更多层和单元使您的模型更加复杂
如果您使用正则化术语,请减小它们的值
使用更多功能(如果有的话)
希望对你有所帮助。
【讨论】:
嗨 mehran rafiee。感谢您的反馈意见。我确定不会处理过度拟合,因为测试数据具有与训练/验证数据相同的类型/误差幅度。所以我们在同一页面上:) 可能是存在“欠拟合”的问题。我试过你 1.) 建议,但没有改善。我不确定您所说的 2.) 点是什么意思?你能不能快点指出我?大约3.),如果有特征,你指的是“输入到NN”,那么答案是“是的,我试过了”:) @AljazJelen 更多功能不同于更多数据。例如,在数据框中,我们将讨论列而不是行(数据点)。还有你用的是什么算法? 关于我的数字 2。:有一些正则化术语,如 L1 或 L2,可能有助于防止过度拟合问题。可以与我们分享您的 NN 架构吗?如果没有,您是否尝试过在您的 NN 层中进行批量标准化?你试过用“Adam”作为优化器,用“crossentropy”作为损失函数吗? @Mehran,我正在处理回归,所以我认为交叉熵会起作用。 NN架构,我可以和你分享,但我一直在改变它,以达到更好的效果。现在我有 4 个隐藏层,其中有 [50,50,20,10] 个神经元,一个在输出级。所有隐藏层都是 Dense 并具有 Tanh 激活函数(因为输入已归一化),而输出层具有 ReLu 激活函数。【参考方案2】:如果您的输出是整数[0,0,3,0,0,0,5,0,0,2,0...]
,即classes
,您可能会进行分类。所以,你的损失应该是categorical_crossentopy
。在这种情况下,有两种方法可以做你想做的事:
1- 您可以使用 SMOTE(Synthetic Minority Oversampling)技术,使非零类获得与零类相同的权重。对于二进制类:
from imblearn.over_sampling import SMOTE
from imblearn.combine import SMOTEENN
sm = SMOTEENN()
x, y = sm.fit_sample(X, Y)
2- 您还可以调整 Keras 类的权重:
class_weight = 0: 1.,1: 30.
model.fit(X, Y, nb_epoch=1000, batch_size=16, class_weight=class_weight)
【讨论】:
嗨 Rubens_ZImbres,感谢您的回答。首先我想指出,NN 的输出不是整数数组。它是一个简单的整数。由于保密,我不能详细说明,但我在原帖中添加了更多解释。所以我想,我不是在处理分类问题。以上是关于训练神经网络时如何在准确性/减少损失方面给予特定输出更高的优先级的主要内容,如果未能解决你的问题,请参考以下文章
神经网络 - Softmax 交叉熵损失减少对应于准确性降低