Нейронные сети хорошо подходят для подбора функций. На самом деле есть доказательство того, что достаточно простая нейронная сеть может подходить под любую практическую функцию.
Предположим, например, что у вас есть данные из клиники здравоохранения. Вы хотите создать сеть, которая может предсказать процент жира в организме человека, учитывая 13 анатомических измерений. У вас есть в общей сложности 252 примера людей, для которых у вас есть эти 13 элементов данных и связанные с ними проценты жира в организме.
Эту проблему можно решить двумя способами:
Используйте графический интерфейс пользователя, nftool, как описано в разделе Использование приложения нейросетевого фитинга.
Используйте функции командной строки, как описано в разделе Использование функций командной строки.
Обычно лучше всего начинать с GUI, а затем использовать GUI для автоматического создания сценариев командной строки. Перед использованием любого метода сначала определите проблему, выбрав набор данных. Каждый графический интерфейс пользователя имеет доступ ко многим наборам данных образцов, которые можно использовать для экспериментов с панелью инструментов (см. раздел Наборы данных образцов для неглубоких нейронных сетей). При наличии конкретной проблемы, которую необходимо решить, можно загрузить собственные данные в рабочую область. В следующем разделе описывается формат данных.
Чтобы определить проблему подгонки для панели инструментов, упорядочьте набор Q входных векторов в виде столбцов в матрице. Затем скомпонуйте другой набор Q целевых векторов (правильных выходных векторов для каждого из входных векторов) во вторую матрицу (подробное описание форматирования данных для статических данных и данных временных рядов см. в разделе «Структуры данных»). Например, можно определить проблему подгонки для логического элемента И с четырьмя наборами двухэлементных входных векторов и одноэлементных целевых объектов следующим образом.
inputs = [0 1 0 1; 0 0 1 1]; targets = [0 0 0 1];
В следующем разделе показано, как обучить сеть соответствовать набору данных с помощью приложения нейросетевого фитинга, nftool. В этом примере используется набор данных телесного жира, поставляемый с панелью инструментов.
Откройте приложение Neural Network Fitting с помощью nftool.
nftool

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

Щелкните Загрузить набор данных примера (Load Example Data Set) в окне Выбрать данные (Select Data). Откроется окно Выбор набора данных фитинга (Fitting Data Set Chooser).
Примечание
Если требуется загрузить данные из рабочей области MATLAB ®, используйте опции Входы и цели (Inputs and Targets) в окне Выбрать данные (Select Data).

Выберите Химический (Chemical) и щелкните Импорт (Import). Откроется окно Выбор данных.
Нажмите кнопку Next, чтобы открыть окно Validation and Test Data, показанное на следующем рисунке.
Каждый набор проверочных и тестовых данных составляет 15% от исходных данных.

При этих настройках входные векторы и целевые векторы будут случайным образом разделены на три набора следующим образом:
70% будет использовано для обучения.
15% будут использоваться для проверки того, что сеть обобщается, и для прекращения обучения перед переоборудованием.
Последние 15% будут использованы как полностью независимый тест обобщения сети.
(Для получения дополнительной информации о процессе разделения данных см. раздел «Разделение данных».)
Нажмите кнопку Далее.
Стандартная сеть, используемая для фитинга функций, представляет собой двухуровневую сеть прямой связи с сигмоидной передаточной функцией в скрытом слое и линейной передаточной функцией в выходном уровне. Количество скрытых нейронов по умолчанию установлено в 10. Вы можете увеличить это число позже, если производительность обучения сети плохая.

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

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

В разделе Графики (Plots) щелкните Регрессия (Regression). Используется для проверки производительности сети.
На следующих графиках регрессии отображаются выходные данные сети относительно целей для обучения, проверки и тестовых наборов. Для идеальной посадки данные должны располагаться вдоль 45-градусной линии, где сетевые выходы равны целевым. Для этой проблемы подгонка является достаточно хорошей для всех наборов данных со значениями R в каждом случае 0,93 или выше. Если требовались еще более точные результаты, можно было переобучить сеть, щелкнув Переучить в nftool. Это приведет к изменению начальных весов и смещений сети и может привести к улучшению сети после переподготовки. Другие опции представлены на следующей панели.

Просмотрите гистограмму ошибок для получения дополнительной проверки производительности сети. На панели Графики (Plots) щелкните Гистограмма ошибок (Error Histogram).

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

На этом этапе можно протестировать сеть на соответствие новым данным.
Если вы недовольны производительностью сети в отношении исходных или новых данных, можно выполнить одно из следующих действий:
Тренируйте снова.
Увеличьте количество нейронов.
Получите больший набор учебных данных.
Если производительность на тренировочном аппарате хорошая, но производительность тестового набора значительно хуже, что может свидетельствовать о переоборудовании, то уменьшение количества нейронов может улучшить ваши результаты. Если эффективность обучения плохая, то вы можете захотеть увеличить количество нейронов.
Если вы удовлетворены производительностью сети, нажмите кнопку Далее.
Эта панель используется для создания функции MATLAB или диаграммы Simulink ® для моделирования нейронной сети. Можно использовать сгенерированный код или диаграмму, чтобы лучше понять, как нейронная сеть вычисляет выходные данные на основе входных данных, или развернуть сеть с помощью инструментов MATLAB Compiler™ и других инструментов генерации кода MATLAB .

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

