我正在尝试使用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的区间中,与前一个区域重叠50%。我可以采取哪些措施来使网络产生实际预测?我试过增加窗口大小,但结果保持不变。任何建议/一般提示非常感谢。
伊恩
答案 0 :(得分:0)
尝试在网络中添加一些隐藏图层和辍学图层。你可以创建一个简单的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%。这最终也是你必须决定的事情。
答案 1 :(得分:0)
过度拟合的问题是由输入数据类型引起的。传递给分类器的值应该是带有2个小数位的浮点值。在此过程中的某些地方,其中一些值已经增加,并且显着超过2位小数。也就是说,输入应该看起来像
[9.81, 10.22, 11.3]
但看起来像
[9.81000000012, 10.220010431, 11.3000000101]
分类器正在根据此功能进行预测,这显然不是理想的行为!学到的经验 - 确保数据准备是一致的!感谢@umutto对随机森林的建议,简单的结构有助于诊断目的。