Использование библиотеки FANN - PullRequest
2 голосов
/ 08 марта 2012

Я экспериментировал с библиотекой FANN , которая, кажется, является отличной библиотекой для нейронной сети, и у меня возникли некоторые вопросы о том, как ее использовать.

Итак, что я пытаюсь здесь сделать, это обучить нейронную сеть, ради того, чтобы возиться с библиотекой, дать ей ввод и ожидать вывода.

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);

Вот первые строки моего файла тренировочных данных (TRAINING_DATA):

16969 7 1
0.0812069 0.0812069 0.381578 0.0812069 5.8931e-05 0.0843302 0.606695 
1
0.429961 0.0509753 0.381578 0.0266957 0.000117862 0.00707172 0.0221581 
1
0.0983558 0.486888 0.381578 0.000117862 0.0266957 0.00701279 0.0539808 
1
0.0983558 0.486888 0.598562 0.0161471 0.0161471 0.000471448 0.00135541 
1

полный набор данных можно найти здесь

Используя пример данных из файла обучающих данных, я должен получить вывод, соответствующий ему, верно? Однако, если я сделаю следующее, я получу 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 2.2.0.

Спасибо

Редактировать : Похоже, что бета-версия 2.1.0 дает ожидаемые результаты, но не версия 2.2.0.

Редактировать 2 : На самом деле это была ошибка в используемой мной версии.

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Я пытался воспроизвести вашу ошибку, но не смог.Вот моя программа:

#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

Может быть, вы могли бы предоставить свой полный тренировочный набор?

0 голосов
/ 03 апреля 2012

В какой-то момент у меня возникли проблемы с тем, что и входы, и выходы получали значения, отличные от тех, которые я им изначально установил. Все это сводилось к использованию функции активации, которая имела диапазон, отличный от того, что я ожидал. Я написал об этой проблеме здесь:

http://leenissen.dk/fann/forum/viewtopic.php?f=1&t=1827

Функция активации по умолчанию - FANN_SIGMOID_STEPWISE, которая является диапазоном [0, 1]. Похоже, что все ваши данные находятся в диапазоне от 0 до 1, так что это ваша проблема.

Возможно, стоит загрузить файл данных в структуры данных fann, а затем посмотреть, что дают get_input () и get_output (), чтобы убедиться, что они соответствуют вашим ожиданиям.

Удачи

(если вы узнали, что происходит, пожалуйста, опубликуйте это здесь для потомков)

...