dlnetwork

Нейронная сеть для глубокого обучения для пользовательских циклов обучения

Описание

A dlnetwork объект включает поддержку пользовательских циклов обучения с помощью автоматической дифференциации.

Совет

Для большинства задач глубокого обучения можно использовать предварительно обученную сеть и адаптировать ее к собственным данным. Для примера, показывающего, как использовать передачу обучения для переобучения сверточной нейронной сети для классификации нового набора изображений, смотрите Train Нейронной сети для глубокого обучения для классификации новых изображений. Также можно создавать и обучать сети с нуля, используя layerGraph объекты с trainNetwork и trainingOptions функций.

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

Создание

Описание

пример

dlnet = dlnetwork(layers) преобразует слои сети, указанные в layers в инициализированный dlnetwork объект, представляющий глубокую нейронную сеть для использования с пользовательскими циклами обучения. layers может быть LayerGraph объект или Layer массив. layers должен содержать слой входа.

Инициализированный dlnetwork объект готов к обучению. Настраиваемые параметры и значения состояний dlnet инициализируются для обучения с начальными значениями на основе размера входа, заданного входным слоем сети.

пример

dlnet = dlnetwork(layers,dlX1,...,dlXn) создает инициализированную dlnetwork объект, используя входные входы примера dlX1,...,dlXn. Настраиваемые параметры и значения состояний dlnet инициализируются начальными значениями на основе размера входа и формата, заданных входными входами примера. Используйте этот синтаксис для создания инициализированного dlnetwork с входами, которые не соединены с входным слоем.

пример

dlnet = dlnetwork(layers,'Initialize',tf) задает, возвращать ли инициализированное или неинициализированное dlnetwork. Используйте этот синтаксис для создания неинициализированной сети.

Неинициализированная сеть имеет неактивные, пустые значения для параметров learnable и state и не готова к обучению. Необходимо инициализировать неинициализированную dlnetwork прежде чем вы сможете использовать его. Создайте неинициализированную сеть, когда вы хотите отложить инициализацию до более поздней точки. Можно использовать неинициализированные dlnetwork объекты для создания сложных сетей с помощью промежуточных базовых блоков, которые затем соединяются вместе, например, с помощью рабочих процессов Нейронной Сети для Глубокого Обучения Composition. Можно инициализировать неинициализированную dlnetwork использование initialize функция.

Входные параметры

расширить все

Слои сети, заданные как LayerGraph объект или как Layer массив.

Если layers является Layer массив, затем dlnetwork функция соединяет слои последовательно.

Слои сети не должны содержать выходные слои. При обучении сети вычислите потери отдельно.

Список слоев, поддерживаемых dlnetwork, см. «Поддерживаемые слои».

Пример входов сети, заданный как форматированный dlarray объекты. Программное обеспечение распространяет входные входы примера через сеть, чтобы определить соответствующие размеры и форматы обучаемых и параметров состояния dlnetwork.

Входы примера должны быть отформатированы dlarray объекты. Когда layers является Layer array, предоставьте примеры входов в том же порядке, в котором слои, которые требуют входов, появляются в Layer массив. Когда layers является LayerGraph object, предоставить примеры входов в том же порядке, в котором слои, которые требуют входов, появляются в Layers свойство LayerGraph.

Входы примера не поддерживаются при tf является ложным.

Флаг для возврата инициализированных dlnetwork, заданный как число или логическое 1 (true) или 0 (false).

Если tf является true или 1, обучаемые и параметры состояния dlnet инициализируются начальными значениями для обучения в соответствии с входным слоем сети или предоставленными входными входами примера.

Если tf false, learnable и параметры состояния не инициализированы. Прежде чем вы используете неинициализированную сеть, необходимо сначала инициализировать ее с помощью initialize функция. Входы примера не поддерживаются при tf является ложным.

Свойства

расширить все

Слои сети, заданные как Layer массив.

Соединения слоев, заданные как таблица с двумя столбцами.

Каждая строка таблицы представляет соединение в графике слоев. Первый столбец Source, определяет источник каждого соединения. Второй столбец, Destination, определяет адресат каждого соединения. Источники соединений и адресаты являются именами слоев или имеют форму 'layerName/IOName', где 'IOName' - имя входного или выходного параметра слоя.

