В этом примере показано, как обучить нейронную сеть для глубокого обучения классификации при помощи Experiment Manager. В этом примере вы обучаете две сети, чтобы классифицировать изображения товаров MathWorks в пять классов. Каждая сеть обучена с помощью трех алгоритмов. В каждом случае матрица беспорядка сравнивает истинные классы для набора изображений валидации с классами, предсказанными обучившим сеть. Для получения дополнительной информации об обучении сети для классификации изображений смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения.
Этот эксперимент требует Модели Deep Learning Toolbox™ для пакета Сетевой поддержки GoogLeNet. Прежде чем вы запустите эксперимент, установите этот пакет поддержки путем вызова googlenet
функционируйте и нажатие на ссылку на загрузку.
Во-первых, откройте пример. Experiment Manager загружает проект с предварительно сконфигурированным экспериментом, который можно смотреть и запустить. Чтобы открыть эксперимент, в панели Браузера Эксперимента, дважды кликают имя эксперимента (ClassificationExperiment
).
Встроенные учебные эксперименты состоят из описания, таблицы гиперпараметров, функции настройки и набора метрических функций, чтобы оценить результаты эксперимента. Для получения дополнительной информации смотрите, Конфигурируют Встроенный Учебный Эксперимент.
Поле Description содержит текстовое описание эксперимента. В данном примере описание:
Merchandise image classification using: * an untrained network (default) or a pretrained network (googlenet) * various solvers for training networks (sgdm, rmsprop, or adam)
Раздел Hyperparameters задает стратегию (Exhaustive Sweep
) и гиперзначения параметров, чтобы использовать для эксперимента. Когда вы запускаете эксперимент, Experiment Manager обучает сеть с помощью каждой комбинации гиперзначений параметров, заданных в гипертаблице параметров. Этот пример использует два гиперпараметра:
Network
задает сеть, чтобы обучаться. Опции включают "default"
(сеть по умолчанию, обеспеченная экспериментом, обрабатывает по шаблону для классификации изображений), и "googlenet"
(предварительно обученная сеть GoogLeNet с модифицированными слоями для передачи обучения).
Solver
указывает, что алгоритм раньше обучал сеть. Опции включают "sgdm"
(стохастический градиентный спуск с импульсом), "rmsprop"
(среднеквадратичное распространение), и "adam"
(адаптивная оценка момента). Для получения дополнительной информации об этих алгоритмах, смотрите Стохастический Градиентный спуск.
Функция Setup конфигурирует обучающие данные, сетевую архитектуру и опции обучения для эксперимента. Вход к функции настройки является структурой с полями от гипертаблицы параметров. Функция настройки возвращает три выходных параметра, которые вы используете, чтобы обучить сеть для проблем классификации изображений. В этом примере функция настройки имеет три раздела.
Обучающие данные загрузки задают хранилища данных изображений, содержащие данные об обучении и валидации. Этот пример загружает изображения из файла MerchData.zip
. Этот небольшой набор данных содержит 75 изображений товаров MathWorks, принадлежа пяти различным классам. Изображения имеют размер 227 227 3. Для получения дополнительной информации об этом наборе данных смотрите Наборы Данных изображения.
filename = "MerchData.zip"; dataFolder = fullfile(tempdir,"MerchData"); if ~exist(dataFolder,"dir") unzip(filename,tempdir); end
imdsTrain = imageDatastore(dataFolder, ... IncludeSubfolders=true, .... LabelSource="foldernames");
numTrainingFiles = 0.7; [imdsTrain,imdsValidation] = splitEachLabel(imdsTrain,numTrainingFiles);
Архитектура Сети Define задает архитектуру для сверточной нейронной сети для классификации глубокого обучения. В этом примере выбор сети обучаться зависит от значения гиперпараметра Network
.
switch params.Network case "default" inputSize = [227 227 3]; numClasses = 5; layers = [ imageInputLayer(inputSize) convolution2dLayer(5,20) batchNormalizationLayer reluLayer fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]; case "googlenet" inputSize = [224 224 3]; numClasses = 5; imdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain); imdsValidation = augmentedImageDatastore(inputSize(1:2), ... imdsValidation); net = googlenet; layers = layerGraph(net); newLearnableLayer = fullyConnectedLayer(numClasses, ... Name="new_fc", ... WeightLearnRateFactor=10, ... BiasLearnRateFactor=10); layers = replaceLayer(layers,"loss3-classifier",newLearnableLayer); newClassLayer = classificationLayer(Name="new_classoutput"); layers = replaceLayer(layers,"output",newClassLayer); otherwise error("Undefined network selection."); end
Укажите, что Опции обучения задают trainingOptions
объект для эксперимента. Пример обучает сеть в течение 8 эпох с помощью алгоритма, заданного Solver
запись в гипертаблице параметров.
options = trainingOptions(params.Solver, ... MiniBatchSize=10, ... MaxEpochs=8, ... InitialLearnRate=1e-4, ... Shuffle="every-epoch", ... ValidationData=imdsValidation, ... ValidationFrequency=5, ... Verbose=false);
Чтобы смотреть функцию настройки, под Функцией Setup, нажимают Edit. Функция настройки открывается в Редакторе MATLAB®. Кроме того, код для функции настройки появляется в приложении в конце этого примера.
Раздел Metrics задает дополнительные функции, которые оценивают результаты эксперимента. Этот пример не включает пользовательских метрических функций.
Когда вы запускаете эксперимент, Experiment Manager обучает сеть, заданную функцией настройки шесть раз. Каждое испытание использует различную комбинацию гиперзначений параметров. По умолчанию Experiment Manager запускает одно испытание за один раз. Если у вас есть Parallel Computing Toolbox™, можно запустить несколько испытаний одновременно. Для лучших результатов, прежде чем вы запустите свой эксперимент, начинают параллельный пул со стольких же рабочих сколько графические процессоры. Для получения дополнительной информации смотрите Использование Experiment Manager, чтобы Обучить нейронные сети параллельно и Поддержка графического процессора Релизом (Parallel Computing Toolbox).
Чтобы запустить один суд над экспериментом за один раз, на панели инструментов Experiment Manager, нажимают Run.
Чтобы запустить несколько испытаний одновременно, нажмите Use Parallel и затем Запуск. Если нет никакого текущего параллельного пула, Experiment Manager запускает тот с помощью кластерного профиля по умолчанию. Experiment Manager затем выполняет несколько одновременных испытаний, в зависимости от количества параллельных доступных рабочих.
Таблица результатов показывает точность и потерю для каждого испытания.
В то время как эксперимент запускается, нажмите Training Plot, чтобы отобразить учебный график и отследить прогресс каждого испытания.
Чтобы найти лучший результат для вашего эксперимента, отсортируйте таблицу результатов точностью валидации.
Укажите на столбец Точности Валидации.
Кликните по треугольному значку.
Выберите Sort в порядке убывания.
Испытание с самой высокой точностью валидации появляется наверху таблицы результатов.
Чтобы отобразить матрицу беспорядка для этого испытания, выберите верхнюю строку в таблице результатов и нажмите Confusion Matrix.
Чтобы записать наблюдения о результатах вашего эксперимента, добавьте аннотацию.
В таблице результатов щелкните правой кнопкой по ячейке Validation Accuracy лучшего испытания.
Выберите Add Annotation.
В панели Аннотаций введите свои наблюдения в текстовое поле.
Для получения дополнительной информации смотрите сортировку, Фильтр, и Аннотируйте Результаты Эксперимента.
В панели Браузера Эксперимента щелкните правой кнопкой по имени проекта и выберите Close Project. Experiment Manager закрывает все эксперименты и результаты, содержавшиеся в проекте.
Эта функция конфигурирует обучающие данные, сетевую архитектуру и опции обучения для эксперимента.
Входной параметр
params
структура с полями от гипертаблицы параметров Experiment Manager.
Вывод
imdsTrain
datastore изображений для обучающих данных.
layers
график слоев, который задает архитектуру нейронной сети.
options
trainingOptions
объект.
function [imdsTrain,layers,options] = ClassificationExperiment_setup1(params) filename = "MerchData.zip"; dataFolder = fullfile(tempdir,"MerchData"); if ~exist(dataFolder,"dir") unzip(filename,tempdir); end imdsTrain = imageDatastore(dataFolder, ... IncludeSubfolders=true, .... LabelSource="foldernames"); numTrainingFiles = 0.7; [imdsTrain,imdsValidation] = splitEachLabel(imdsTrain,numTrainingFiles); switch params.Network case "default" inputSize = [227 227 3]; numClasses = 5; layers = [ imageInputLayer(inputSize) convolution2dLayer(5,20) batchNormalizationLayer reluLayer fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]; case "googlenet" inputSize = [224 224 3]; numClasses = 5; imdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain); imdsValidation = augmentedImageDatastore(inputSize(1:2), ... imdsValidation); net = googlenet; layers = layerGraph(net); newLearnableLayer = fullyConnectedLayer(numClasses, ... Name="new_fc", ... WeightLearnRateFactor=10, ... BiasLearnRateFactor=10); layers = replaceLayer(layers,"loss3-classifier",newLearnableLayer); newClassLayer = classificationLayer(Name="new_classoutput"); layers = replaceLayer(layers,"output",newClassLayer); otherwise error("Undefined network selection."); end options = trainingOptions(params.Solver, ... MiniBatchSize=10, ... MaxEpochs=8, ... InitialLearnRate=1e-4, ... Shuffle="every-epoch", ... ValidationData=imdsValidation, ... ValidationFrequency=5, ... Verbose=false); end