страница 1 ... страница 8 | страница 9 | страница 10 страница 11 страница 12 | страница 13 | страница 14
ЛАБОРАТОРНАЯ РАБОТА № 1. РАСПОЗНАВАНИЕ СИМВОЛОВ
Цель работы: анализ работы многослойной нейронной сети по распознаванию букв методом обратного распространения ошибки (с импульсом и адаптацией).
Демонстрационная программа пакета NNT appcr1 иллюстрирует, как распознавание символов может быть выполнено в сети с обратным распространением ошибки. Для распознавания 26 символов латинского алфавита, получаемых, например, с помощью системы распознавания, выполняющей оцифровку каждого символа в ее поле зрения, используется сеть из двух слоев, не считая входного, с n (10) нейронами в скрытом слое и p (26) нейронами в выходном (по одному на букву). Каждый символ представляется шаблоном размера 75, соответствующим пиксельной градации букв. Входной вектор соответствует набору признаков, выходной – классу образов, а скрытый слой используется для представления области знаний. Система считывания символов обычно работает не идеально и отдельные элементы символов могут оказаться искаженными. Проектируемая нейронная сеть должна точно распознать идеальные векторы входа и с максимальной точностью воспроизводить зашумленные векторы. Функция prprob формирует 26 векторов входа, каждый из которых содержит 35 элементов, называемых алфавитом. Она создает выходные переменные alphabet и targets, которые определяют массивы алфавита и целевых векторов. Массив targets задается как единичная матрица функцией eye(26). Для восстановления шаблона i-й буквы алфавита необходимо выполнить следующие операторы M-языка:
[alphabet,targets]= prprob;
ti= alphabet(:, i); letter{i}=reshape(ti, 5, 7)’;
letter{i}
Например, для определения шаблона буквы A, являющейся первым элементом алфавита, можно выполнить операторы:
[alphabet,targets]= prprob;
i=1;
ti= alphabet(:, i);
letter{i}=reshape(ti, 5, 7)’;
letter{i}
В результате будет выведено:
00100010100101010001111111000110001
На вход сети поступает вектор входа с 35 элементами, вектор выхода содержит 26 элементов, только один из которых равен единице, а остальные – нулю. Правильно функционирующая сеть отвечает вектором со значением 1 для элемента, соответствующего номеру символа в алфавите. Кроме того, сеть должна распознавать символы в условиях действия шума. Предполагается, что шум – аддитивная помеха, нормально распределенная случайная величина с математическим ожиданием, равным нулю, и среднеквадратичным отклонением, меньшим или равным 0.2. Первый слой нейронов сети используется как распределительный, суммирование в нем не производится. В качестве функций активации скрытого и выходного слоев выбрана логистическая функция. Выбор такой функции активации связан с тем, что диапазон значений этой функции определен от нуля до единицы и позволяет сформировать значения выходного вектора.
При обучении искусственной нейронной сети используется процедура обратного распространения ошибки или процедура убывания градиента. Если при обучении сети возникают затруднения, то можно увеличивать количество нейронов скрытого слоя. Наличие шумов может привести к тому, что сеть не будет формировать вектор выхода, состоящий точно из нулей и единиц. Поэтому по завершении этапа обучения выходной сигнал обрабатывается функцией compet, которая присваивает значение 1 единственному элементу вектора выхода, а всем остальным – значение 0.
Функция prprob, как отмечалось, формирует массив векторов входа alphabet размера 35Ч26 с шаблонами символов алфавита и массив целевых векторов targets:
[alphabet,targets]= prprob;
[R, Q]=size(alphabet);
[s2, Q]= size(targets);
Двухслойная нейронная сеть создается с помощью команды newff, предназначенной для описания многослойных нейронных сетей прямой передачи сигнала с заданными функциями обучения и настройки на основе метода обратного распространения ошибки, и имеющей формат:
net=newff(PR, [S1 S2 …SN],{TF1 TF2 …TFN},btf,blf,pf),
где PR – массив размера RЧ2 минимальных и максимальных значений для R векторов входа;
Si – количество нейронов в слое i;
Tfi – функция активации слоя i, по умолчанию tansig;
btf – обучающая функция, реализующая метод обратного распространения ошибки, по умолчанию trainlm;
blf – функция настройки, реализующая метод обратного распространения, по умолчанию learngdm;
pf – критерий качества обучения, по умолчанию средняя квадратичная ошибка mse.
Выходной аргумент net является объектом класса network.object многослойной нейронной сети.
В качестве метода обучения в пакете NNT применяется функция train, позволяющая установить процедуры обучения сети и настройки ее параметров и имеющая формат
[net, TR]=train(net, P, T, Pi, Ai), где входные аргументы:
net – имя нейронной сети,
P – массив входов,
T – вектор целей, по умолчанию нулевой вектор,
Pi – начальные условия на линиях задержки входов, по умолчанию нулевые,
Ai – начальные условия на линиях задержки слоев, по умолчанию нулевые; а выходные:
net – объект класса network.object после обучения;.
TR – характеристики процедуры обучения: TR.timesteps – длина последней выборки; TR.perf – значение функции качества на последнем цикле обучения. Следует отметить, что вектор целей T используется только при наличии целевых выходов, а Pi и Ai указываются только в случае динамических сетей, имеющих линии задержки на входах или в слоях.
Моделирование нейронных сетей в пакете NNT обеспечивает функция sim, имеющая формат
[Y, Pf, Af, E, perf]= sim(net, P, Pi, Ai, T),
где входные аргументы:
net – имя нейронной сети,
P – массив входов,
Pi – начальные условия на линиях задержки входов, по умолчанию нулевой вектор,
Ai – начальные условия на линиях задержки слоев, по умолчанию нулевой вектор,
T – вектор целей, по умолчанию нулевой вектор;
выходные аргументы:
Y – массив выходов,
Pf – состояния на линиях задержки входов после моделирования,
Af – состояния на линиях задержки слоев после моделирования,
E – массив ошибок,
perf – значение функционала качества.
При создании сети для распознавания букв латинского алфавита используются операторы:
s1=10;
net=newff(minmax(alphabet), [s1 s2],(‘logsig’ ‘logsig’),’traingdx’);
net.LW(2,1)=net.LW(2,1)*0.01;
net.b(2)=net.b(2)*0.01
Элементы матрицы начальных весов и смещений скрытого слоя после создания сети умножаются на 0.01 для избежания дальнейших действий с их большими значениями.
Чтобы создать нейронную сеть, которая может обрабатывать зашумленные векторы входа, следует выполнить обучение сети как на идеальных, так и на зашумленных векторах. Сначала сеть обучается на идеальных векторах, пока не будет обеспечена минимальная сумма квадратов погрешностей. Затем сеть обучается на 10 наборах идеальных и зашумленных векторов. Две копии свободного от шума алфавита используются для того, чтобы сохранить способность сети классифицировать идеальные векторы входа. Оказывается, что после того как описанная сеть обучилась классифицировать сильно зашумленные векторы, она потеряла способность правильно классифицировать некоторые векторы, свободные от шума. Обучение выполняется с помощью функции traingdx, которая реализует метод обратного распространения ошибки с импульсом и адаптацией к темпу обучения. Сеть первоначально обучается в отсутствие шума с максимальным числом циклов или эпох обучения 5000 либо до достижения допустимой средней квадратичной погрешности, равной 0.1. При обучении с шумом максимальное число циклов обучения сокращается до 300, а допустимая погрешность увеличивается до 0.6.
netn=net;
netn.trainParam.goal=0.6;
netn.trainParam.epochs=300;
T=[targets targets targets targets];
for pass=1:10
P=[alphabet, alphabet, (alphabet+randn(R,Q)*0.1),… (alphabet+randn(R,Q)*0.2)];
[netn, tr]=train(netn,P,T);
end
Алгоритм обучения включает следующие шаги:
-
Выбрать очередной входной образ из обучающего множества и подать входной вектор на вход сети.
-
Вычислить выход сети.
-
Вычислить разность между выходом сети и требуемым выходом (целевым вектором входного образа).
-
Откорректировать веса сети так, чтобы минимизировать ошибку.
-
Повторить шаги с 1 по 4 для каждого вектора обучающего множества до тех пор, пока ошибка на всем множестве не достигнет приемлемого уровня.
Изменение весов осуществляется с использованием модифици-рованного дельта-правила. Целевые значения для скрытых слоев не вводятся, а только для выходных.
Каждая итерация процедуры обучения включает два «прохода»: «проход» вперед, на котором получают множество выходов (шаги 1, 2) и «проход» назад, на котором сигнал ошибки распространяется обратно по сети и используется для изменения весов (шаги 3, 4).
Полученный выходной вектор сравнивается с целевым. Если они совпадают, обучение не происходит. В противном случае вес корректируется на величину:
,
где изменение в силе связи для p-й обучающей пары пропорционально произведению сигнала ошибки jp j-го нейронного элемента в выходном слое и выходного сигнала нейрона скрытого слоя i, посылающего сигнал по этой связи. Определение ошибки является рекурсивным процессом, который начинается с выходных слоев:
,
где – производная функции преобразования, для логистической функции , – желаемое и действительное значения выходного сигнала j-го нейронного элемента;
– коэффициент скорости обучения (обычно от 0.01 до 1).
Сигнал ошибки для скрытого слоя определяется через сигнал ошибки нейронов, с которыми соединен его выход:
.
Производная логистической функции принимает значение 0 при или и достигает максимального значения при . Кроме этого, при различных весах выходные сигналы нейронных элементов не могут достичь значений 0 или 1, поэтому за ноль обычно принимают значения, а за 1 – значения .
Обобщенное дельта-правило достаточно хорошо обеспечивает минимизацию общей ошибки сети методом градиентного спуска в пространстве весов. Общая ошибка функционирования сети
.
Обучение продолжается до тех пор, пока в процессе обучения она не уменьшится до требуемого значения. Для учета изменения веса на предыдущем шаге в правило обучения вводится экспоненциально затухающий множитель (импульс):
.
В методе убывания градиента с импульсом, как правило, первоначально =0.9. После создания двух сетей, первая из которых обучена на идеальных векторах входа, а вторая – на зашумленных, осуществляется тестирование сети на 100 зашумленных векторах входа. Шум с нулевым средним значением и изменяющимся от 0 до 0.5 с шагом 0.05 среднеквадратичным отклонением нормально распределенной случайной величины добавляется к идеальным векторам входа. Выходной сигнал обрабатывается функцией compet для того, чтобы выбрать только один из 26 элементов вектора выхода.
Сети имеют малые погрешности, если среднеквадратичное значение шума находится в пределах от 0 до 0.05. Когда к векторам добавляется шум со среднеквадратичным отклонением 0.2, то в обеих сетях появились заметные ошибки. При этом погрешности нейронной сети, обученной на зашумленных векторах, на 3 – 4 % ниже, чем для сети, обученной на идеальных входных последовательностях.
Если необходима более высокая точность распознавания, сеть может быть обучена с использованием большего количества нейронов в скрытом слое. Можно также увеличить размер векторов, чтобы пользоваться шаблоном с более мелкой сеткой, например, 14Ч10 точек вместо 7Ч5. Для вывода распознанного символа после моделирования сети с массивом выходов A можно использовать операторы:
answer=find(compet(A)==1);
plotchar(alphabet(:,answer)) %Вывод распознанного символа.
Порядок выполнения работы:
-
Изучить prprob, appcr1MATLAB\toolbox\nnet\nndemos, newff, traingdx, learngdm, MATLAB\toolbox\nnet\nnet.
-
Построить нейронную сеть для распознавания букв латинского алфавита, используя функцию newff – инициализации сети прямой передачи сигнала.
-
Обучить сеть, используя функцию traingdx.
-
Распознать несколько букв, зашумленных символов (функция sim).
Форма отчета:
-
Описание исходной задачи.
-
Описание архитектуры сети с указанием параметров.
-
Листинг программы с комментариями.
-
Результаты обучения.
-
Обоснование правильности определения параметров сети.
страница 1 ... страница 8 | страница 9 | страница 10 страница 11 страница 12 | страница 13 | страница 14
|