Типы данных: table

Сетевые настраиваемые параметры, заданная как таблица с тремя столбцами:

  • Layer - Имя слоя, заданное как строковый скаляр.

  • Parameter - Имя параметра, заданное как строковый скаляр.

  • Value - Значение параметра, заданное как dlarray объект.

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

Типы данных: table

Состояние сети, заданное как таблица.

Сетевое состояние представляет собой таблицу с тремя столбцами:

  • Layer - Имя слоя, заданное как строковый скаляр.

  • Parameter - Имя параметра, заданное как строковый скаляр.

  • Value - Значение параметра, заданное как dlarray объект.

Сетевое состояние содержит информацию, запоминаемую сетью между итерациями. Для примера - состояние слоев LSTM и нормализации партии ..

Во время обучения или вывода можно обновить состояние сети с помощью выхода forward и predict функций.

Типы данных: table

Имена сетевого входного слоя, заданные как массив ячеек из векторов символов.

Типы данных: cell

Имена выходного слоя сети, заданные как массив ячеек из векторов символов. Это свойство включает все слои с отключенными выходами. Если слой имеет несколько выходов, отключенные выходные параметры заданы как 'layerName/outputName'.

Типы данных: cell

Это свойство доступно только для чтения.

Флаг для инициализированной сети, заданный как 0 или 1.

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

Если Initialized является 1сеть инициализируется и может использоваться для обучения и вывода. Если вы меняете значения настраиваемых параметров - например, во время обучения - значение Initialized остается 1.

Типы данных: logical

Функции объекта

forwardВычислите выход нейронной сети для глубокого обучения для обучения
predictВычислите выход нейронной сети для глубокого обучения для вывода
initializeИнициализируйте обучаемые и параметры состояния dlnetwork
layerGraphГрафик слоев сети для глубокого обучения
setL2FactorУстановите коэффициент регуляризации L2 слоя настраиваемого параметра
setLearnRateFactorУстановите коэффициент скорости обучения слоя настраиваемого параметра
getLearnRateFactorПолучите коэффициент скорости обучения слоя настраиваемого параметра
getL2FactorКоэффициент регуляризации L2 слоя настраиваемого параметра

Примеры

свернуть все

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

Загрузите предварительно обученную модель GoogLeNet с помощью googlenet функция. Этой функции требуется Модель Deep Learning Toolbox™ для пакета поддержки GoogLeNet Network. Если этот пакет поддержки не установлен, то функция предоставляет ссылку на загрузку.

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'}
    Initialized: 1

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

Определите сетевую архитектуру. Создайте сеть с двумя ветвями. Сеть принимает два входа с одним входом на ветвь. Соедините ветви с помощью сложения слоя.

numFilters = 24;

layersBranch1 = [
    convolution2dLayer(3,6*numFilters,'Padding','same','Stride',2,'Name','conv1Branch1')
    groupNormalizationLayer('all-channels','Name','gn1Branch1')
    reluLayer('Name','relu1Branch1')
    convolution2dLayer(3,numFilters,'Padding','same','Name','conv2Branch1')
    groupNormalizationLayer('channel-wise','Name','gn2Branch1')
    additionLayer(2,'Name','add')
    reluLayer('Name','reluCombined')
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','sm')];

layersBranch2 = [
    convolution2dLayer(1,numFilters,'Name','convBranch2')
    groupNormalizationLayer('all-channels','Name','gnBranch2')];

lgraph = layerGraph(layersBranch1);
lgraph = addLayers(lgraph,layersBranch2);
lgraph = connectLayers(lgraph,'gnBranch2','add/in2');  

Создайте пример сетевых входов того же формата, что и типичные сетевые входы. Для обоих входов используйте пакет размером 32. Используйте вход размера 64 на 64 с тремя каналами для входа в слой convBranch1. Используйте вход размера 64 на 64 с 18 каналами для входа в слой convBranch2.

dlX1 = dlarray(rand([64 64 3 32]),"SSCB");
dlX2 = dlarray(rand([32 32 18 32]),"SSCB");

Создайте dlnetwork. Предоставьте входы в том же порядке, в котором несвязанные слои появляются в Layers свойство lgraph.

dlnet = dlnetwork(lgraph,dlX1,dlX2);

Проверьте, что сеть инициализирована и готова к обучению.

dlnet.Initialized
ans = 
   1

В этом примере показано, как обучить сеть, которая классифицирует рукописные цифры с пользовательским расписанием скорости обучения.

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

Этот пример обучает сеть классифицировать рукописные цифры с основанным на времени расписанием скорости обучения с распадом: для каждой итерации решатель использует скорость обучения, заданную как ρt=ρ01+kt, где t - число итерации, ρ0 является начальной скоростью обучения, и 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. Чтобы автоматически изменить размер обучающих изображений, используйте дополненный image 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);

