在 FANN 中使用验证数据集训练神经网络
Train neural network with validation dataset in FANN
正如一些帖子所建议的那样,我开始使用 FANN (http://leenissen.dk/fann/index.php) 来做神经网络的事情。它简洁明了。
但是,为了避免过拟合问题,我需要采用一种将验证数据集作为辅助的算法。 (whats is the difference between train, validation and test set, in neural networks?). Interestingly, FANN wrote that it recommends the developer to consider the over-fitting problem (http://leenissen.dk/fann/wp/help/advanced-usage/).
现在的问题是,据我所知,FANN 没有任何功能支持此功能。 FANN 中的训练函数也不提供任何参数来传递验证数据集。我对么? FANN 用户如何使用验证数据集训练他们的神经网络?感谢您的帮助。
存在训练集错误和验证集错误。您在不同的时期和批次上进行训练,然后每次结合训练和验证之间的结果。
当训练错误率低而验证错误率高时,意味着你正在做过度拟合。你需要做一些实验并重复,直到你的最佳模型适合你的数据而不是过度适合训练集。
您可能有兴趣阅读这篇论文。
您必须自己将数据拆分为训练数据集和交叉验证数据集。您可以通过创建单独的输入文件或使用像 fann_subset_train_data
(ref).
这样的内置函数来做到这一点
一旦你有了这两个数据集,你就可以使用你的训练数据集以任何你喜欢的方式训练你的神经网络。然后,您通过将训练数据传递给 fann_test_data
(ref) 来获得训练误差,并通过将交叉验证数据传递给 fann_test_data
来获得交叉验证误差。请注意,此函数计算均方误差 (MSE)。
注意:用户永远不会用交叉验证数据集训练他们的神经网络——交叉验证数据集仅用于测试!
您可以自己使用 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;
}
当然,这个条件太简单了,如果错误波动(通常如此:看下图),可能会过早停止你的训练循环,但你可以大致了解如何在训练期间使用不同的数据集培训。
顺便说一句,您可能希望保存这些错误,以便将它们与训练时期进行对比,并在训练结束后查看:
一般来说,您应该使用验证子集(通常是数据的 1/5)来选择模型和构建网络。测试子集(也是数据的 1/5)用于报告错误。应该这样做,以避免报告因用于网络体系结构设计的相同数据而导致的错误。您可以使用其余数据进行训练,但在找到模型后,您应该进行错误诊断并绘制学习曲线。这样做可以减少训练数据,以便更好地泛化而不是过度拟合。可以对节点数和隐藏层数进行同样的处理。
正如一些帖子所建议的那样,我开始使用 FANN (http://leenissen.dk/fann/index.php) 来做神经网络的事情。它简洁明了。
但是,为了避免过拟合问题,我需要采用一种将验证数据集作为辅助的算法。 (whats is the difference between train, validation and test set, in neural networks?). Interestingly, FANN wrote that it recommends the developer to consider the over-fitting problem (http://leenissen.dk/fann/wp/help/advanced-usage/).
现在的问题是,据我所知,FANN 没有任何功能支持此功能。 FANN 中的训练函数也不提供任何参数来传递验证数据集。我对么? FANN 用户如何使用验证数据集训练他们的神经网络?感谢您的帮助。
存在训练集错误和验证集错误。您在不同的时期和批次上进行训练,然后每次结合训练和验证之间的结果。
当训练错误率低而验证错误率高时,意味着你正在做过度拟合。你需要做一些实验并重复,直到你的最佳模型适合你的数据而不是过度适合训练集。 您可能有兴趣阅读这篇论文。
您必须自己将数据拆分为训练数据集和交叉验证数据集。您可以通过创建单独的输入文件或使用像 fann_subset_train_data
(ref).
一旦你有了这两个数据集,你就可以使用你的训练数据集以任何你喜欢的方式训练你的神经网络。然后,您通过将训练数据传递给 fann_test_data
(ref) 来获得训练误差,并通过将交叉验证数据传递给 fann_test_data
来获得交叉验证误差。请注意,此函数计算均方误差 (MSE)。
注意:用户永远不会用交叉验证数据集训练他们的神经网络——交叉验证数据集仅用于测试!
您可以自己使用 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;
}
当然,这个条件太简单了,如果错误波动(通常如此:看下图),可能会过早停止你的训练循环,但你可以大致了解如何在训练期间使用不同的数据集培训。
顺便说一句,您可能希望保存这些错误,以便将它们与训练时期进行对比,并在训练结束后查看:
一般来说,您应该使用验证子集(通常是数据的 1/5)来选择模型和构建网络。测试子集(也是数据的 1/5)用于报告错误。应该这样做,以避免报告因用于网络体系结构设计的相同数据而导致的错误。您可以使用其余数据进行训练,但在找到模型后,您应该进行错误诊断并绘制学习曲线。这样做可以减少训练数据,以便更好地泛化而不是过度拟合。可以对节点数和隐藏层数进行同样的处理。