exponenta event banner

Классифицировать шаблоны с неглубокой нейронной сетью

В дополнение к функциональному подбору нейронные сети также хорошо распознают паттерны.

Например, предположим, что вы хотите классифицировать опухоль как доброкачественную или злокачественную, исходя из однородности размера клеток, толщины комков, митоза и т.д. У вас есть 699 примеров случаев, для которых у вас есть 9 элементов данных и правильная классификация как доброкачественные или злокачественные.

Как и в случае с функциональным подбором, существует два способа решения этой проблемы:

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

Определение проблемы

Чтобы определить проблему распознавания образов, упорядочьте набор Q входных векторов в виде столбцов в матрице. Затем расположите другой набор Q целевых векторов так, чтобы они указывали классы, которым присвоены входные векторы (подробное описание форматирования данных для статических данных и данных временных рядов см. в разделе «Структуры данных»).

Когда существует только два класса; каждому скалярному целевому значению присваивается значение 0 или 1, указывающее, какому классу принадлежит соответствующий входной сигнал. Например, можно определить двухклассную проблему исключения или классификации следующим образом:

inputs  = [0 1 0 1; 0 0 1 1];
targets = [1 0 0 1; 0 1 1 0];

Когда входные данные должны быть классифицированы на N различных классов, целевые векторы имеют N элементов. Для каждого целевого вектора один элемент равен 1, а другие равны 0. Например, следующие линии показывают, как определить проблему классификации, которая делит углы куба 5 на 5 на 5 в три класса:

  • Начало координат (первый входной вектор) в одном классе

  • Угол, наиболее удаленный от начала координат (последний входной вектор) во втором классе

  • Все остальные моменты в третьем классе

    inputs  = [0 0 0 0 5 5 5 5; 0 0 5 5 0 0 5 5; 0 5 0 5 0 5 0 5];
    targets = [1 0 0 0 0 0 0 0; 0 1 1 1 1 1 1 0; 0 0 0 0 0 0 0 1];
    

Проблемы классификации, связанные только с двумя классами, могут быть представлены в любом формате. Цели могут состоять либо из скалярных 1/0 элементов, либо из двухэлементных векторов, при этом один элемент равен 1, а другой элемент равен 0.

В следующем разделе показано, как обучить сеть распознавать шаблоны с помощью приложения для распознавания нейронных сетевых шаблонов. nprtool. В этом примере используется набор данных о раке, поставляемый с панелью инструментов. Этот набор данных состоит из 699 девятиэлементных входных векторов и двухэлементных целевых векторов. Есть два элемента в каждом целевом векторе, потому что есть две категории (доброкачественные или злокачественные), связанные с каждым входным вектором.

