Лабораторная работа №1.
Классификация образов с помощью искусственной нейронной сети (ИНС).
Цель работы: знакомство с архитектурой и способами применения нейронных сетей прямого распространения сигналов.
Задача: построить и научить нейронную сеть распознавать буквы алфавита по их графическим изображениям.
Работа состоит из следующих этапов:
1. Загрузка и обработка графического файла с изображениями букв.
2. Представление графической информации в виде пригодной для обработки ИНС.
3. Построение и обучение ИНС с различными параметрами.
4. Выбор и обоснование оптимальной сети.
5. Оценка работы ИНС на тестовом множестве.
Загрузка и обработка графического файла с изображениями букв.
Нашей целью является распознавание образов с применением нейросетевых технологий. Под образами представим символы русского алфавита, сохраненные в графическом файле.
Рис.1 – Символы русского алфавита
Представление графической информации в виде пригодной для обработки ИНС.
ИНС представляет собой цифровую систему обработки информации, поэтому текстовые данные должны быть представлены в виде цифрового кода. Программа разрабатывается в среде GNUOctave.
При вводе команды Edit появляется окно, куда и будем писать код программы. Файл необходимо сохранить с расширением (*.m) в одну папку с графическим файлом созданным ранее. Чтение данных из указанного файла осуществляется за счет использования оператора imread(). В данном случаем в скобках укажем полный путь к графическому файлу-алфавиту.
Производим кодировку входов и выходов:
if(A(:,NPS)==1)
NPS=NPS+1; #буквы нет
else
B=A(:,NPS:NPS+9); #изображение отдельной буквы
B=reshape(B,1,100);
X=cat(1,X,B);
NPS=NPS+10;
end
Нормировка. Предварительно округлив все значения в полученном массиве данных до ближайшего целого round(А), добьемся замены отображения белого цвета. Обычно белый цвет отображается как - 255, черный – 0. Для простоты обработки данных 255 заменим на 1, разделив все исходные значения матрицы на 255.
A=imread('alfa2.bmp');
A=round(A);
A=A./255
X=zeros(0,100); #создание массивов входов (пустой)
NPS=1; #номер просматриваемого столбца
[rA,cA]=size(A); #сА-количество столбцов А
while(NPS<=cA)
Выделение символов и запись в массив. В начале необходимо организовать поиск в массиве столбца, где начинается символ (то есть ищем нули), затем записать в новую матрицу 10 столбцов начиная с текущего. Размер новой матрицы получится 10х10. Далее преобразуем ее в вектор-столбец и записываем ее в массив Х, присоединив к ней справа матрицу В. Для этого воспользуемся циклом For, который позволит повторить эту операцию до конца файла. В итоге в каждом столбце матрицы X будет записано цифровое отображение графического символа.
Построение и обучение ИНС с различными параметрами.
Создание обучающих примеров с искажением символов. Так как изображения символов на бумажном носителе могут быть искажены при сканировании, то необходимо искусственно внести помехи в изображение («шум»). Воспользуемся наиболее простым способом - инвертирование цвета пикселя найденного случайным образом. В нашем случае цифровое отображение графического символа размещено в одном столбце матрицы X, поэтому необходимо получить случайное число от 1 до 100 и в этой строке инвертировать значение. Для одного символа рекомендуется повторить эту процедуру желательно 10 раз, но мы положим k=3, тем самым создаем новую матрицу Xv, где один столбец из матрицы X будет иметь 3 искаженных отображений на 1 неискаженный. Новый массив будет являться набором входных обучающих примеров. Отобразить это в программе можно следующим образом:
# Запуск файла
A=imread('alfa2.bmp');
A=round(A);
A=A./255
X=zeros(0,100); #создание массивов входов (пустой)
NPS=1; #номер просматриваемого столбца
[rA,cA]=size(A); #сА-количество столбцов А
while(NPS<=cA)
if(A(:,NPS)==1)
NPS=NPS+1; #буквы нет
else
B=A(:,NPS:NPS+9); #изображение отдельной буквы
B=reshape(B,1,100);
X=cat(1,X,B);
NPS=NPS+10;
end
end
Выбор и обоснование оптимальной сети.
Количество нейронов во входном слое выбираем равное 100, так как каждая буква состоит из 100 пикселей. В скрытом слое выбираем 40 нейронов, так как он состовляет 30-50% от входного слоя. В выходном слое выбираем 31 нейрон, так как в алфавите 31 буква.
# Создание искусственной нейронной сети
net=mlp(100,40,31,'softmax');
Обучение нейронной сети:
error=1000;
E=0.01; #требуемый уровень энергии ошибки
N=0; #счетчик эпох
while ((error>E)&&(N<=1000))
[net,error]=mlptrain(net,X,Y,10);
N=N+10;
error #вывод на экран
end
E=0.001;
while ((error>E)&&(N<=2000))
[net,error]=mlptrain(net,Xv,Yv,10);
N=N+10;
error
end
Произвели тестирование нейронной сети с различными функциями активации: linear, logistic, softmax. Получили данные о количестве эпох и уровню энергии ошибки, представленные в таблице 1.
Таблица 1. Функции активации
Функция активации | N | error |
Linear | 0,34880 | |
Logistic | 0,0009792 | |
Softmax | 0,00087108 |
Исходя из данных представленных в таблице 1 видно, что сеть с функцией активации softmax является оптимальной, потому что сеть имеет наименьшее количество эпох обучения и наименьший уровень энергии ошибки.