在FANN中使用验证数据集训练神经网络

时间:2016-06-08 09:30:15

标签: c++ validation neural-network fann

正如一些帖子所说,我开始使用FANN(http://leenissen.dk/fann/index.php)来做神经网络的事情。它干净且易于理解。

但是,为了避免过度拟合问题,我需要使用一种算法,将验证数据集视为辅助。 (whats is the difference between train, validation and test set, in neural networks?)。有趣的是,FANN写道,它建议开发人员考虑过度拟合问题(http://leenissen.dk/fann/wp/help/advanced-usage/)。

现在问题是,据我所知,FANN没有任何支持此功能的功能。 FANN中的训练函数既没有提供任何参数来传递验证数据集。我对么? FANN用户如何使用验证数据集训练他们的神经网络?谢谢你的帮助。

4 个答案:

答案 0 :(得分:0)

有训练集错误和验证设置错误。你在不同的时期和批次上训练,然后你每次在训练和验证之间结合。

当训练误差很小且验证错误很高时意味着您正在进行过度拟合。你需要做一些实验并重复,直到最好的模型适合你的数据而不是过度拟合训练集。 你可能有兴趣阅读这篇论文。

Preventing “Overfitting” of Cross-Validation data

答案 1 :(得分:0)

您必须自己将数据拆分为训练数据集和交叉验证数据集。您可以通过创建单独的输入文件,或使用fann_subset_train_dataref)等内置函数来完成此操作。

一旦你拥有了这两个数据集,你就可以用你训练数据集的方式训练你的NN。然后,您可以通过将培训数据传递到fann_test_dataref)来获取培训错误,并通过将交叉验证数据传递给fann_test_data来获取交叉验证错误。注意,此函数计算均方误差(MSE)。

注意:用户永远不会使用交叉验证数据集训练他们的神经网络 - 交叉验证数据集仅用于测试!

答案 2 :(得分:0)

您可以自己使用FANN实现此方法,即数据集拆分,但您需要使用函数fann_train_epoch分别训练每个时期。

您从一个大数据集开始,然后您可以根据不同的步骤进行拆分。棘手的是:您只将数据集拆分一次,并仅使用 第一部分来调整权重(培训本身)。

说,您想要已经拥有2个数据集:Tran和Validation(就像您发布的示例中一样)。首先需要将它们存储在不同的文件或数组中。然后,您可以执行以下操作:

struct fann *ann;
struct fann_train_data *dataTrain;
struct fann_train_data *dataVal;

假设您在文件中同时拥有两个数据集:

dataTrain = fann_read_train_from_file("./train.data");
dataVal = fann_read_train_from_file("./val.data");

然后,在设置所有网络参数后,您将训练并检查第二个数据集上的错误,一次一个纪元。这就像:

for(i = 1 ; i <= max_epochs ; i++) {
    fann_train_epoch(ann, dataTrain);
    train_error = fann_test_data(ann, dataTrain);
    val_error = fann_test_data(ann, dataVal);
    if ( val_error > last_val_error )
        break;
    last_val_error = val_error;
}

当然,这种情况太简单了,如果错误波动,可能会过早地停止训练循环(通常如下:看下图),但是您可以了解如何在训练期间使用不同的数据集。

顺便说一句,您可能希望保存这些错误,以便根据训练时期绘制它们并在训练结束后进行检查:

enter image description here

答案 3 :(得分:0)

您应该使用验证子集(通常是数据的1/5)来进行模型选择和网络体系结构。测试子集(也是数据的1/5)用于报告错误。应该这样做以避免报告由用于网络架构设计的相同数据导致的错误。您可以使用其余数据进行培训,但在找到模型后,您应该进行错误诊断,绘制学习曲线。这样做可以减少训练数据,以便更好地概括而不是过度拟合。可以使用节点数和隐藏层来完成相同的操作。