C++ 使用FANN库

C++ 使用FANN库,c++,artificial-intelligence,neural-network,C++,Artificial Intelligence,Neural Network,我一直在试验这个库,它似乎是一个很棒的神经网络库,我对如何使用它有些疑问 所以我在这里要做的是训练一个神经网络,为了搞乱这个库,给它一个输入,并期望一个输出 FANN::neural_net nn; const float desired_error = 0.00001; const unsigned int max_epochs = 500000; const unsigned int epochs_between_reports = 1000; const unsigned int laye

我一直在试验这个库,它似乎是一个很棒的神经网络库,我对如何使用它有些疑问

所以我在这里要做的是训练一个神经网络,为了搞乱这个库,给它一个输入,并期望一个输出

FANN::neural_net nn;
const float desired_error = 0.00001;
const unsigned int max_epochs = 500000;
const unsigned int epochs_between_reports = 1000;
const unsigned int layers_count = 3;
const unsigned int layers[layers_count] = {7, 5, 1};
nn.create_standard_array(layers_count, layers);
nn.train_on_file(TRAINING_DATA, max_epochs, epochs_between_reports, desired_error);
以下是我的培训数据文件(培训数据)的第一行:

可以找到完整的数据集

使用训练数据文件中的样本数据,我应该得到与之匹配的输出,对吗?但是,如果我执行以下操作,我将得到0作为输出

fann_type i[7], *o;
i[0] = 0.429961; i[1] = 0.0509753; i[2] = 0.381578; i[3] = 0.0266957; i[4] = 0.000117862; i[5] = 0.00707172; i[6] = 0.0221581;
o = nn.run(i);
std::cout << "output (run) is " << o[0] << std::endl;
fann_类型i[7],*o;
i[0]=0.429961;i[1]=0.0509753;i[2]=0.381578;i[3]=0.0266957;i[4]=0.000117862;i[5]=0.00707172;i[6]=0.0221581;
o=nn.run(i);

我试图重现你的错误,但我做不到。这是我的节目:

#include<iostream>
using namespace std;
#include <fann.h>
#include <fann_cpp.h>
#include <floatfann.h>
int main()
{
  FANN::neural_net nn;
  const float desired_error = 0.00001;
  const unsigned int max_epochs = 500000;
  const unsigned int epochs_between_reports = 1000;
  const unsigned int layers_count = 3;
  const unsigned int layers[layers_count] = {7, 5, 1};
  nn.create_standard_array(layers_count, layers);
  nn.train_on_file("test.train", max_epochs, epochs_between_reports, desired_error);

  fann_type i[7];
  i[0] = 0.429961; i[1] = 0.0509753; i[2] = 0.381578; i[3] = 0.0266957; i[4] = 0.000117862; i[5] = 0.00707172; i[6] = 0.0221581;
  fann_type *o = nn.run(i);
  std::cout << "output (run) is " << o[0] << std::endl;

  return 0;
}

也许您可以提供完整的培训集?

我曾经遇到过一个问题,输入和输出的值与我最初设置的值不同。这一切归结为使用了一个激活函数,它的范围与我所期望的不同。我在这里发布了关于这个问题的帖子:

默认的激活函数是FANN_SIGMOID_,其范围为[0,1]。看起来您的所有数据都在0和1之间,所以这很可能是您的问题

将数据文件加载到fann数据结构中,然后查看get_input()和get_output()为您提供了什么,以确保它们符合您的期望,这可能是值得的

祝你好运


(如果你发现了发生的事情,请为子孙后代着想,将其张贴在这里)

你有16969个训练示例,因此当你得到MSE(均方误差)<0.00001时,并不意味着所有预测都是正确的。您的网络是否达到了预期的错误?您是否测试了任何其他输入?是的,我有许多其他培训文件,并且总是得到相同的结果。我猜“test.train”包含了我随问题发布的数据集样本?是的,我猜这可能不足以进行此比较。这是一个完全不同的数据文件。这不是fann格式,我的错。我更新了错误的文件。这是一个好问题:让我们看看这个问题只发生在他版本的FANN库中,似乎是一个bug。
#include<iostream>
using namespace std;
#include <fann.h>
#include <fann_cpp.h>
#include <floatfann.h>
int main()
{
  FANN::neural_net nn;
  const float desired_error = 0.00001;
  const unsigned int max_epochs = 500000;
  const unsigned int epochs_between_reports = 1000;
  const unsigned int layers_count = 3;
  const unsigned int layers[layers_count] = {7, 5, 1};
  nn.create_standard_array(layers_count, layers);
  nn.train_on_file("test.train", max_epochs, epochs_between_reports, desired_error);

  fann_type i[7];
  i[0] = 0.429961; i[1] = 0.0509753; i[2] = 0.381578; i[3] = 0.0266957; i[4] = 0.000117862; i[5] = 0.00707172; i[6] = 0.0221581;
  fann_type *o = nn.run(i);
  std::cout << "output (run) is " << o[0] << std::endl;

  return 0;
}
Max epochs   500000. Desired error: 0.0000100000.
Epochs            1. Current error: 0.2283857614. Bit fail 4.
Epochs            7. Current error: 0.0000000000. Bit fail 0.
output (run) is 1