exponenta event banner

dlnetwork

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

Описание

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

Совет

Для выполнения большинства задач глубокого обучения можно использовать предварительно подготовленную сеть и адаптировать ее к собственным данным. Пример, показывающий, как использовать transfer learning для переподготовки сверточной нейронной сети для классификации нового набора изображений, см. в разделе Train Deep Learning Network to Classify New Images. Кроме того, можно создавать и обучать сети с нуля с помощью 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. Этот синтаксис используется для создания неинициализированной сети.

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

Входные аргументы

развернуть все

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

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

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

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

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

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

Примеры входных данных не поддерживаются, если tf имеет значение false.

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

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

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

Свойства

развернуть все

Сетевые уровни, указанные как 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 слоя learnable параметр
setLearnRateFactorУстановка коэффициента скорости обучения обучаемого параметра уровня
getLearnRateFactorПолучить коэффициент скорости обучения обучаемого параметра уровня
getL2FactorПолучите фактор регуляризации L2 слоя learnable параметр

Примеры

свернуть все

Чтобы внедрить индивидуальный цикл обучения для сети, сначала преобразуйте его в 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'}
    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 - число итераций, α0 - начальная скорость обучения, а k - затухание.

Загрузка данных обучения

Загрузите данные цифр как хранилище данных изображения с помощью 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. Для автоматического изменения размеров учебных изображений используйте хранилище данных дополненного изображения. Укажите дополнительные операции увеличения, выполняемые на обучающих изображениях: случайное перемещение изображений до 5 пикселей в горизонтальной и вертикальной осях. Увеличение объема данных помогает предотвратить переоборудование сети и запоминание точных деталей обучающих изображений.

inputSize = [28 28 1];
pixelRange = [-5 5];
imageAugmenter = imageDataAugmenter( ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain,'DataAugmentation',imageAugmenter);

Чтобы автоматически изменять размер изображений проверки без дальнейшего увеличения данных, используйте хранилище данных дополненного изображения без указания дополнительных операций предварительной обработки.

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. Не добавляйте формат к меткам класса.

  • Обучение на GPU, если он доступен. По умолчанию minibatchqueue объект преобразует каждый вывод в gpuArray если графический процессор доступен. Для использования графического процессора требуется Toolbox™ параллельных вычислений и поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (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 функция, перечисленная в конце примера.

  • Для одиночного вывода хранилища данных укажите формат мини-пакета. '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, a 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 функция предварительно обрабатывает мини-пакет предикторов и меток, используя следующие шаги:

  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

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

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);

Learnables имущества dlnetwork - это таблица, содержащая обучаемые параметры сети. Таблица содержит параметры вложенных слоев в отдельных строках. Просмотрите первые несколько строк таблицы обучаемых элементов.

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 автоматически инициализируется во время обучения. Дополнительные сведения см. в разделе Состав сети глубокого обучения.

Подробнее

развернуть все

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

развернуть все

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

..
Представлен в R2019b