我正在使用FANN库来构建神经网络以解决回归问题。问题是,一旦网络训练了相关的训练集(看起来效果很好),每一次测试都输出完全相同的输出。换句话说,根据我的16个预测变量的任何状态,根据ANN,我的预测输出是相同的。
我的猜测是网络正确地计算了计算的第一行,然后总是将这个结果输出到其他计算中,无论我喂它什么(因为它似乎在第一个训练示例中做得非常好,给出准确的预测)。
例如,我的第一个训练示例变量是:
1 1 13.5 13.5 13.5 14.5 14.4 14.3 14.3 14.2 14.5 13 11.7 12.2 12.2 11.3
我的目标输出是14.5,并且在每次测试时,网络输出14.69和14.7之间的东西(由于计算时间很短,因为我只使用包,我每次运行代码时都会训练它)。 因此,这组输出似乎完全合法。
问题是,当我尝试在其他几个输入上运行它时,我总是得到相同的14.69 / 14.7(即使是最小的数字也是相同的输出)。
由于网络似乎正在正确处理训练示例,在一个新的测试示例中正确地学习关系和计算,我倾向于认为所有训练部分都是正确的。由于网络没有理由总是输出相同的值,我的猜测是我的测试方式不正确。
我的问题是:在新数据集上测试FANN神经网络的确切语法是什么?并且,如何打印/保存相应的输出?
以下是我的代码的当前状态:
fann_type *calc_out;
fann_type input[16];
for (int i = 0; i < 20; i++)
{
if (!rowHasNA(timeSerie, i))
{
cout << "Input : ";
for (int j = 1; j < 17; j++)
{
input[j - 1] = timeSerie(i, j);
cout << input[j - 1] << " ";
}
cout << endl;
calc_out = fann_run(ann, input);
cout << "Input " << i << " gives : " << calc_out[0] << endl;
}
}
其中:
rowHasNA
是一个自定义函数,用于确定我的示例是否至少有一个NA ann
是已经过培训的fann*
timeSerie
是matrix<double>
,其中每一行都是测试示例我仍然对FANN软件包的工作方式感到困惑,因为我没有找到关于如何培训网络和测试它们的真正清晰的文档。我很难理解fann_type
的工作原理。
提前谢谢。
答案 0 :(得分:1)
可能涉及的对象。
上面写的代码是正确的:在网络经过适当培训的情况下,它设法为不同的输入输出不同的值。
主要问题是培训网络。因为它给了我一个正确答案(14.7,非常接近预期的14.5),我认为它已经过适当的训练。实际上,它不是,并且有点给出了最好的平均值&#34;对应于培训目标。由于我的训练集的变化非常小,所以总是输出相同的值,无论输入什么输入,都给出了一个不错的MSE(虽然,比我在R和Octave中的方式更差,但是因为我从来没有使用FANN我做过不知道会发生什么。)
解决方案很简单,我之前应该考虑过这个问题:功能扩展。
我认为该软件包正在逐步进行功能扩展,因为我已经在互联网上发表了一些文章。使用最基本的训练网络代码,功能缩放不适用于训练集。
我建议缩放0到1之间的特征(x - min / max - min)。