Использование Neural Network Pattern Recognition Tool
В задаче распознавания образов входные образы представляют собой векторы, компоненты которых являются признаками распознаваемых объектов. Признаки должны быть представлены в виде чисел. Числовые признаки масштабируются. В случае бинарных признаков типа "истина" и "ложь" "ложь" кодируется как "-1" или "0", а "истина" – как "1". Для кодирования неупорядоченных качественных переменных используется двоичный вектор из
компонентов. Первая категория кодируется как
, вторая, соответственно —
и т. д., вплоть до
‑ой категории:
. (Можно использовать биполярную кодировку, в которой нули заменяются на "-1"). Упорядоченные качественные переменные имеют отношение порядка между состояниями. Однако кодирование их разными значениями одного входного сигнала неразумно из-за того, что расстояние между состояниями не определено, а такое кодирование эти расстояния задает явным образом. Поэтому, упорядоченные частные признаки рекомендуется кодировать в виде двоичных векторов, имеющих стольких компонентов, сколько состояний у переменной. Но, в отличие от неупорядоченных переменных, необходимо накапливать число единичных компонентов. Например, если состояния качественной переменной упорядочены следующим образом:
, то состоянию
соответствует вектор
, состоянию
соответствует вектор
, состоянию
соответствует вектор
. Таким образом, наличие качественных признаков приводит к появлению во входных векторах подвекторов, построенных описанными способами.
Выходные векторы сети кодируются как неупорядоченные качественные переменные. Если сеть разделяет входные векторы на два класса, то достаточно иметь один выход сети, принимающий значения "истина" или "ложь".
Пакет Neural Networks Toolbox включает инструмент с графическим интерфейсом. Для запуска инструмента в командном окне задаем команду:
>> nnstart
В результате появляется стартовое окно (рис. 2.5)
Рис. 2.5. Стартовое окно
В окне выбираем кнопку Pattern Recognition app и появляется окно приглашения (рис. 2.6). Можно сразу открыть окно приглашения, минуя стартовое окно, если задать команду
>> nprtool
Можно на вкладке APPS MATLAB выбрать кнопку — Neural Net Pattern Recognition.
Рис. 2.6. Окно приглашения
MATLAB приглашает создать двухслойную сеть прямого распространения с одним скрытым слоем и выходным слоем. В скрытом слое используется сигмоидальная функция активации, в выходном слое — функция softmax
,
где — выход
‑го нейрона,
— выход адаптивного сумматора
‑го нейрона.
Суммирование ведется по всем нейронам слоя сети. Такая функция обеспечивает сумму выходов слоя, равную единице при любых значениях сигналов адаптивных сумматоров данного слоя. Это позволяет трактовать выход как вероятность событий, совокупность которых образует полную группу.
В качестве алгоритма обучения используется метод обратного распространения ошибки на основе масштабируемого метода сопряженных градиентов.
В окне приглашения нажимаем Next и открываем окно выбора данных Select Data(рис. 2.7).
Рис. 2.7. Окно выбора данных
Кнопки позволяет выбрать файлы входных и целевых (выходных) данных для обучения. С помощью радиокнопок можно выбрать являются ли образцы (Samples are) столбцами матрицы (Matrix columns) или строками матрицы (Matrix rows). Кнопка Load Example Data Set позволяет выбрать готовые демонстрационные примеры. Выбираем эту кнопку. Открывается окно выбора набора данных распознавания Pattern Recognition Data Set Chooser (рис. 2.8).
Рис. 2.8. Окно выбора набора данных
При решении задачи классификации и распознавания образов доступны следующие наборы данных (все имеющиеся наборы данных можно просмотреть командой help nndatasets):
- Simple Classes — входной массив содержит 1000 двухэлементных векторов, каждый из которых относится к одному из 4 классов.
- Iris Flowers — распознавание сорта цветка ириса.
- Breast Cancer — классификация опухоли как доброкачественной либо злокачественной в зависимости от характеристик образцов биопсии.
- Types of Glass —классификация стекла либо как оконного либо неоконного. Thyroid — классификация пациентов по состоянию щитовидной железы.
- Wine Vintage —классификация вин трех винодельческих предприятий Италии на основе составляющих, найденных с помощью химического анализа.
В правой половине окна (Description) приводится описание каждого набора данных и источник, откуда взяты данные. Выберем задачу распознавания трех сортов цветов ириса (это известная в математической статистике задача "Ирисы Фишера"). Цветы будут распознаваться по следующим признакам:
1. Длина чашелистика в см.
2. Ширина чашелистика в см.
3. Лепестковая длина в см.
4. Лепестковая ширина в см.
Выбрав Iris Flowers, нажимаем кнопку Import. Происходит возврат в окно Select Data (рис. 2.7) и можно изменить выбор набора данных. Если не надо изменять набор, то нажимаем кнопку Next и переходим в окно Validation and Test Data window(рис. 2.9), которое определяет распределение набора данных между обучающим набором (Training), проверочным набором (Validation), которое используются, чтобы оценить обобщающие свойства сети и остановить обучение, когда обобщение прекращает улучшаться и тестовым множеством (Testing), не оказывающим влияния на обучение, но служащим для проверки на данных, которые не использовались в обучении сети.
Рис. 2.9. Окно Validation and Test Data
Оставим распределение данных без изменения и нажмем кнопку Next. Попадаем в окно выбора архитектуры сети Network Architecture (рис. 2.10)
Рис. 2.10. Окно архитектуры сети
Стандартная сеть, которая используется для распознавания образов, является сетью прямого распространения с двумя слоями и с сигмоидальной функцией активации в первом слое и softmax функцией в выходном слое. По умолчания число нейронов в скрытом слое равно 10 (это число можно изменить, задавая параметр Number Hidden Neurons). Число нейронов выходного слоя равно в нашем примере трем, так как входные данные необходимо разделить на три категории.
Оставляем параметры сети без изменения и нажимаем кнопку Next. В результате переходим к окну обучения сети Train Network (рис. 2.11).
Рис. 2.11. Окно обучения сети
В данный момент в этом окне доступна только кнопка обучения Train, нажимаем ее и переходим в окно процесса обучения сети Neural Network Training (рис. 2.12). Одновременно появляется окно обучения сети (рис. 2.13), позволяющее повторить обучение сети и вывести некоторые графики.
Рис. 2.12. Окно процесса обучения сети
Рис. 2.13. Вид окно обучения сети после завершения обучения
Во вновь появившемся окне обучения (рис. 2.13) выводятся результаты обучения: для обучающего, проверочного и тестового множеств выводятся минимальные значения кросс‑энтропии (CE) и процент ошибок — доля неправильно классифицированных примеров. Из этого окна можно вывести графики, характеризующие качество обучения. Можно повторить обучение (кнопка Retrain),
По кнопке Performance окна процесса обучения можно увидеть график обучения сети (рис. 2.14), показывающий поведение ошибки обучения на обучающем, контрольном и тестовом множествах. В качестве функционала ошибки в этом случае используется кросс‑энтропия (перекрестная энтропия). Ошибка всех выходов сети по всему набору обучающих примеров тогда будет иметь вид
,
где — требуемое (целевое) значение выхода
сети при подаче примера
,
— реальное значение выхода
сети при подаче примера
,
— число выходов сети,
— число примеров в обучающей выборке.
Рис. 2.14. График обучения сети распознавания
Графики состояния обучения (Training State) (рис. 2.15) показывают изменение градиента функционала ошибки и величины ошибки на проверочном множестве в процессе обучения.
Рис. 2.15. Графики состояния обучения
Гистограмма ошибок (Error Histogram), построенная для 20 столбцов, (рис. 2.16) показывает, что ошибки имеют небольшую величину и распределены в узком интервале.
Рис. 2.16. Гистограмма ошибок
Матрица несоответствий (ошибок) сети (Confusion) (рис. 2.17) — матрицы, в которой для каждого класса наблюдений приводятся результаты отнесения наблюдений к тому или иному классу. Английское название (confusion — путаница) возникло потому, что матрица позволяет видеть, путает ли классификатор классы. Столбцы матрицы соответствуют предсказанным классам, а строки — фактическим классам. Матрицы несоответствия построены для трех множеств данных: обучающего множества (Training Set), контрольного множества (Validation Set), тестового множества (Test Set) и суммарного множества, состоящего из этих трех множеств. Рассмотрим Training Confusion Matrix (рис. 2.17). 37 объекта первого типа (35,6% от общего объема обучающей выборки) были распознаны как объекты первого типа. Как объекты второго или третьего типа данные объекты не распознавались. Процент правильно распознанных объектов первого типа равен 100%, ошибка распознавания объектов второго типа равна 0,0%.
Рис. 2.17. Матрица несоответствий (ошибок) сети
Аналогично ошибка распознавания объектов второго типа составила 3,3%, объектов третьего типа — 2,7%. Последняя строка матрицы показывает, что из всех объектов, классифицированных как объекты первого класса, 100% составляют объекты первого класса. Ошибка классификации объектов второго класса составила 3,3%, третьего класса — 2,7%. В целом неправильно классифицировано 1,9% объектов. Суммарная матрица (All) показывает ошибки распознавания на всех трех множествах.
Показателем качества классификаторов являются характеристические кривые обнаружения (Receiver Operating Characteristic — ROC) (рис. 2.18).
Рис. 2.18. Характеристические кривые обнаружения
Нейросетевой классификатор относит выход сети к одному из классов в зависимости от того, превышает выходной сигнал некоторое пороговое значение — точку отсечения (Cut-Off Point) — порогового значения, разделяющего классы [5].
Чтобы построить ROC-кривую, нужно изменять порог отсечения в интервале от 0 (или от -1) до 1 с заданным шагом. Для каждого класса классификатора с некоторым шагом изменяются пороговые значения. Для каждого порогового значения вычисляются два значения: доля истинно положительных примеров (True Positives Rate—TPR) — количество выходов, больших или равных порогу, разделенное на количество единичных целевых значений (подразумевается, что целевые значения кодируются нулем и единицей); доля ложно положительных примеров (False Positives Rate—FPR) — количество выходов, меньших, чем порог, разделенное на количество нулевых целевых значений. Строится график зависимости TPR от FPR при разных значениях порога. График часто дополняют прямой , которая соответствует "бесполезному" классификатору, когда результат получается случайным угадыванием.
Для идеального классификатора график ROC-кривой проходит через верхний левый угол, где доля истинно положительных случаев составляет 100% или 1.0 (идеальная чувствительность), а доля ложно положительных примеров равна нулю. Поэтому чем ближе кривая к верхнему левому углу, тем выше предсказательная способность модели. Наоборот, чем меньше изгиб кривой и чем ближе она расположена к диагональной прямой, тем менее эффективна модель. Для нашего примера классификатор практически идеален.
При неудовлетворительных показателях классификатора можно повторно обучить сеть — кнопка Retrain в окне обучения сети после завершения обучения (рис. 2.13).
При удовлетворительных результатах можно перейти к оценке сети, нажав кнопку Next в окне обучения сети после завершения обучения (рис. 2.13). Появляется окно оценки сети (Evaluate Network) (рис. 2.19).
Рис. 2.19. Окно оценки сети
Левая часть окна предлагает повторить для улучшения производительности (Iterate for improved performance):
- обучение (кнопка Train Again);
- увеличить размер сети — по кнопке Adjust Network Sizeпроисходит переход к окну (рис. 2.10);
- использовать бо́льший набор данных — по кнопке Import Larger Data Set происходит переход к окну выбора данных (рис. 2.8).
В правой части окна предлагается провести дополнительные испытания (Optionally perform additonal tests), выбрав входные и целевые значения.
Для завершения работы с сетью нажимаем на кнопку Next и переходим в окно развертывания Deploy Solution (размещения) решения (рис. 2.20).
Рис. 2.20. Окно развертывания решения
В этом окне можно сгенерировать функции для MATLAB Compiler, позволяющего создавать независимые приложения (.exe), компоненты и библиотеки (.dll), и для MATLAB Builder — пакетов, расширяющих возможности MATLAB Compiler средствами генерации компонентов различных фреймворков, например, Microsoft .NET Framework. Возможна генерация функции для MATLAB Coder, генерирующего автономный C и C++ код из кода MATLAB. Возможно моделирование сети в системе Simulink и генерация графической диаграммы сети как в окне архитектуры сети (рис. 2.10).
В последнем окне — окне сохранения результатов (рис. 2.21) можно сохранить результаты, сгенерировать программу, воспроизводящую создание сети, сгенерировать диаграмму сети и диаграмму сети в пакете Simulink.
Нажав кнопку Simple Script или Advanced Script можно сгенерировать простой или усовершенствованный код MATLAB, воспроизводящий действия Neural Network Pattern Recognition Tool. Усовершенствованный код отличается более детальным заданием параметров функций. В простом коде многие параметры устанавливаются по умолчанию.
Рис. 2.21. Окно сохранения результатов
Можно сохранить отмеченные результаты в рабочем пространстве MATLAB. При этом рекомендуется заменить имена, присваемые по умолчанию, на свои имена.
Для завершения работы с пакетом Neural Networks Toolbox необходимо нажать кнопку Finishв окне сохранения результатов.
Задания
1. Проделайте все примеры, приведенные в работе.
2. Решите задачу распознавания образов для одного из указанных преподавателем тестовых наборов данных, имеющихся в MATLAB. Проанализируйте полученные результаты.
3. Исследуйте влияние структуры сети на точность распознавания и число циклов обучения.
Использование команд
Сгенерированные в окне сохранения результатов (рис. 2.21) простой код (Simple Script) и усовершенствованный код (Advanced Script) сохранены в библиотеке Samples примеров лабораторного практикума под именами recognition_simple.m и recognition_advanced.m. Программа recognition_simple_rus.m содержит переведенные на русский язык комментарии и необходимые дополнения (сгенерированная программа recognition_simple.m требует предварительной загрузки исходных данных):
% Решение задачи распознавания образов с помощью нейронной сети
% Скрипт сгенерирован NPRTOOL
% С некоторыми добавлениями
% Created Sun Dec 01 23:52:39 GMT+04:00 2013
%
% Этот сценарий предполагает, эти переменные определены:
%
% irisInputs - входные данные.
% irisTargets - целевые данные.
%x = irisInputs;
%t = irisTargets;
% Добавлены закрытия окон и очистка
close all
clc
clear
% Вызов функции загрузки исходных данных
% В сгенерированной программе отсутствует, т.к. предполагается, что
% данные уже помещены в рабочее пространство
[x,t] = iris_dataset;
% Создание сети распознавания образов
hiddenLayerSize = 10; % Размер скрытого слоя
% Создание сети net
net = patternnet(hiddenLayerSize);
% Настройка деления данных на обучающие, проверочные и тестовые
net.divideParam.trainRatio = 70/100; % Обучающие данные
net.divideParam.valRatio = 15/100; % Проверочные данные
net.divideParam.testRatio = 15/100; % Тестовые данные
% Обучение сети
[net,tr] = train(net,x,t);
% Тестирование сети
y = net(x);
e = gsubtract(t,y);% Вычисление матрицы ошибок
% Преобразование компонентов целевых векторов в номера классов
tind = vec2ind(t);
% Преобразование компонентов выходных векторов в номера классов
yind = vec2ind(y);
% Вычисление ошибки сети как отношения числа выходных значений, не совпавших
% с целевыми значениями,к общему числу (функция numel) целевых значений
percentErrors = sum(tind ~= yind)/numel(tind);
% % Вычисление достигнутой среднеквадратической ошибки
performance = perform(net,t,y)
% Вывод структуры сети
view(net)
% Графики
% Раскомментируйте строки, чтобы включит различные графики
% Графики могут быть построены из окна обучения сети
% График обучени сети
figure, plotperform(tr)
% График состояния обучения
figure, plottrainstate(tr)
% Вывод матрицы несоответствий
figure, plotconfusion(t,y)
% График ROC -кривой
figure, plotroc(t,y)
% Вывод гистограммы ошибок
figure, ploterrhist(e)
В программе net1_simple_rus.m добавлен вызов функции загрузки исходных данных [x,t] = iris_dataset; В сгенерированной программе этот вызов отсутствует, т.к. предполагается, что все исходные данные уже загружены в рабочее пространство.
Сеть распознавания образов создается функцией patternnet, обращение к которой имеет вид
net= patternnet(hiddenSizes,trainFcn,performFcn),
где net — имя создаваемой сети; hiddenSizes — вектор‑строка, содержащая число нейронов в каждом из скрытых слоев (первый слой считается скрытым, функция создает сеть из
слоя, считая выходной слой, в нашем примере сеть содержит только один скрытый слой); trainFcn— функция обучения в методе обратного распространения ошибки; performFcn — функция критерия качества обучения.
Функцию можно вызывать с меньшим числом параметров (можно опустить все параметры). В этом случае используются значения по умолчанию
net= patternnet(10, 'trainscg', 'crossentropy')
Здесь trainscg— модификация метода сопряженных градиентов; crossentropy — функция ошибки в форме перекрёстной энтропии.
При использовании в качестве функции ошибки перекрёстной энтропии [6, 7], минимизируется не среднеквадратичная функция ошибки сети (MSE), а перекрестная энтропия
,
где — целевое (требуемое) значение выхода сети,
— реальный выход сети.
Использование перекрестной энтропии обеспечивает бо́льшую скорость обучения сети.
Сгенерированная программа net1_advanced.m имеет вид:
% Solve a Pattern Recognition Problem with a Neural Network
% Script generated by NPRTOOL
% Created Sun Dec 01 23:54:26 GMT+04:00 2013
%
% This script assumes these variables are defined:
%
% irisInputs - input data.
% irisTargets - target data.
x = irisInputs;
t = irisTargets;
% Create a Pattern Recognition Network
hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize);
% Choose Input and Output Pre/Post-Processing Functions
% For a list of all processing functions type: help nnprocess
net.input.processFcns = {'removeconstantrows','mapminmax'};
net.output.processFcns = {'removeconstantrows','mapminmax'};
% Setup Division of Data for Training, Validation, Testing
% For a list of all data division functions type: help nndivide
net.divideFcn = 'dividerand'; % Divide data randomly
net.divideMode = 'sample'; % Divide up every sample
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% For help on training function 'trainscg' type: help trainscg
% For a list of all training functions type: help nntrain
net.trainFcn = 'trainscg'; % Scaled conjugate gradient
% Choose a Performance Function
% For a list of all performance functions type: help nnperformance
net.performFcn = 'crossentropy'; % Cross-entropy
% Choose Plot Functions
% For a list of all plot functions type: help nnplot
net.plotFcns = {'plotperform','plottrainstate','ploterrhist', ...
'plotregression', 'plotfit'};
% Train the Network
[net,tr] = train(net,x,t);
% Test the Network
y = net(x);
e = gsubtract(t,y);
tind = vec2ind(t);
yind = vec2ind(y);
percentErrors = sum(tind ~= yind)/numel(tind);
performance = perform(net,t,y)
% Recalculate Training, Validation and Test Performance
trainTargets = t .* tr.trainMask{1};
valTargets = t .* tr.valMask{1};
testTargets = t .* tr.testMask{1};
trainPerformance = perform(net,trainTargets,y)
valPerformance = perform(net,valTargets,y)
testPerformance = perform(net,testTargets,y)
% View the Network
view(net)
% Plots
% Uncomment these lines to enable various plots.
%figure, plotperform(tr)
%figure, plottrainstate(tr)
%figure, plotconfusion(t,y)
%figure, plotroc(t,y)
%figure, ploterrhist(e)
% Deployment
% Change the (false) values to (true) to enable the following code blocks.
if (false)
% Generate MATLAB function for neural network for application deployment
% in MATLAB scripts or with MATLAB Compiler and Builder tools, or simply
% to examine the calculations your trained neural network performs.
genFunction(net,'myNeuralNetworkFunction');
y = myNeuralNetworkFunction(x);
end
if (false)
% Generate a matrix-only MATLAB function for neural network code
% generation with MATLAB Coder tools.
genFunction(net,'myNeuralNetworkFunction','MatrixOnly','yes');
y = myNeuralNetworkFunction(x);
end
if (false)
% Generate a Simulink diagram for simulation or deployment with.
% Simulink Coder tools.
gensim(net);
end
Программа также требует загрузки исходных данных. В программе явно задаются параметры сети. Обратите внимание на использование функций пред- и постобработки. Этими функциями являются:
fixunknowns — заполняет пропуски данных средними значениями.
mapminmax— масштабирует данные к диапазону [-1, +1].
mapstd— преобразование данных каждой строки матрицы к нулевому среднему значению и единичному стандартному отклонению.
processpca — вычисление главных компонент строк матриц.
removeconstantrows — удаление строк, содержащих постоянные значения.
removerows — удаление строк матриц с заданными индексами.
Чтобы посмотреть и изменить функции предобработки слоя используйте свойства входов
‑го слоя сети
net.inputs{i}.processFcns
Чтобы посмотреть и изменить функции постдобработки слоя используйте свойства выходов
‑го слоя сети
net.outputs{i}.processParams
Для многослойных сетей заданные по умолчанию функции обработки ввода — removeconstantrows и mapminmax. Для выходов сети значения по умолчанию также removeconstantrows и mapminmax. В большинстве случаев нет необходимости использовать непосредственно функции пред- и постобработки, так как они являются частью объекта "Нейронная сеть" и выполняются автоматически.
В программе net1_advanced.m также присутствует генерация функций для MATLAB Builder и Coder.
Задания
1. Модифицируйте сгенерированную программу для решения задачи распознавания образов для одного из указанных преподавателем тестовых наборов данных, имеющихся в MATLAB. Проанализируйте полученные результаты.
2. Исследуйте влияние структуры сети и алгоритмов обучения на точность распознавания и число циклов обучения.