Можно щелкнуть Простой сценарий (Simple Script) или Расширенный сценарий (Advanced Script), чтобы создать код MATLAB, который можно использовать для воспроизведения всех предыдущих шагов из командной строки. Создание кода MATLAB может быть полезно, если вы хотите узнать, как использовать функциональность командной строки панели инструментов для настройки процесса обучения. В разделе Использование функций командной строки более подробно рассматриваются созданные сценарии.
Можно также сохранить сеть как net в рабочей области. На нем можно выполнить дополнительные тесты или поставить его для работы на новых входах.
После создания кода MATLAB и сохранения результатов нажмите кнопку Готово.
Самый простой способ научиться использовать функции командной строки панели инструментов - это создавать сценарии из GUI, а затем изменять их для настройки сетевого обучения. В качестве примера рассмотрим простой сценарий, который был создан на шаге 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)
Можно сохранить сценарий, а затем запустить его из командной строки для воспроизведения результатов предыдущего сеанса графического интерфейса пользователя. Можно также отредактировать сценарий для настройки процесса обучения. В этом случае следуйте каждому шагу сценария.
Сценарий предполагает, что входные и целевые векторы уже загружены в рабочую область. Если данные не загружены, их можно загрузить следующим образом:
load bodyfat_dataset
inputs = bodyfatInputs;
targets = bodyfatTargets;
Этот набор данных является одним из наборов данных образцов, который является частью панели инструментов (см. раздел Наборы данных образцов для неглубоких нейронных сетей). Для просмотра списка всех доступных наборов данных введите команду help nndatasets. load также позволяет загружать переменные из любого из этих наборов данных с использованием собственных имен переменных. Например, команда
[inputs,targets] = bodyfat_dataset;
загрузит вводы телесного жира в массив inputs и цели телесного жира в массиве targets.
Создание сети. Сеть по умолчанию для проблем фитинга функции (или регрессии), fitnet, является сетью прямой связи с функцией передачи по умолчанию tan-sigmoid на скрытом уровне и функцией линейной передачи на выходном уровне. Вы назначили десять нейронов (несколько произвольных) одному скрытому слою в предыдущем разделе. Сеть имеет один выходной нейрон, потому что существует только одно целевое значение, связанное с каждым входным вектором.
hiddenLayerSize = 10; net = fitnet(hiddenLayerSize);
Примечание
Большее количество нейронов требует большего количества вычислений, и они имеют тенденцию перевыполнять данные, когда число установлено слишком высоким, но они позволяют сети решать более сложные задачи. Большее количество уровней требует большего количества вычислений, но их использование может привести к более эффективному решению сложных проблем в сети. Чтобы использовать несколько скрытых слоев, введите размеры скрытых слоев в качестве элементов массива в fitnet команда.
Настройка разделения данных.
net.divideParam.trainRatio = 70/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 15/100;
При этих настройках входные векторы и целевые векторы будут разделены случайным образом: 70% используются для обучения, 15% для проверки и 15% для тестирования. (Для получения дополнительной информации о процессе разделения данных см. раздел «Разделение данных».)
Обучение сети. Сеть использует алгоритм Левенберга-Марквардта по умолчанию (trainlm) для обучения. Для проблем, в которых Левенберг-Марквардт не дает столь точных результатов, как требуется, или для больших проблем с данными, рассмотрите возможность установки функции обучения сети на байесовскую регуляризацию (trainbr) или Масштабированный сопряженный градиент (trainscg), соответственно, с одним
net.trainFcn = 'trainbr'; net.trainFcn = 'trainscg';
Для обучения сети введите:
[net, tr] = train(net, inputs, targets);
Во время обучения открывается следующее окно обучения. Это окно отображает ход обучения и позволяет прервать обучение в любой момент, нажав Остановить обучение.

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

Протестируйте сеть. После обучения сети ее можно использовать для вычисления сетевых выходов. Следующий код вычисляет сетевые выходы, ошибки и общую производительность.
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
Выполните некоторый анализ сетевого ответа. Если щелкнуть Регрессия (Regression) в окне обучения, можно выполнить линейную регрессию между выходами сети и соответствующими целями.
Результаты показаны на следующем рисунке.

Выходные данные очень хорошо отслеживают цели для обучения, тестирования и проверки, а значение R превышает 0,96 для общего ответа. Если бы требовались еще более точные результаты, вы могли бы попробовать любой из этих подходов:
Сбросить начальные веса сети и смещения на новые значения с помощью init и снова тренируйтесь (см. «Инициализация весов» (init)).
Увеличьте количество скрытых нейронов.
Увеличение числа векторов обучения.
При наличии более подробной информации увеличьте количество входных значений.
Попробуйте другой алгоритм обучения (см. раздел «Алгоритмы обучения»).
В этом случае сетевой ответ удовлетворителен, и теперь сеть можно использовать на новых входах.
Просмотрите схему сети.
view(net)

Чтобы получить больше опыта в операциях командной строки, попробуйте выполнить некоторые из следующих задач:
Во время обучения откройте окно графика (например, график регрессии) и посмотрите, как он анимируется.
Печать из командной строки с такими функциями, как plotfit, plotregression, plottrainstate и plotperform. (Дополнительные сведения об использовании этих функций см. на справочных страницах.)
Кроме того, дополнительные параметры см. в расширенном сценарии при обучении в командной строке.
Каждый раз, когда нейронная сеть обучается, может привести к различному решению из-за различных начальных значений веса и смещения и различных разделов данных в обучающих, валидационных и тестовых наборах. В результате различные нейронные сети, обученные одной и той же проблеме, могут давать разные выходы для одного и того же входа. Чтобы была найдена нейронная сеть хорошей точности, переучивайтесь несколько раз.
Существует несколько других способов улучшения исходных решений, если требуется более высокая точность. Дополнительные сведения см. в разделе Улучшение неглубокого обобщения нейронных сетей и предотвращение переоборудования.