Нейронная сеть для глубокого обучения для пользовательских учебных циклов
dlnetwork объект включает поддержку пользовательских учебных циклов с помощью автоматического дифференцирования.
Для большинства задач глубокого обучения можно использовать предварительно обученную сеть и адаптировать ее к собственным данным. Для примера, показывающего, как использовать передачу обучения, чтобы переобучить сверточную нейронную сеть, чтобы классифицировать новый набор изображений, смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения. В качестве альтернативы можно создать и обучить нейронные сети с нуля с помощью layerGraph объекты с trainNetwork и trainingOptions функции.
Если trainingOptions функция не обеспечивает опции обучения, в которых вы нуждаетесь для своей задачи, затем можно создать пользовательский учебный цикл с помощью автоматического дифференцирования. Чтобы узнать больше, смотрите, Задают Пользовательские Учебные Циклы.
lgraph — Сетевая архитектураlayerGraph объектСетевая архитектура в виде графика слоев.
График слоев не должен содержать выходные слои. При обучении сети вычислите потерю отдельно.
Для списка слоев, поддержанных dlnetwork, смотрите Поддерживаемые Слои.
Layers — Слоя сетиLayer массивСлоя сети в виде Layer массив.
Connections — Связи слояСвязи слоя в виде таблицы с двумя столбцами.
Каждая строка таблицы представляет связь в графике слоев. Первый столбец, Source, задает источник каждой связи. Второй столбец, Destination, задает место назначения каждой связи. Источники связи и места назначения являются или именами слоя или имеют форму 'layerName/IOName', где 'IOName' имя ввода или вывода слоя.
Типы данных: table
Learnables — Сетевые настраиваемые параметрыСетевые настраиваемые параметры в виде таблицы с тремя столбцами:
Layer – Имя слоя в виде строкового скаляра.
Parameter – Название параметра в виде строкового скаляра.
Value – Значение параметра в виде dlarray.
Сетевые настраиваемые параметры содержат функции, изученные сетью. Например, веса свертки и полносвязных слоев.
Типы данных: table
State — Сетевое состояниеСетевое состояние в виде таблицы.
Сетевое состояние является таблицей с тремя столбцами:
Layer – Имя слоя в виде строкового скаляра.
Parameter – Название параметра в виде строкового скаляра.
Value – Значение параметра в виде объекта числового массива.
Сетевое состояние содержит информацию, которую помнит сеть между итерациями. Например, состояние LSTM и слоев нормализации партии.
Во время обучения или вывода, можно обновить сетевое состояние с помощью выхода forward и predict функции.
Типы данных: table
InputNames — Сетевые входные имена слояСетевой входной слой называет в виде массива ячеек из символьных векторов.
Типы данных: cell
OutputNames — Сетевые выходные имена слояСетевой выходной слой называет в виде массива ячеек из символьных векторов. Это свойство включает все слои с разъединенными выходными параметрами. Если слой имеет несколько выходных параметров, то разъединенные выходные параметры заданы как 'layerName/outputName'.
Типы данных: cell
forward | Вычислите нейронную сеть для глубокого обучения выход для обучения |
predict | Вычислите нейронную сеть для глубокого обучения выход для вывода |
layerGraph | График слоев сети для глубокого обучения |
dlnetwork ОбъектЭтот пример использует:
Чтобы реализовать пользовательский учебный цикл для вашей сети, сначала преобразуйте его в dlnetwork объект. Не включайте выходные слои в dlnetwork объект. Вместо этого необходимо задать функцию потерь в пользовательском учебном цикле.
Загрузите предварительно обученную модель GoogLeNet с помощью googlenet функция. Эта функция требует Модели Deep Learning Toolbox™ для пакета Сетевой поддержки GoogLeNet. Если этот пакет поддержки не установлен, то функция обеспечивает ссылку на загрузку.
net = googlenet;
Преобразуйте сеть в график слоев и удалите слои, используемые в классификации с помощью removeLayers.
lgraph = layerGraph(net); lgraph = removeLayers(lgraph,["prob" "output"]);
Преобразуйте сеть в dlnetwork объект.
dlnet = dlnetwork(lgraph)
dlnet =
dlnetwork with properties:
Layers: [142x1 nnet.cnn.layer.Layer]
Connections: [168x2 table]
Learnables: [116x3 table]
State: [0x3 table]
InputNames: {'data'}
OutputNames: {'loss3-classifier'}
В этом примере показано, как обучить сеть, которая классифицирует рукописные цифры с пользовательским расписанием скорости обучения.
Если trainingOptions не предоставляет возможности, в которых вы нуждаетесь (например, пользовательское расписание скорости обучения), затем можно задать собственный учебный цикл с помощью автоматического дифференцирования.
Этот пример обучает сеть, чтобы классифицировать рукописные цифры с основанным на времени расписанием скорости обучения затухания: для каждой итерации решатель использует скорость обучения, данную , где t является номером итерации, начальная скорость обучения, и k является затуханием.
Загрузите обучающие данные
Загрузите данные о цифрах.
[XTrain,YTrain] = digitTrain4DArrayData; classes = categories(YTrain); numClasses = numel(classes);
Сеть Define
Задайте сеть и задайте среднее изображение с помощью 'Mean' опция в изображении ввела слой.
layers = [
imageInputLayer([28 28 1], 'Name', 'input', 'Mean', mean(XTrain,4))
convolution2dLayer(5, 20, 'Name', 'conv1')
batchNormalizationLayer('Name','bn1')
reluLayer('Name', 'relu1')
convolution2dLayer(3, 20, 'Padding', 1, 'Name', 'conv2')
batchNormalizationLayer('Name','bn2')
reluLayer('Name', 'relu2')
convolution2dLayer(3, 20, 'Padding', 1, 'Name', 'conv3')
batchNormalizationLayer('Name','bn3')
reluLayer('Name', 'relu3')
fullyConnectedLayer(numClasses, 'Name', 'fc')
softmaxLayer('Name','softmax')];
lgraph = layerGraph(layers);Создайте dlnetwork объект от графика слоев.
dlnet = dlnetwork(lgraph)
dlnet =
dlnetwork with properties:
Layers: [12×1 nnet.cnn.layer.Layer]
Connections: [11×2 table]
Learnables: [14×3 table]
State: [6×3 table]
InputNames: {'input'}
OutputNames: {'softmax'}
Функция градиентов модели Define
Создайте функциональный modelGradients, перечисленный в конце примера, который берет dlnetwork объект dlnet, мини-пакет входных данных dlX с соответствием маркирует Y и возвращает градиенты потери относительно настраиваемых параметров в dlnet и соответствующая потеря.
Задайте опции обучения
Обучайтесь с мини-пакетным размером 128 в течение 5 эпох.
numEpochs = 5; miniBatchSize = 128;
Задайте опции для оптимизации SGDM. Укажите, что начальная буква изучает уровень 0,01 с затуханием 0,01, и импульс 0.9.
initialLearnRate = 0.01; decay = 0.01; momentum = 0.9;
Визуализируйте процесс обучения в графике.
plots = "training-progress";Обучайтесь на графическом процессоре, если вы доступны. Используя графический процессор требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше.
executionEnvironment = "auto";Обучите модель
Обучите модель с помощью пользовательского учебного цикла.
В течение каждой эпохи переставьте данные и цикл по мини-пакетам данных. В конце каждой эпохи отобразите прогресс обучения.
Для каждого мини-пакета:
Преобразуйте метки в фиктивные переменные.
Преобразуйте данные в dlarray объекты с базовым одним типом и указывают, что размерность маркирует 'SSCB' (пространственный, пространственный, канал, пакет).
Для обучения графического процессора преобразуйте в gpuArray объекты.
Оцените градиенты модели, состояние и потерю с помощью dlfeval и modelGradients функционируйте и обновите сетевое состояние.
Определите скорость обучения для основанного на времени расписания скорости обучения затухания.
Обновите сетевые параметры с помощью sgdmupdate функция.
Инициализируйте график процесса обучения.
if plots == "training-progress" figure lineLossTrain = animatedline('Color',[0.85 0.325 0.098]); ylim([0 inf]) xlabel("Iteration") ylabel("Loss") grid on end
Инициализируйте скоростной параметр для решателя SGDM.
velocity = [];
Обучите сеть.
numObservations = numel(YTrain); numIterationsPerEpoch = floor(numObservations./miniBatchSize); iteration = 0; start = tic; % Loop over epochs. for epoch = 1:numEpochs % Shuffle data. idx = randperm(numel(YTrain)); XTrain = XTrain(:,:,:,idx); YTrain = YTrain(idx); % Loop over mini-batches. for i = 1:numIterationsPerEpoch iteration = iteration + 1; % Read mini-batch of data and convert the labels to dummy % variables. idx = (i-1)*miniBatchSize+1:i*miniBatchSize; X = XTrain(:,:,:,idx); Y = zeros(numClasses, miniBatchSize, 'single'); for c = 1:numClasses Y(c,YTrain(idx)==classes(c)) = 1; end % Convert mini-batch of data to dlarray. dlX = dlarray(single(X),'SSCB'); % If training on a GPU, then convert data to gpuArray. if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu" dlX = gpuArray(dlX); end % Evaluate the model gradients, state, and loss using dlfeval and the % modelGradients function and update the network state. [gradients,state,loss] = dlfeval(@modelGradients,dlnet,dlX,Y); dlnet.State = state; % Determine learning rate for time-based decay learning rate schedule. learnRate = initialLearnRate/(1 + decay*iteration); % Update the network parameters using the SGDM optimizer. [dlnet, velocity] = sgdmupdate(dlnet, gradients, velocity, learnRate, momentum); % Display the training progress. if plots == "training-progress" D = duration(0,0,toc(start),'Format','hh:mm:ss'); addpoints(lineLossTrain,iteration,double(gather(extractdata(loss)))) title("Epoch: " + epoch + ", Elapsed: " + string(D)) drawnow end end end

