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

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

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

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

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

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

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

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

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

    nnstart
    

  2. Нажмите приложение Pattern Recognition, чтобы открыть приложение Распознавания образов Нейронной сети. (Можно также использовать команду nprtool.)

  3. Нажмите Далее, чтобы продолжить. Окно Select Data открывается.

  4. Нажмите Load Example Data Set. Окно Pattern Recognition Data Set Chooser открывается.

  5. Выберите Breast Cancer и нажмите Import. Вы возвращаетесь к окну Select Data.

  6. Нажмите Далее, чтобы продолжиться к окну Validation и Test Data.

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

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

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

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

    (См. “Деление Данных” для большего количества обсуждения процесса деления данных.)

  7. Нажать Далее.

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

  8. Нажать Далее.

  9. Нажмите Train.

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

  10. Под панелью Графиков нажмите Confusion в Приложении Распознавания образов Нейронной сети.

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

  11. Постройте кривую Рабочей характеристики получателя (ROC). Под панелью Графиков нажмите Receiver Operating Characteristic в Приложении Распознавания образов Нейронной сети.

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

  12. В Приложении Распознавания образов Нейронной сети нажмите Далее, чтобы оценить сеть.

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

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

  13. Когда вы удовлетворены производительностью сети, нажимаете Далее.

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

  14. Нажать Далее. Используйте кнопки на этом экране, чтобы сохранить ваши результаты.

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

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

  15. Когда вы будете иметь сохраненный ваши результаты, нажмите Finish.

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

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

    Во время обучения, как в функциональном подборе кривой, открывается учебное окно. Это окно отображает учебный прогресс. Чтобы прервать обучение в любой точке, нажмите Stop Training.

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

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

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

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