首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ FANN fann_run总是产生相同的输出

C++ FANN fann_run总是产生相同的输出
EN

Stack Overflow用户
提问于 2015-05-27 06:57:17
回答 1查看 1.1K关注 0票数 0

我正在使用FANN建立神经网络来进行回归问题。问题是,一旦网络对相关的培训集进行了培训(这似乎运行得很好),每个测试输出都是完全相同的输出。换句话说,考虑到我的16个预测变量的任何状态,根据人工神经网络,我的预测输出是相同的。

我的猜测是,网络正确地计算了计算的第一行,然后总是在其他计算中输出这个结果,不管我给它提供了什么(就像它在第一个训练示例中做得非常好,给出了一个准确的预测)。

例如,我的第一个培训示例变量是:

代码语言:javascript
复制
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神经网络的确切语法是什么?如何打印/保存相应的输出?

下面是我的代码的当前状态:

代码语言:javascript
复制
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是如何工作的。

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-29 02:06:53

可能与谁有关。

上面所写的代码是正确的:在网络经过适当训练的情况下,它能够为不同的输入输出不同的值。

主要的问题是如何训练网络。因为它给了我一个正确的答案(14.7,非常接近预期的14.5),我以为它是经过适当训练的。实际上,它不是,而且是给出了与训练目标相对应的“最佳平均值”。由于我的训练集的差异很小,总是输出相同的值,无论输入是什么,都是一个不错的MSE (虽然,比我在R和Octave中得到的更糟糕,但由于我从未使用过FANN,所以我不知道该期待什么)。

解决方案很简单,我应该更早地考虑它:特性缩放。

考虑到我在互联网上遇到的一些问题,我认为这个软件包正在进行自我扩展。使用最基本的代码来训练网络,特征缩放不适用于训练集。

我重新推荐了一个在0到1之间的特性缩放(x - min / max - min)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30475238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档