Нейронная сеть для глубокого обучения для пользовательских учебных циклов
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 | График слоев сети для глубокого обучения |
setL2Factor | Установитесь коэффициент регуляризации L2 настраиваемого параметра слоя |
setLearnRateFactor | Установите изучают фактор уровня настраиваемого параметра слоя |
getLearnRateFactor | Доберитесь изучают фактор уровня настраиваемого параметра слоя |
getL2Factor | Получите фактор регуляризации L2 настраиваемого параметра слоя |
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 является затуханием.
Загрузите обучающие данные
Загрузите данные о цифрах как datastore изображений с помощью imageDatastore
функционируйте и задайте папку, содержащую данные изображения.
dataFolder = fullfile(toolboxdir('nnet'),'nndemos','nndatasets','DigitDataset'); imds = imageDatastore(dataFolder, ... 'IncludeSubfolders',true, .... 'LabelSource','foldernames');
Разделите данные в наборы обучения и валидации. Отложите 10% данных для валидации с помощью splitEachLabel
функция.
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.9,'randomize');
Сеть, используемая в этом примере, требует входных изображений размера 28 28 1. Чтобы автоматически изменить размер учебных изображений, используйте увеличенный datastore изображений. Задайте дополнительные операции увеличения, чтобы выполнить на учебных изображениях: случайным образом переведите изображения до 5 пикселей в горизонтальных и вертикальных осях. Увеличение данных помогает препятствовать тому, чтобы сеть сверхсоответствовала и запомнила точные детали учебных изображений.
inputSize = [28 28 1]; pixelRange = [-5 5]; imageAugmenter = imageDataAugmenter( ... 'RandXTranslation',pixelRange, ... 'RandYTranslation',pixelRange); augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain,'DataAugmentation',imageAugmenter);
Чтобы автоматически изменить размер изображений валидации, не выполняя дальнейшее увеличение данных, используйте увеличенный datastore изображений, не задавая дополнительных операций предварительной обработки.
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
Определите количество классов в обучающих данных.
classes = categories(imdsTrain.Labels); numClasses = numel(classes);
Сеть Define
Задайте сеть для классификации изображений.
layers = [ imageInputLayer(inputSize,'Normalization','none','Name','input') convolution2dLayer(5,20,'Name','conv1') batchNormalizationLayer('Name','bn1') reluLayer('Name','relu1') convolution2dLayer(3,20,'Padding','same','Name','conv2') batchNormalizationLayer('Name','bn2') reluLayer('Name','relu2') convolution2dLayer(3,20,'Padding','same','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
объект, мини-пакет входных данных с соответствующими метками и возвращают градиенты потери относительно настраиваемых параметров в сети и соответствующей потери.
Задайте опции обучения
Обучайтесь в течение десяти эпох с мини-пакетным размером 128.
numEpochs = 10; miniBatchSize = 128;
Задайте опции для оптимизации SGDM. Укажите, что начальная буква изучает уровень 0,01 с затуханием 0,01, и импульс 0.9.
initialLearnRate = 0.01; decay = 0.01; momentum = 0.9;
Обучите модель
Создайте minibatchqueue
возразите, что процессы и управляют мини-пакетами изображений во время обучения. Для каждого мини-пакета:
Используйте пользовательский мини-пакет, предварительно обрабатывающий функциональный preprocessMiniBatch
(заданный в конце этого примера), чтобы преобразовать метки в одногорячие закодированные переменные.
Формат данные изображения с размерностью маркирует 'SSCB'
(пространственный, пространственный, канал, пакет). По умолчанию, minibatchqueue
объект преобразует данные в dlarray
объекты с базовым типом single
. Не добавляйте формат в метки класса.
Обучайтесь на графическом процессоре, если вы доступны. По умолчанию, minibatchqueue
объект преобразует каждый выход в gpuArray
если графический процессор доступен. Используя графический процессор требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше.
mbq = minibatchqueue(augimdsTrain,... 'MiniBatchSize',miniBatchSize,... 'MiniBatchFcn',@preprocessMiniBatch,... 'MiniBatchFormat',{'SSCB',''});
Инициализируйте график процесса обучения.
figure lineLossTrain = animatedline('Color',[0.85 0.325 0.098]); ylim([0 inf]) xlabel("Iteration") ylabel("Loss") grid on
Инициализируйте скоростной параметр для решателя SGDM.
velocity = [];
Обучите сеть с помощью пользовательского учебного цикла. В течение каждой эпохи переставьте данные и цикл по мини-пакетам данных. Для каждого мини-пакета:
Оцените градиенты модели, состояние и потерю с помощью dlfeval
и modelGradients
функции и обновление сетевое состояние.
Определите скорость обучения для основанного на времени расписания скорости обучения затухания.
Обновите сетевые параметры с помощью sgdmupdate
функция.
Отобразите прогресс обучения.
iteration = 0; start = tic; % Loop over epochs. for epoch = 1:numEpochs % Shuffle data. shuffle(mbq); % Loop over mini-batches. while hasdata(mbq) iteration = iteration + 1; % Read mini-batch of data. [dlX, dlY] = next(mbq); % 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,dlY); 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. D = duration(0,0,toc(start),'Format','hh:mm:ss'); addpoints(lineLossTrain,iteration,loss) title("Epoch: " + epoch + ", Elapsed: " + string(D)) drawnow end end
Тестовая модель
Протестируйте точность классификации модели путем сравнения предсказаний на наборе валидации с истинными метками.
После обучения создание предсказаний на новых данных не требует меток. Создайте minibatchqueue
объект, содержащий только предикторы тестовых данных:
Чтобы проигнорировать метки для тестирования, определите номер выходных параметров мини-пакетной очереди к 1.
Задайте тот же мини-пакетный размер, используемый для обучения.
Предварительно обработайте предикторы с помощью preprocessMiniBatchPredictors
функция, перечисленная в конце примера.
Для одного выхода datastore задайте мини-пакетный формат 'SSCB'
(пространственный, пространственный, канал, пакет).
numOutputs = 1; mbqTest = minibatchqueue(augimdsValidation,numOutputs, ... 'MiniBatchSize',miniBatchSize, ... 'MiniBatchFcn',@preprocessMiniBatchPredictors, ... 'MiniBatchFormat','SSCB');
Цикл по мини-пакетам и классифицирует изображения с помощью modelPredictions
функция, перечисленная в конце примера.
predictions = modelPredictions(dlnet,mbqTest,classes);
Оцените точность классификации.
YTest = imdsValidation.Labels; accuracy = mean(predictions == YTest)
accuracy = 0.9530
Функция градиентов модели
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); loss = double(gather(extractdata(loss))); end
Функция предсказаний модели
modelPredictions
функционируйте берет dlnetwork
объект dlnet
, minibatchqueue
из входных данных mbq
, и сетевые классы, и вычисляют предсказания модели путем итерации по всем данным в minibatchqueue
объект. Функция использует onehotdecode
функционируйте, чтобы найти предсказанный класс с самым высоким счетом.
function predictions = modelPredictions(dlnet,mbq,classes) predictions = []; while hasdata(mbq) dlXTest = next(mbq); dlYPred = predict(dlnet,dlXTest); YPred = onehotdecode(dlYPred,classes,1)'; predictions = [predictions; YPred]; end end
Мини-функция предварительной обработки пакета
preprocessMiniBatch
функция предварительно обрабатывает мини-пакет предикторов и меток с помощью следующих шагов:
Предварительно обработайте изображения с помощью preprocessMiniBatchPredictors
функция.
Извлеките данные о метке из массива входящей ячейки и конкатенируйте в категориальный массив вдоль второго измерения.
Одногорячий кодируют категориальные метки в числовые массивы. Кодирование в первую размерность производит закодированный массив, который совпадает с формой сетевого выхода.
function [X,Y] = preprocessMiniBatch(XCell,YCell) % Preprocess predictors. X = preprocessMiniBatchPredictors(XCell); % Extract label data from cell and concatenate. Y = cat(2,YCell{1:end}); % One-hot encode labels. Y = onehotencode(Y,1); end
Мини-пакетные предикторы, предварительно обрабатывающие функцию
preprocessMiniBatchPredictors
функция предварительно обрабатывает мини-пакет предикторов путем извлечения данных изображения из входного массива ячеек, и конкатенируйте в числовой массив. Для полутонового входа, конкатенирующего по четвертой размерности, добавляет третью размерность в каждое изображение, чтобы использовать в качестве одноэлементной размерности канала.
function X = preprocessMiniBatchPredictors(XCell) % Concatenate. X = cat(4,XCell{1:end}); end
dlnetwork
ОбъектЗагрузите предварительно обученную сеть.
net = squeezenet;
Преобразуйте сеть в график слоев, удалите выходной слой и преобразуйте его в dlnetwork
объект.
lgraph = layerGraph(net);
lgraph = removeLayers(lgraph,'ClassificationLayer_predictions');
dlnet = dlnetwork(lgraph);
Learnables
свойство dlnetwork
объект является таблицей, которая содержит настраиваемые параметры сети. Таблица включает параметры вложенных слоев в отдельных строках. Просмотрите первые несколько строк learnables таблицы.
learnables = dlnet.Learnables; head(learnables)
ans=8×3 table
Layer Parameter Value
__________________ _________ ___________________
"conv1" "Weights" {3x3x3x64 dlarray}
"conv1" "Bias" {1x1x64 dlarray}
"fire2-squeeze1x1" "Weights" {1x1x64x16 dlarray}
"fire2-squeeze1x1" "Bias" {1x1x16 dlarray}
"fire2-expand1x1" "Weights" {1x1x16x64 dlarray}
"fire2-expand1x1" "Bias" {1x1x64 dlarray}
"fire2-expand3x3" "Weights" {3x3x16x64 dlarray}
"fire2-expand3x3" "Bias" {1x1x64 dlarray}
Заморозить настраиваемые параметры сети, цикла по настраиваемым параметрам и установить изучить уровень на 0 использований setLearnRateFactor
функция.
factor = 0; numLearnables = size(learnables,1); for i = 1:numLearnables layerName = learnables.Layer(i); parameterName = learnables.Parameter(i); dlnet = setLearnRateFactor(dlnet,layerName,parameterName,factor); end
Чтобы использовать обновленный изучают факторы уровня, когда обучение, необходимо передать объект dlnetwork функции обновления в пользовательском учебном цикле. Например, используйте команду
[dlnet,velocity] = sgdmupdate(dlnet,gradients,velocity);
dlnetwork
функционируйте поддерживает слои описанные ниже и пользовательские слои без прямых функций, возвращающих непустое значение памяти.
Слой | Описание |
---|---|
Изображение ввело входные параметры слоя 2D изображения к сети, и применяет нормализацию данных. | |
Входной слой 3-D изображения вводит 3-D изображения или объемы к сети и применяет нормализацию данных. | |
Последовательность ввела входные данные о последовательности слоя к сети. | |
Функция ввела входные данные о функции слоя в сеть, и применяет нормализацию данных. Используйте этот слой, когда у вас будет набор данных числовых скаляров, представляющих функции (данные без пространственных или измерений времени). |
Слой | Описание |
---|---|
2D сверточный слой применяет скользящие сверточные фильтры к входу. | |
3-D сверточный слой применяет скользящие кубовидные фильтры свертки к 3D входу. | |
2D сгруппированный сверточный слой разделяет входные каналы на группы и применяет скользящие сверточные фильтры. Используйте сгруппированные сверточные слои для отделимого мудрого каналом (также известный мудрыми глубиной отделимый) свертка. | |
Транспонированный 2D слой свертки сверхдискретизировал карты функции. | |
Транспонированный 3-D слой свертки сверхдискретизировал 3D карты функции. | |
Полносвязный слой умножает вход на матрицу веса и затем добавляет вектор смещения. |
Слой | Описание |
---|---|
Последовательность ввела входные данные о последовательности слоя к сети. | |
Слой LSTM изучает долгосрочные зависимости между временными шагами в данных о последовательности и временных рядах. | |
Двунаправленный слой LSTM (BiLSTM) изучает двунаправленные долгосрочные зависимости между временными шагами данных о последовательности или временных рядов. Эти зависимости могут быть полезными, когда это необходимо, сеть, чтобы извлечь уроки из полных временных рядов на каждом временном шаге. | |
Слой ГРУ изучает зависимости между временными шагами в данных о последовательности и временных рядах. |
Для lstmLayer
, bilstmLayer
, и gruLayer
объекты, dlnetwork
уровни поддержки объектов со значениями по умолчанию для StateActivationFunction
и GateActivationFunction
свойства.
Слой | Описание |
---|---|
Слой ReLU выполняет пороговую операцию к каждому элементу входа, где любое значение меньше, чем нуль обнуляется. | |
Текучий слой ReLU выполняет пороговую операцию, где любое входное значение меньше, чем нуль умножается на фиксированный скаляр. | |
Отсеченный слой ReLU выполняет пороговую операцию, где любое входное значение, меньше, чем нуль обнуляются и любое значение выше потолка усечения, установлено в тот потолок усечения. | |
Слой активации ELU выполняет единичную операцию на положительных входных параметрах и экспоненциальную нелинейность на отрицательных входных параметрах. | |
Гиперболическая касательная (tanh) слой активации применяет функцию tanh на входные параметры слоя. | |
softmax слой применяет функцию softmax к входу. |
Слой | Описание |
---|---|
Слой нормализации партии. нормирует каждый входной канал через мини-пакет. Чтобы ускорить обучение сверточных нейронных сетей и уменьшать чувствительность к сетевой инициализации, используйте слои нормализации партии. между сверточными слоями и нелинейностью, такой как слои ReLU. | |
Слой нормализации группы делит каналы входных данных в группы и нормирует активации через каждую группу. Чтобы ускорить обучение сверточных нейронных сетей и уменьшать чувствительность к сетевой инициализации, используйте слои нормализации группы между сверточными слоями и нелинейностью, такой как слои ReLU. Можно выполнить нормализацию экземпляра и нормализацию слоя путем определения соответствующего номера групп. | |
Мудрый каналом локальный ответ (межканальный) слой нормализации выполняет мудрую каналом нормализацию. | |
Слой уволенного случайным образом обнуляет входные элементы с данной вероятностью. | |
2D слой обрезки применяет 2D обрезку к входу. |
Слой | Описание |
---|---|
Средний слой объединения выполняет субдискретизацию путем деления входа на прямоугольные области объединения и вычисление средних значений каждой области. | |
3-D средний слой объединения выполняет субдискретизацию путем деления 3D входа на кубовидные области объединения и вычисление средних значений каждой области. | |
Глобальный средний слой объединения выполняет субдискретизацию путем вычисления среднего значения размерностей высоты и ширины входа. | |
3-D глобальный средний слой объединения выполняет субдискретизацию путем вычисления среднего значения высоты, ширины и размерностей глубины входа. | |
Макс. слой объединения выполняет субдискретизацию путем деления входа на прямоугольные области объединения и вычисления максимума каждой области. | |
3-D макс. слой объединения выполняет субдискретизацию путем деления 3D входа на кубовидные области объединения и вычисления максимума каждой области. | |
Глобальная переменная макс. объединение слоя выполняет субдискретизацию путем вычисления максимума размерностей высоты и ширины входа. | |
3-D глобальная переменная макс. объединение слоя выполняет субдискретизацию путем вычисления максимума высоты, ширины и размерностей глубины входа. | |
Макс. слой необъединения не объединяет выход макс. слоя объединения. |
Слой | Описание |
---|---|
Слой сложения добавляет входные параметры из нескольких поэлементных слоев нейронной сети. | |
Слой умножения умножает входы от нескольких поэлементных слоев нейронной сети. | |
Слой конкатенации глубины берет входные параметры, которые имеют ту же высоту и ширину, и конкатенирует их по третьему измерению (размерность канала). | |
Слой конкатенации берет входные параметры и конкатенирует их в заданном измерении. Входные параметры должны иметь тот же размер во всех размерностях кроме размерности конкатенации. |
dlarray
| dlfeval
| dlgradient
| forward
| layerGraph
| predict
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.