Нейронные сети.
Пример программы нейронной сети
с исходным кодом на с++.
Про нейронные сети хорошо и подробно написано
здесь. Попытаемся разобраться как программировать
нейронные сети, и как это работает. Одна из задач решаемых нейронными сетями, задача классификации. Программа демонстрирует работу нейронной сети классифицирующей цвет.
В компьютере принята трехкомпонентная модель представления цвета
RGB, на каждый из компонентов отводится один байт.
полный цвет представлен 24 битами, что дает 16
миллионов оттенков. Человек же может отнести любой из этих оттенков к одному из
имеющих название цветов. Итак задача:
Дано InColor - цвет RGB (24
бит)
классифицировать цвет, т.е. отнести его к одному из цветов заданных
множеством М={
Черный, Красный,
Зеленый, Желтый, Синий,
Фиолетовый, Голубой,
Белый }.
OutColor - цвет из множества М
Решение номер 1. (цифровое)
Создаем массив размером 16777216 элементов
int8 ColorTab [ 16777216 ];
|
инициализируем его правильными значениями.
Ответ получаем очень быстро
OutColor = ColorTab [ InColor ];
|
Решение номер 2. (аналоговое)
напишем функцию, типа
int8 GetColor(DWORD Color)
{
double Red = (double(((Color>>16)&0xFF)))/255*100;
double Green = (double(((Color>>8)&0xFF)))/255*100;
double Blue = (double((Color&0xFF)))/255*100;
double Level = Red;
if(Green > Level)
Level = Green;
if(Blue > Level)
Level = Blue;
Level = Level * 0.7;
int8 OutColor = 0;
if(Red > Level)
OutColor |= 1;
if(Green > Level)
OutColor |= 2;
if(Blue > Level)
OutColor |= 4;
return OutColor;
}
|
Это будет работать если задачу можно описать простыми уравнениями, а вот если
функция настолько сложна что описанию. не поддается, здесь то на помощь приходят
нейронные сети.
Решение номер 3. (нейронная сеть)
Простейшая нейронная сеть. Однослойный перцептрон.
Все нейронное заключено в класс
CNeuroNet
#define INCOUNT 3
#define NEUROCOUNTMAX 10
struct Neuron
{
double x[INCOUNT];// входные сигналы
double w[INCOUNT];// весовые коэффициенты
double w0;// доп вес
double sum;// сумма
double y;// выход аксон
double h;
};
class CNeuroNet
{
public:
CNeuroNet(void);
~CNeuroNet(void);
float ActiveSigm(float x);
float ActiveSigmPro(float x);
void ProcNeuro(Neuron& n);
int Process();
int Teach(int Num);
int m_NeuroCount;
Neuron m_Neuro[NEUROCOUNTMAX];
};
|
Каждый нейрон имеет 3 входа, куда подаются интенсивности компонент цвета.
(R,G, B) в диапазоне (0 - 1).
Всего нейронов 8, по количеству цветов в выходном
множестве. В результате работы сети на выходе каждого нейрона формируется сигнал
в диапазоне (0 - 1), который означает вероятность того что на входе этот цвет.
Выбираем максимальный и получаем ответ.
Нейроны имеют сигмоидную функцию активации
ActiveSigm(). Функция ActiveSigmPro(),
производная от сигмоидной функции активации используется для обучения нейронной
сети методом обратного распространения.
В первой строчке выведены интенсивности цветов. ниже таблица весовых
коэффициентов (4 шт. ). В последнем столбце значение на выходе нейронов.
Меняем цвет, выбираем из списка правильный ответ, кнопкой
Teach вызываем функцию обучения. AutoTeach вызывает процедуру автоматического
обучения, 1000 раз, случайный цвет определяется по формуле из решения номер 2, и
вызывается функция обучения.
скачать
исходный код и программу нейронной сети
|