我正在使用FANN建立神经网络来进行回归问题。问题是,一旦网络对相关的培训集进行了培训(这似乎运行得很好),每个测试输出都是完全相同的输出。换句话说,考虑到我的16个预测变量的任何状态,根据人工神经网络,我的预测输出是相同的。
我的猜测是,网络正确地计算了计算的第一行,然后总是在其他计算中输出这个结果,不管我给它提供了什么(就像它在第一个训练示例中做得非常好,给出了一个准确的预测)。
例如,我的第一个培训示例变量是:
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>,其中每一行都是测试示例。我仍然有点困惑FAN包是如何工作的,因为我还没有找到真正明确的文档,如何培训和测试网络。我很难理解fann_type是如何工作的。
提前谢谢你。
发布于 2015-05-29 02:06:53
可能与谁有关。
上面所写的代码是正确的:在网络经过适当训练的情况下,它能够为不同的输入输出不同的值。
主要的问题是如何训练网络。因为它给了我一个正确的答案(14.7,非常接近预期的14.5),我以为它是经过适当训练的。实际上,它不是,而且是给出了与训练目标相对应的“最佳平均值”。由于我的训练集的差异很小,总是输出相同的值,无论输入是什么,都是一个不错的MSE (虽然,比我在R和Octave中得到的更糟糕,但由于我从未使用过FANN,所以我不知道该期待什么)。
解决方案很简单,我应该更早地考虑它:特性缩放。
考虑到我在互联网上遇到的一些问题,我认为这个软件包正在进行自我扩展。使用最基本的代码来训练网络,特征缩放不适用于训练集。
我重新推荐了一个在0到1之间的特性缩放(x - min / max - min)。
https://stackoverflow.com/questions/30475238
复制相似问题