
橙色曲线为列车精度,蓝色为验证精度。这是明显的不合适,还是我应该让它运行更多的时代?
使用自定义数据集(具有70个特性的一维数据),我训练了一个2层MLP。网络架构:70-200-200-4。我只能达到~50+%的精度。对于我可以采取哪些措施来提高准确性,有什么建议吗?(获取更多数据不是一种选择)
提前感谢!
发布于 2018-05-14 12:16:18
发布于 2018-05-14 16:21:17
有几种方法,你可以采取,以确定如何和是否可以提高准确性。这里概述的一些选项是将网络结果与基线估计器进行比较、诊断错误分类、应用降维和网络体系结构故障排除。
在不了解数据的情况下,我认为您可以尝试通过比较网络性能和基线估计器(如决策树或支持向量机)来确定是否有可能提高网络的准确性。使用决策树的好处是,像ID3这样的算法使用信息增益进行分割,这可能会给您一些关于数据的直觉,以及在投入时间之前是否有可能提高准确性。如果您还没有,您可以做一些探索性的分析,以了解数据/类有多大的噪音。
更仔细地观察您的网络所犯的错误也可能是有用的。混淆矩阵或分类报告可以帮助您诊断您的网络是否正在与决策边界的一个特定类或特定区域进行斗争(例如)。如果你的课程是不平衡的,你可以重新考虑你的训练例子和方法,如班吉提到的“击打”等。
具有70个特征的网络可能会从降维中受益。如果将PCA应用于数据,您可以确定需要解释数据中的合理方差的组件有多少,或者它是否更复杂。如果将转换后的数据作为输入而不是原始数据(关于该主题,您是否对数据进行了预处理),您的网络可能会做出更好的响应。
最后,更广泛的架构搜索可能会产生更好的结果--我假设您可能已经这样做了,但是您是否尝试过在每个层中增加单元,或者删除第二个隐藏层?您还可以尝试使用不同的激活函数或不同的学习进度计划。Bengio的“基于梯度的深层建筑训练实用建议”值得一读(这篇文章主要针对更深层次的网络,但第3.1、3.2和4节的内容是相关的)。
这个答案只是简单的触及每一个领域,但我希望有一些可靠的线索,你可以追踪。
发布于 2018-05-15 04:20:39
很难确定这是否实际上是过分适合,因为您的验证精度还没有开始下降。过拟合的特点是一组模型参数,这些参数在训练集上表现很好,但不能推广到不同的数据子集。
我想你是根据这些情节使用Keras的。为了避免在训练时过度拟合,只有当模型在验证集上变得更好时,才能保存权重,而忽略那些没有更好或更坏的权重。这将确保在培训课程结束时,您拥有将最好的权值推广到保存到文件中的验证集的权重,然后将其加载到模型中。
中的最佳权重集
使用一个回调,该回调将在历代之间运行。
name = 'my_model'
if not os.path.exists('weights//'+name):
os.makedirs('weights//'+name)
# Save the weights using a checkpoint.
filepath='weights//' + name + '//weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5'
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint]
epochs = 100
# Fit the model weights.
history = model.fit_generator(generator=training_generator,
steps_per_epoch=training_generator.num_batches,
epochs=epochs,
verbose=1,
callbacks=callbacks_list,
validation_data=validation_generator,
validation_steps=validation_generator.num_batches)然后,当训练完成后,您可以使用以下方法检索最佳的权重集
weight_filename = '...'
model.load_weights('weights//' + name + weight_filename)https://datascience.stackexchange.com/questions/31555
复制相似问题