Использование приложения нейронной сети для распознавания образов

  1. Откройте приложение Neural Network Pattern Recognition с помощью nprtool.

    nprtool

  2. Нажмите кнопку Далее, чтобы продолжить. Откроется окно Выбрать данные (Select Data).

  3. Щелкните Загрузить (Load) Пример (Example) Набор данных (Data Set). Откроется окно Выбор набора данных распознавания массива.

  4. Выберите «Рак молочной железы» и нажмите «Импорт». Вернитесь к окну Выбор данных.

  5. Нажмите кнопку Next (Далее), чтобы перейти к окну Validation and Test Data (Проверка и проверка данных).

    Каждый набор проверочных и тестовых данных составляет 15% от исходных данных. При этих настройках входные векторы и целевые векторы будут случайным образом разделены на три набора следующим образом:

    • 70% используются для обучения.

    • 15% используются для проверки того, что сеть обобщается, и для прекращения обучения перед переоборудованием.

    • Последние 15% используются как полностью независимый тест обобщения сети.

    (Для получения дополнительной информации о процессе разделения данных см. раздел «Разделение данных».)

  6. Нажмите кнопку Далее.

    Стандартная сеть, используемая для распознавания образов, представляет собой двухуровневую сеть прямой связи с сигмоидной передаточной функцией на скрытом уровне и программной передаточной функцией на выходном уровне. Количество скрытых нейронов по умолчанию равно 10. Вы можете вернуться и увеличить это число, если сеть работает не так хорошо, как вы ожидаете. Количество выходных нейронов устанавливается равным 2, что равно количеству элементов в целевом векторе (количеству категорий).

  7. Нажмите кнопку Далее.

  8. Щелкните Поезд (Train).

    Обучение продолжается в течение 55 итераций.

  9. На панели Графики (Plots) щелкните Путаница (Confusion) в приложении нейронной сети Распознавание шаблонов (Neural Network Pattern Recognition App

    На следующем рисунке показаны матрицы путаницы для обучения, тестирования и проверки, а также три вида данных вместе взятых. Сетевые выходы очень точны, как видно по большому количеству правильных откликов в зеленых квадратах и по малому количеству неправильных откликов в красных квадратах. Нижние правые синие квадраты иллюстрируют общую точность.

  10. Постройте график кривой рабочей характеристики приемника (ROC). На панели Графики (Plots) щелкните Рабочая характеристика приемника (Receiver Operating Characteristic) в приложении нейронной сети Распознавание шаблонов (Neural Network Pattern Recog

    Цветные линии на каждой оси представляют кривые ROC. Кривая ROC представляет собой график истинной положительной скорости (чувствительности) по сравнению с ложноположительной скоростью (1 - специфичность) при изменении порога. Идеальный тест показал бы точки в левом верхнем углу, со 100% чувствительностью и 100% специфичностью. Для этой проблемы сеть работает очень хорошо.

  11. В приложении Neural Network Pattern Recognition App нажмите кнопку Далее, чтобы оценить сеть.

    На этом этапе можно протестировать сеть на соответствие новым данным.

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

  12. Если производительность сети удовлетворительна, нажмите кнопку Далее.

    Эта панель используется для создания функции MATLAB или диаграммы Simulink для моделирования нейронной сети. Можно использовать сгенерированный код или диаграмму, чтобы лучше понять, как нейронная сеть вычисляет выходные данные из входных данных, или развернуть сеть с помощью инструментов компилятора MATLAB и других инструментов генерации кода MATLAB.

  13. Нажмите кнопку Далее. Используйте кнопки на этом экране для сохранения результатов.

    • Можно щелкнуть Простой сценарий (Simple Script) или Расширенный сценарий (Advanced Script), чтобы создать код MATLAB ®, который можно использовать для воспроизведения всех предыдущих шагов из командной строки. Создание кода MATLAB может быть полезно, если вы хотите узнать, как использовать функциональность командной строки панели инструментов для настройки процесса обучения. В разделе Использование функций командной строки более подробно рассматриваются созданные сценарии.

    • Можно также сохранить сеть как net в рабочей области. На нем можно выполнить дополнительные тесты или поставить его для работы на новых входах.

  14. После сохранения результатов нажмите кнопку Готово.

Использование функций командной строки

Самый простой способ научиться использовать функции командной строки панели инструментов - это создавать сценарии из GUI, а затем изменять их для настройки сетевого обучения. Например, посмотрите на простой сценарий, который был создан на шаге 14 предыдущего раздела.

% Solve a Pattern Recognition Problem with a Neural Network
% Script generated by NPRTOOL
%
% This script assumes these variables are defined:
%
%   cancerInputs - input data.
%   cancerTargets - target data.

inputs = cancerInputs;
targets = cancerTargets;

% Create a Pattern Recognition Network
hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize);


% Set up Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;


% Train the Network
[net,tr] = train(net,inputs,targets);

% Test the Network
outputs = net(inputs);
errors = gsubtract(targets,outputs);
performance = perform(net,targets,outputs)

% View the Network
view(net)

% Plots
% Uncomment these lines to enable various plots.
% figure, plotperform(tr)
% figure, plottrainstate(tr)
% figure, plotconfusion(targets,outputs)
% figure, ploterrhist(errors)

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

  1. Сценарий предполагает, что входные и целевые векторы уже загружены в рабочую область. Если данные не загружены, их можно загрузить следующим образом:

    [inputs,targets] = cancer_dataset;
    
  2. Создайте сеть. Сеть по умолчанию для проблем фитинга функции (или регрессии), patternnet, является сетью прямой связи с функцией передачи по умолчанию tan-sigmoid на скрытом уровне и функцией передачи softmax на выходном уровне. Вы назначили десять нейронов (несколько произвольных) одному скрытому слою в предыдущем разделе.

    • Сеть имеет два выходных нейрона, потому что существует два целевых значения (категории), связанных с каждым входным вектором.

    • Каждый выходной нейрон представляет категорию.

    • Когда входной вектор соответствующей категории применяется к сети, соответствующий нейрон должен производить 1, а другие нейроны должны выводить 0.

    Для создания сети введите следующие команды:

    hiddenLayerSize = 10;
    net = patternnet(hiddenLayerSize);
    

    Примечание

    Выбор сетевой архитектуры для проблем распознавания образов следует аналогичным рекомендациям для проблем функциональной подгонки. Большее количество нейронов требует большего количества вычислений, и они имеют тенденцию перевыполнять данные, когда число установлено слишком высоким, но они позволяют сети решать более сложные задачи. Большее количество уровней требует большего количества вычислений, но их использование может привести к более эффективному решению сложных проблем в сети. Чтобы использовать несколько скрытых слоев, введите размеры скрытых слоев в качестве элементов массива в patternnet команда.

  3. Настройка разделения данных.

    net.divideParam.trainRatio = 70/100;
    net.divideParam.valRatio   = 15/100;
    net.divideParam.testRatio  = 15/100;
    

    При этих настройках входные векторы и целевые векторы будут разделены случайным образом: 70% используются для обучения, 15% для проверки и 15% для тестирования.

    (Для получения дополнительной информации о процессе разделения данных см. раздел «Разделение данных».)

  4. Обучение сети. В сети распознавания образов используется масштабированный сопряженный градиент по умолчанию (trainscg) алгоритм обучения. Для обучения сети введите следующую команду:

    [net,tr] = train(net,inputs,targets);
    

    Во время обучения, как и при функциональном подборе, открывается окно обучения. В этом окне отображается ход обучения. Чтобы прервать обучение в любой момент, щелкните Остановить обучение.

    Это обучение остановлено, когда ошибка проверки увеличилась для шести итераций, которые произошли в итерации 24.

  5. Протестируйте сеть. После обучения сети ее можно использовать для вычисления сетевых выходов. Следующий код вычисляет сетевые выходы, ошибки и общую производительность.

    outputs = net(inputs);
    errors = gsubtract(targets,outputs);
    performance = perform(net,targets,outputs)
    
    performance =
    
        0.0307
    
    

    Вычислить производительность сети можно также только на тестовом наборе, используя показатели тестирования, которые находятся в учебной записи.

    tInd = tr.testInd;
    tstOutputs = net(inputs(:,tInd));
    tstPerform = perform(net,targets(:,tInd),tstOutputs)
    
    tstPerform =
    
        0.0257
    
    
  6. Просмотрите схему сети.

    view(net)
    

  7. Постройте график обучения, проверки и тестирования.

    figure, plotperform(tr)
    

  8. Используйте plotconfusion для построения графика матрицы путаницы. В нем показаны различные типы ошибок, возникших в конечной обученной сети.

    figure, plotconfusion(targets,outputs)
    

Диагональные клетки показывают количество случаев, которые были правильно классифицированы, а внедиагональные клетки показывают неправильно классифицированные случаи. Синяя ячейка в правом нижнем углу показывает общий процент правильно классифицированных случаев (зеленым цветом) и общий процент неправильно классифицированных случаев (красным цветом). Результаты показывают очень хорошее признание. Если вам нужны были еще более точные результаты, вы можете попробовать любой из следующих подходов:

  • Сбросить начальные веса сети и смещения на новые значения с помощью init и снова тренироваться.

  • Увеличьте количество скрытых нейронов.

  • Увеличение числа векторов обучения.

  • При наличии более подробной информации увеличьте количество входных значений.

  • Попробуйте другой алгоритм обучения (см. раздел «Алгоритмы обучения»).

В этом случае сетевой ответ удовлетворителен, и теперь сеть можно использовать на новых входах.

Чтобы получить больше опыта в работе с командной строкой, выполните следующие действия:

  • Во время обучения откройте окно графика (например, график путаницы) и посмотрите, как он анимируется.

  • Печать из командной строки с такими функциями, как plotroc и plottrainstate.

Кроме того, дополнительные параметры см. в расширенном сценарии при обучении в командной строке.

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

Существует несколько других способов улучшения исходных решений, если требуется более высокая точность. Дополнительные сведения см. в разделе Улучшение неглубокого обобщения нейронных сетей и предотвращение переоборудования.