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

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

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

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

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

Определение задачи

Чтобы задать задачу распознавания шаблона, расположите набор 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. Щелкните Загрузка набора данных примера. Откроется окно Выбор набора данных распознавания шаблона (Pattern Recognition Data Set Chooser)

  4. Выберите рак молочной железы и нажмите Импортировать. Вы вернетесь в окно Select Data.

  5. Нажмите кнопку Далее (Next), чтобы перейти к окну Данные валидации и тестирования (Validation and Тестовые Данные).

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

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

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

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

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

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

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

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

  8. Нажмите Train.

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

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

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

  10. Постройте график кривого Приемника рабочей характеристики (ROC). В панель Графики нажмите Приемник Операционная характеристика в Приложении Распознавания Шаблонов Нейронной Сети.

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

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

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

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

  12. Когда вы будете удовлетворены эффективностью сети, нажмите кнопку Далее.

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

  13. Нажмите кнопку Далее. Чтобы сохранить результаты, используйте кнопки на этом экране.

    • Вы можете нажать Простой скрипт или Расширенный скрипт, чтобы создать MATLAB® код, который может использоваться для воспроизведения всех предыдущих шагов из командной строки. Создание кода MATLAB может быть полезным, если вы хотите узнать, как использовать функциональность командной строки тулбокса для настройки процесса обучения. В разделе Использование функций Command-Line вы исследуете сгенерированные скрипты более подробно.

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

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

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

Самый легкий способ научиться использовать функциональность командной строки тулбокса - сгенерировать скрипты из графические интерфейсы пользователя, а затем изменить их, чтобы настроить сетевое обучение. Для примера проверьте простой скрипт, который был создан на шаге 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, является сеть прямого распространения с передаточной функцией тан-сигмоида по умолчанию в скрытом слое и передаточной функцией 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.

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

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

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