fann_neural_net_1

Пример классификации ирисов Фишера с помощью нейронной сети FANN

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

Набор содержит 150 объектов (собственно, ирисов), которые описываются с помощью 4 вещественных параметров. Каждый ирис принадлежит одному из 3 классов. В этом примере мы обучим сеть на 130 объектах и протестируем полученную сеть на 20 оставшихся объектах.

Для решения задачи будем использовать библиотеку с открытым исходным кодом FANN (Fast Artificial Neural Network Library), которая написана на языке C. Эта библиотека довольно часто выпадала в ответах для моих поисковых запросов, поэтому решил проверить. Ссылка на официальный сайт библиотеки, ссылка на репозиторий GitHub.

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

Что нам должна ответить нейронная сеть - к какому классу принадлежит объект тестовой выборки.

Приступим к практике. Первым делом разделим наш набор данных на два файла, в одном из которых будет находится 130 объектов для обучения сети, в другом файле будут находится объекты для тестирования сети. Как я понял, FANN требует определенный формат файлов с данными. Выглядеть каждый файл должен так:

Где первая строка файла (параметры разделены пробелами) это количество объектов в данном файле,  количество параметров объекта (количество входных нейронов сети), количество выходных нейронов сети. Вторая строка это описание параметров объектов. В нашем случае ирис описывается 4-мя вещественными значениями. Третья строка это описание правильной реакции выходных нейронов. В нашем случае, первый объект из примера принадлежит второму классу (0 1 0), второй объект принадлежит третьему классу (0 0 1), третий объект принадлежит первому классу (1 0 0). То есть при тестировании 3 выходных нейрона в идеале должны выдавать именно такие значения. Но такого никогда не будет. Выходные нейроны будут давать результаты в вещественных числах в пределах от 0 до 1.

Для удобства выкладываю данные текстовые файлы с наборами данных для нашего эксперимента. В архиве находится два текстовых файла. Ссылка на загрузку.

 

Наборы есть, осталось написать рабочую программу. Ниже привожу рабочий вариант программы с подробным описанием, что там происходит.

Как видно, в коде есть места с хардкодом, но в этом примере это не так важно.

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

Для оценки насколько качественно сработала нейронная сеть, я не буду считать разные оценки точности, полноты и т.д. Просто приведу примеры, где зрительно можно оценить правильность классификатора. Ниже на картинках в квадратных скобках приведен исходный класс объекта (напомню, всего их 3: 0, 1 и 2, т.е. тут нумерация начинается с 0) и значения выходных нейронов. Первый столбец это значения выходного нейрона для класса 0, второй столбец для класса 1, третий столбец для класса 2. Чем ближе значение к 1, тем больше вероятность принадлежности объекта к классу.

Вот результаты для исходной 4-65-3 архитектуры:

fanntest_1

Как видно в целом сеть дает хорошие результаты. Разные классы объектов явно отделены друг от друга разной активностью выходных нейронов, поэтому в целом спутать не получится.

Экспериментировал с разным количеством нейронов в скрытом слое. Получил следующие результаты.

Такие результаты для 90 нейронов:

fanntest_2

Такие результаты для 25 нейронов:

fanntest_3

Также для улучшения результатов нужно подбирать количество эпох обучения. Но важно понимать, что больше - не всегда лучше, потому что сеть может сильно переобучиться. Но и мало эпох также плохо сказывается на обучение искусственных нейронных сетей.

Классификатор, считаю, в целом удался. Теперь можно спокойно определять где какой ирис Фишера.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">