Определение сети

Определите сеть для классификации изображений.

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'}

Задайте функцию градиентов модели

Создайте функцию 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™ и поддерживаемый графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox).

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

Функция градиентов модели

The 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

Функция предсказаний модели

The 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

Функция мини-пакетной предварительной обработки

The preprocessMiniBatch функция предварительно обрабатывает мини-пакет предикторов и меток с помощью следующих шагов:

  1. Предварительно обработайте изображения с помощью preprocessMiniBatchPredictors функция.

  2. Извлеките данные метки из входящего массива ячеек и сгруппируйте в категориальный массив по второму измерению.

  3. Однократное кодирование категориальных меток в числовые массивы. Кодирование в первую размерность создает закодированный массив, который совпадает с формой выходного сигнала сети.

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

Функция предварительной обработки мини-пакетных предикторов

The preprocessMiniBatchPredictors функция предварительно обрабатывает мини-пакет предикторов путем извлечения данных изображения из массива входа ячеек и конкатенации в числовой массив. Для входов полутонового цвета, конкатенация по четвертому измерению добавляет третье измерение каждому изображению, чтобы использовать в качестве размерности синглтонного канала.

function X = preprocessMiniBatchPredictors(XCell)

% Concatenate.
X = cat(4,XCell{1:end});

end

Загрузка предварительно обученной сети.

net = squeezenet;

Преобразуйте сеть в график слоев, удалите выход слой и преобразуйте его в dlnetwork объект.

lgraph = layerGraph(net);
lgraph = removeLayers(lgraph,'ClassificationLayer_predictions');
dlnet = dlnetwork(lgraph);

The 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 объект без слоя входа. Создание неинициализированного dlnetwork полезно, когда вы еще не знаете размер и формат входов сети, например, когда dlnetwork вложен в пользовательский слой.

Задайте слои сети. Эта сеть имеет один вход, который не соединяется с входным слоем.

layers = [convolution2dLayer(5,20,'Name','conv')
    batchNormalizationLayer('Name','bn')
    reluLayer('Name','relu')
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','sm')];

Создайте неинициализированную dlnetwork. Установите Initialize name-value опции к false.

dlnet = dlnetwork(layers,'Initialize',false);

Проверьте, что сеть не инициализирована.

dlnet.Initialized
ans = 
   0

Обучаемые и параметры состояния этой сети не инициализируются для обучения. Чтобы инициализировать сеть, используйте initialize функция.

Если вы хотите использовать dlnet непосредственно в пользовательском цикле обучения, тогда вы можете инициализировать его, используя initialize функция и предоставление примера входа.

Если вы хотите использовать dlnet внутри пользовательского слоя можно воспользоваться преимуществами автоматической инициализации. Если вы используете пользовательский слой внутри dlnetwork, dlnet инициализируется, когда родительский элемент dlnetwork создается (или когда родительская сеть инициализируется, если она сконструирована как неинициализированная dlnetwork). Если вы используете пользовательский слой внутри сети, которая обучена с помощью trainNetwork функцию, затем dlnet автоматически инициализируется во время обучения. Для получения дополнительной информации смотрите Нейронную сеть для глубокого обучения Composition.

Подробнее о

расширить все

Вопросы совместимости

расширить все

Расширенные возможности

..
Введенный в R2019b