Тестовая модель
Протестируйте точность классификации модели путем сравнения предсказаний на наборе тестов с истинными метками.
[XTest, YTest] = digitTest4DArrayData;
Преобразуйте данные в dlarray объект с форматом размерности 'SSCB'. Для предсказания графического процессора также преобразуйте данные в gpuArray.
dlXTest = dlarray(XTest,'SSCB'); if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu" dlXTest = gpuArray(dlXTest); end
Классифицируйте изображения с помощью modelPredictions функция, перечисленная в конце примера и, находит классы с самыми высокими баллами.
dlYPred = modelPredictions(dlnet,dlXTest,miniBatchSize); [~,idx] = max(extractdata(dlYPred),[],1); YPred = classes(idx);
Оцените точность классификации.
accuracy = mean(YPred == YTest)
accuracy = 0.9910
Функция градиентов модели
modelGradients функционируйте берет dlnetwork объект dlnet, мини-пакет входных данных dlX с соответствием маркирует Y и возвращает градиенты потери относительно настраиваемых параметров в dlnet, сетевое состояние и потеря. Чтобы вычислить градиенты автоматически, используйте dlgradient функция.
function [gradients,state,loss] = modelGradients(dlnet,dlX,Y) [dlYPred,state] = forward(dlnet,dlX); loss = crossentropy(dlYPred,Y); gradients = dlgradient(loss,dlnet.Learnables); end
Функция предсказаний модели
modelPredictions функционируйте берет dlnetwork объект dlnet, массив входных данных dlX, и мини-пакетный размер и выходные параметры предсказания модели путем итерации по мини-пакетам заданного размера.
function dlYPred = modelPredictions(dlnet,dlX,miniBatchSize) numObservations = size(dlX,4); numIterations = ceil(numObservations / miniBatchSize); numClasses = dlnet.Layers(11).OutputSize; dlYPred = zeros(numClasses,numObservations,'like',dlX); for i = 1:numIterations idx = (i-1)*miniBatchSize+1:min(i*miniBatchSize,numObservations); dlYPred(:,idx) = predict(dlnet,dlX(:,:,:,idx)); end end
dlnetwork функционируйте поддерживает слои описанные ниже и пользовательские слои без прямых функций, возвращающих непустое значение памяти.
| Слой | Описание |
|---|---|
| Изображение ввело входные параметры слоя 2D изображения к сети, и применяет нормализацию данных. | |
| Входной слой 3-D изображения вводит 3-D изображения или объемы к сети и применяет нормализацию данных. | |
| Последовательность ввела входные данные о последовательности слоя к сети. |
| Слой | Описание |
|---|---|
| 2D сверточный слой применяет скользящие сверточные фильтры к входу. | |
| 3-D сверточный слой применяет скользящие кубовидные фильтры свертки к 3D входу. | |
| 2D сгруппированный сверточный слой разделяет входные каналы на группы и применяет скользящие сверточные фильтры. Используйте сгруппированные сверточные слои в отделимом мудром каналом (также известный мудрыми глубиной отделимый) свертка. | |
| Транспонированный 2D слой свертки сверхдискретизировал карты функции. | |
| Транспонированный 3-D слой свертки сверхдискретизировал 3D карты функции. | |
| Полносвязный слой умножает вход на матрицу веса и затем добавляет вектор смещения. |
| Слой | Описание |
|---|---|
| Последовательность ввела входные данные о последовательности слоя к сети. | |
| Слой LSTM изучает долгосрочные зависимости между временными шагами в данных о последовательности и временных рядах. | |
| Слой ГРУ изучает зависимости между временными шагами в данных о последовательности и временных рядах. |
| Слой | Описание |
|---|---|
| Слой ReLU выполняет пороговую операцию к каждому элементу входа, где любое значение меньше, чем нуль обнуляется. | |
| Текучий слой ReLU выполняет пороговую операцию, где любое входное значение меньше, чем нуль умножается на фиксированный скаляр. | |
| Отсеченный слой ReLU выполняет пороговую операцию, где любое входное значение, меньше, чем нуль обнуляются и любое значение выше потолка усечения, установлено в тот потолок усечения. | |
| Слой активации ELU выполняет единичную операцию на положительных входных параметрах и экспоненциальную нелинейность на отрицательных входных параметрах. | |
| Гиперболическая касательная (tanh) слой активации применяет функцию tanh на входные параметры слоя. | |
| softmax слой применяет функцию softmax к входу. |
| Слой | Описание |
|---|---|
| Слой нормализации партии. нормирует каждый входной канал через мини-пакет. Чтобы ускорить обучение сверточных нейронных сетей и уменьшать чувствительность к сетевой инициализации, используйте слои нормализации партии. между сверточными слоями и нелинейностью, такой как слои ReLU. | |
| Мудрый каналом локальный ответ (межканальный) слой нормализации выполняет мудрую каналом нормализацию. | |
| Слой уволенного случайным образом обнуляет входные элементы с данной вероятностью. | |
| 2D слой обрезки применяет 2D обрезку к входу. |
| Слой | Описание |
|---|---|
| Средний слой объединения выполняет субдискретизацию путем деления входа на прямоугольные области объединения и вычисление средних значений каждой области. | |
| 3-D средний слой объединения выполняет субдискретизацию путем деления 3D входа на кубовидные области объединения и вычисление средних значений каждой области. | |
| Глобальный средний слой объединения выполняет субдискретизацию путем вычисления среднего значения размерностей высоты и ширины входа. | |
| 3-D глобальный средний слой объединения выполняет субдискретизацию путем вычисления среднего значения высоты, ширины и размерностей глубины входа. | |
| Макс. слой объединения выполняет субдискретизацию путем деления входа на прямоугольные области объединения и вычисления максимума каждой области. | |
| 3-D макс. слой объединения выполняет субдискретизацию путем деления 3D входа на кубовидные области объединения и вычисления максимума каждой области. | |
| Глобальная переменная макс. объединение слоя выполняет субдискретизацию путем вычисления максимума размерностей высоты и ширины входа. | |
| 3-D глобальная переменная макс. объединение слоя выполняет субдискретизацию путем вычисления максимума высоты, ширины и размерностей глубины входа. | |
| Макс. слой необъединения не объединяет выход макс. слоя объединения. |
| Слой | Описание |
|---|---|
| Слой сложения добавляет входные параметры из нескольких поэлементных слоев нейронной сети. | |
| Слой конкатенации глубины берет входные параметры, которые имеют ту же высоту и ширину, и конкатенирует их по третьему измерению (размерность канала). | |
| Слой конкатенации берет входные параметры и конкатенирует их в заданном измерении. Входные параметры должны иметь тот же размер во всех размерностях кроме размерности конкатенации. |
dlarray | dlfeval | dlgradient | forward | layerGraph | predict
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.