Keras 密集网络过拟合

Posted

技术标签:

【中文标题】Keras 密集网络过拟合【英文标题】:Keras Dense Net Overfitting 【发布时间】:2018-06-27 01:09:13 【问题描述】:

我正在尝试使用 keras 从加速度计信号构建活动分类器。但是,即使使用最简单的模型,我也遇到了数据的极度过度拟合。

输入数据的形状为 (10,3),包含来自加速度计的大约 0.1 秒的 3 维数据。模型很简单

model = Sequential()
model.add(Flatten(input_shape=(10,3)))
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

模型应为步行活动输出标签 [1,0],为非步行活动输出标签 [0,1]。训练后,我得到了 99.8% 的准确率(如果它是真的……)。当我尝试对未用于训练的数据进行预测时,我得到了 50% 的准确率,验证了网络除了预测单个类值之外并没有真正“学习”任何东西。

正在根据 100hz 三轴加速度计信号准备数据。我没有以任何方式对数据进行预处理,除了将其窗口化到长度为 10 的 bin 中,这些 bin 与前一个 bin 重叠 50%。我可以采取哪些措施来使网络产生实际的预测?我尝试增加窗口大小,但结果保持不变。非常感谢任何建议/一般提示。

伊恩

【问题讨论】:

你有多少训练样例?拟合模型时是否使用交叉验证?您的课程是否在某些方面存在偏见或偏差?你对你的训练/测试集进行分层吗?通常你会使用正则化(l1、l2、dropout 等)来控制过度拟合,但是对于一个很小的模型(并且仍然是过度拟合),它不会产生任何影响。我觉得数据还有另一个问题。您是否尝试过逻辑回归、随机森林等更简单的模型? @umutto 大约有 25k 个训练示例,并且正在使用 0.25 的验证拆分。我在我创建的一些更复杂的模型中使用了 dropout,但为了简单起见,我故意将其省略。我现在将使用随机森林方法,并将更新任何新信息。 我不认为辍学在这里会做任何事情(你只有 2 个单位)。是的,你应该尝试随机森林,看看它是否能提供更好的结果。如果不是,那么您的数据集或训练/测试拆分可能存在一些结构性问题。 25k 和使用验证对我来说听起来不错,甚至听起来你应该有余地来使用更复杂的正则化模型,这里的过度拟合听起来像一个倾斜的数据和一个不幸的训练/测试拆分。 【参考方案1】:

过拟合问题是由输入数据类型引起的。传递给分类器的值应该是带有 2 位小数的浮点值。在此过程中的某个地方,其中一些值已经增加,并且具有明显超过 2 个小数位。也就是说,输入应该是这样的

[9.81, 10.22, 11.3]

但看起来像

[9.81000000012, 10.220010431, 11.3000000101]    

分类器是根据这个特征进行预测的,这显然不是我们想要的行为!经验教训 - 确保数据准备是一致的!感谢@umutto 对随机森林的建议,简单的结构有助于诊断目的。

【讨论】:

【参考方案2】:

尝试在您的网络中添加一些隐藏层和丢弃层。您可以创建一个简单的Multi Layer Perceptron (MLP),在您的 Flatten 层和 Dense 层之间添加几条额外的线:

model.add(Dense(64, activation='relu', input_dim=30))
model.add(Dropout(0.25))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.1))

Or check out this guide. 解释了如何创建一个简单的 MLP。

没有任何隐藏层,您的模型实际上不会从输入数据中“学习”,而是将输入的特征数量映射到输出的特征数量。

添加的层越多,它应该从输入数据中提取的中间特征和模式就越多,这应该会导致对测试数据进行更好的模型预测。设计最佳模型需要反复试验,因为太多的层会导致过度拟合。

您没有提供有关如何训练模型的信息,因此这也可能是问题的原因。您必须确保将数据分配到训练、测试和验证集中。用于训练、验证、测试数据的一些可能的拆分比率是:60%:20%:20%,或 70%:15%:15%。这最终也是您必须决定的事情。

【讨论】:

为了回答您关于训练、验证和测试的问题,大约有 25K 个样本。我保存了 10% 的样本用于验证,并有另一组 2500 个样本用于测试。在这一点上,我宁愿不添加额外的层,我只是想证明模型没有过度拟合数据。从那里我将回到我尝试使用的真实模型,看看我是否可以解决那里的过度拟合问题。

以上是关于Keras 密集网络过拟合的主要内容,如果未能解决你的问题,请参考以下文章

Keras深度学习实战——深度学习过拟合问题及解决方法

Keras减少过拟合的秘诀——Dropout正则化

深度学习Trick——用权重约束减轻深层网络过拟合|附(Keras)实现代码

Keras:过拟合模型?

Pytorch vs. Keras:Pytorch 模型严重过拟合

Dropout与过拟合抑制函数式API