2015-05-27 3 views
0

Я использую библиотеку FANN для создания нейронных сетей для решения проблемы регрессии. Дело в том, что после того, как сети прошли обучение по соответствующему набору учебных кадров (который, кажется, работает достаточно хорошо), каждый тест выводит точный результат. Другими словами, учитывая любое состояние моих 16 прогнозирующих переменных, мой предсказанный результат, согласно ANN, тот же.C++ FANN fann_run всегда производит одинаковый вывод

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

Например, мой первый учебный пример переменные:

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 является a fann*, который уже подготовлен
  • timeSerie является matrix<double> где каждая строка является тестовым примером

Я все еще немного смущен тем, как работает пакет FANN, поскольку я не нашел действительно четкой документации о том, как обучать сети и тестировать их. Я изо всех сил пытаюсь понять, как работает fann_type.

Заранее спасибо.

+0

просто масштабируйте функции перед тренировкой и запуском –

ответ

1

Кому это может быть интересно.

Указанный выше код верен: в случае, когда сеть была должным образом обучена, ему удается выдавать разные значения для разных входов.

Основная проблема заключалась в обучении сети. Поскольку он дал мне правильный ответ (14.7, что было очень близко к ожидаемому 14.5), я предположил, что он был надлежащим образом подготовлен. На самом деле это было не так, и было похоже на предоставление «лучшей средней стоимости», соответствующей целевым показателям обучения.Поскольку у моего набора упражнений очень мало различий, всегда выводя одно и то же значение, независимо от того, какой ввод его кормили, давал достойный MSE (хотя, что было хуже, чем у меня в R и Octave, но поскольку я никогда не использовал FANN, я сделал не знаю, чего ожидать).

Решение прост, и я должен был подумать об этом раньше: масштабирование функции.

Я предположил, что пакет сам по себе использует масштабирование, учитывая некоторую литературу, которую я получил в Интернете. С самым базовым кодом для обучения сетям масштабирование функций не применяется к наборам обучения.

Я рекомендую масштабирование функции от 0 до 1 (x - min/max - min).

+0

Удостоверьтесь в том, что Инициализация веса и смещения для NN не приведет к таким же результатам :) – pbu

Смежные вопросы