Подходящие данные с мелкой нейронной сетью

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

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

Можно решить эту задачу двумя способами:

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

Постановка задачи

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

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

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

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

  1. Откройтесь Нейронная сеть Начинают графический интерфейс пользователя с этой команды:

    nnstart
    

  2. Нажмите приложение Fitting, чтобы открыть Приложение Подбора кривой Нейронной сети. (Можно также использовать команду nftool.)

  3. Нажмите Далее, чтобы продолжить.

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

    Примечание

    Используйте Входные параметры и Целевые опции в окне Select Data, когда необходимо будет загрузить данные из рабочей области MATLAB®.

  5. Выберите Chemical и нажмите Import. Это возвращает вас в окно Select Data.

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

    Валидация и наборы тестовых данных каждый установлены в 15% исходных данных.

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

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

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

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

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

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

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

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

  9. Выберите алгоритм настройки, затем нажмите Train. Levenberg-Marquardt (trainlm) рекомендуется для большинства проблем, но для некоторых шумных и небольших проблем Байесова Регуляризация (trainbr) может занять больше времени, но получить лучшее решение. Для больших проблем, однако, Масштабированный Метод сопряженных градиентов (trainscg) рекомендуется, когда это использует вычисления градиента, которые используют память более эффективно, чем вычисления Якобиана другие два использования алгоритмов. Этот пример использует Levenberg-Marquardt по умолчанию.

    Обучение продолжается до тех пор, пока ошибка проверки не перестанет уменьшаться в течение шести итераций (остановка валидации).

  10. В соответствии с Графиками, нажмите Regression. Это используется, чтобы подтвердить производительность сети.

    Следующие графики регрессии отображают сетевые выводы относительно целей для обучения, валидации и наборов тестов. Для совершенной подгонки данные должны упасть вдоль 45 линий степени, где сетевые выходные параметры равны целям. Для этой проблемы подгонка довольно хороша для всех наборов данных со значениями R в каждом случае 0,93 или выше. Если бы еще более точные результаты требовались, вы могли бы переобучить сеть путем нажатия на Retrain в nftool. Это изменит начальные веса и смещения сети, и может произвести улучшенную сеть после переобучения. Другие возможности предоставляются на следующей панели.

  1. Просмотрите ошибочную гистограмму, чтобы получить дополнительную верификацию производительности сети. Под панелью Графиков нажмите Error Histogram.

    Синие панели представляют обучающие данные, зеленые панели представляют данные о валидации, и красные панели представляют данные о тестировании. Гистограмма может дать вам индикацию относительно выбросов, которые являются точками данных, где подгонка значительно хуже, чем большинство данных. В этом случае вы видите, что, в то время как большинство ошибок падает между-5 и 5, существует учебная точка с ошибкой 17 и точки валидации с ошибками 12 и 13. Эти выбросы также отображаются на графике регрессии тестирования. Первое соответствует точке с целью 50 и выход около 33. Это - хорошая идея проверять выбросы, чтобы определить, плохи ли данные, или если те точки данных отличаются, чем остальная часть набора данных. Если выбросы являются допустимыми точками данных, но непохожи на остальную часть данных, то сеть экстраполирует для этих точек. Необходимо собрать больше данных, которые похожи на точки выброса, и переобучите сеть.

  2. Нажмите Далее в Приложении Подбора кривой Нейронной сети, чтобы оценить сеть.

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

    Если вы неудовлетворены эффективностью сети на исходных или новых данных, можно выполнить одно из следующих действий:

    • Обучите его снова.

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

    • Получите больший обучающий набор данных.

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

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

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

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

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

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

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

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

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

% Solve an Input-Output Fitting problem with a Neural Network
% Script generated by NFTOOL
%
% This script assumes these variables are defined:
%
%   houseInputs - input data.
%   houseTargets - target data.
 
inputs = houseInputs;
targets = houseTargets;
 
% Create a Fitting Network
hiddenLayerSize = 10;
net = fitnet(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(outputs,targets);
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, plotfit(targets,outputs)
% figure, plotregression(targets,outputs)
% figure, ploterrhist(errors)

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

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

    load bodyfat_dataset
    inputs = bodyfatInputs;
    targets = bodyfatTargets;
    

    Этот набор данных является одним из наборов выборочных данных, который является частью тулбокса (см. Наборы Выборочных данных для Мелких Нейронных сетей). Вы видите список всех доступных наборов данных путем ввода команды help nndatasets. load команда также позволяет вам загружать переменные из любого из этих наборов данных с помощью собственных имен переменных. Например, команда

    [inputs,targets] = bodyfat_dataset;
    

    загрузит входные параметры жировой прослойки в массив inputs и жировая прослойка предназначается в массив для targets.

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

    hiddenLayerSize = 10;
    net = fitnet(hiddenLayerSize);
    

    Примечание

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

  3. Создайте деление данных.

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

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

  4. Обучите сеть. Сеть использует алгоритм Levenberg-Marquardt по умолчанию (trainlm) для обучения. Для проблем, в которых Levenberg-Marquardt не производит, когда точные результаты, как желаемый, или для больших проблем данных, рассматривают установку сетевой учебной функции к Байесовой Регуляризации (trainbr) или масштабированный метод сопряженных градиентов (trainscg), соответственно, с также

    net.trainFcn = 'trainbr';
    net.trainFcn = 'trainscg';

    Обучать сеть, введите:

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

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

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

    • Итоговая среднеквадратичная погрешность мала.

    • Ошибка набора тестов и ошибка набора валидации имеют подобные характеристики.

    • Никакой значительный сверхподбор кривой не произошел итерацией 14 (где лучшая эффективность валидации происходит).

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

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

    Также возможно вычислить производительность сети только на набор тестов, при помощи индексов тестирования, которые расположены в учебной записи. (См., Анализируют Мелкую Эффективность Нейронной сети После Обучения полному описанию учебной записи.)

    tInd = tr.testInd;
    tstOutputs = net(inputs(:, tInd));
    tstPerform = perform(net, targets(tInd), tstOutputs)
    
    tstPerform =
    
       53.7680
    
    
  6. Выполните некоторый анализ сетевого ответа. Если вы нажимаете Regression в учебном окне, можно выполнить линейную регрессию между сетевыми выходными параметрами и соответствующими целями.

    Следующий рисунок показывает результаты.

    Выход отслеживает цели очень хорошо для обучения, тестирования и валидации, и R-значение - более чем 0,96 для общего ответа. Если бы еще более точные результаты требовались, вы могли бы попробовать любой из этих подходов:

    • Сбросьте начальные сетевые веса и смещения к новым значениям с init и обучайтесь снова (см. “Веса Инициализации” (init)).

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

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

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

    • Попробуйте различный алгоритм настройки (см. “Алгоритмы настройки”).

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

  7. Просмотрите сетевой график.

    view(net)
    

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

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

  • Постройте из командной строки с функциями такой как plotfit, plotregression, plottrainstate и plotperform. (Для получения дополнительной информации об использовании этих функций смотрите их страницы с описанием.)

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

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

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