dlupdate

Обновите параметры с помощью пользовательской функции

Описание

пример

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

params = dlupdate(fun,params) обновляет learnable параметры в params путем оценки функционального fun каждым learnable параметром как вход.

[___] = dlupdate(fun,___A1,...,An) также задает дополнительные входные параметры, в дополнение к входным параметрам в предыдущих синтаксисах, когда fun указатель на функцию к функции, которая требует n+1 входные значения.

[___,X1,...,Xm] = dlupdate(fun,___) возвращает несколько выходных параметров X1,...,Xm когда fun указатель на функцию к функции, которая возвращает m+1 выходные значения.

Примеры

свернуть все

Выполните регуляризацию L1 на структуре градиентов параметра.

Создайте демонстрационные входные данные.

dlX = dlarray(rand(100,100,3),'SSC');

Инициализируйте learnable параметры для операции свертки.

params.Weights = dlarray(rand(10,10,3,50));
params.Bias = dlarray(rand(50,1));

Вычислите градиенты для операции свертки с помощью функции помощника convGradients, заданный в конце этого примера.

grads = dlfeval(@convGradients,dlX,params);

Задайте фактор регуляризации.

L1Factor = 0.001;

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

L1Regularizer = @(grad,param) grad + L1Factor.*sign(param);

Используйте dlupdate чтобы применить регуляризацию функционируют к каждому из градиентов.

grads = dlupdate(L1Regularizer,grads,params);

Градиенты в grads теперь упорядочены согласно функциональному L1Regularizer.

convGradients Функция

convGradients функция помощника берет learnable параметры операции свертки и мини-пакет входных данных dlX, и возвращает градиенты относительно learnable параметров.

function grads = convGradients(dlX,params)
dlY = dlconv(dlX,params.Weights,params.Bias);
dlY = sum(dlY,'all');
grads = dlgradient(dlY,params);
end

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

Загрузите обучающие данные

Загрузите обучающие данные цифр.

[XTrain,YTrain] = digitTrain4DArrayData;
classes = categories(YTrain);
numClasses = numel(classes);

Задайте сеть

Задайте сетевую архитектуру и задайте среднее изображение с помощью 'Mean' опция в изображении ввела слой.

layers = [
    imageInputLayer([28 28 1], 'Name','input','Mean',mean(XTrain,4))
    convolution2dLayer(5,20,'Name','conv1')
    reluLayer('Name', 'relu1')
    convolution2dLayer(3,20,'Padding',1,'Name','conv2')
    reluLayer('Name','relu2')
    convolution2dLayer(3,20,'Padding',1,'Name','conv3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(numClasses,'Name','fc')];
lgraph = layerGraph(layers);

Создайте dlnetwork объект из графика слоя.

dlnet = dlnetwork(lgraph);

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

Создайте функциональный modelGradients, перечисленный в конце этого примера, который берет dlnetwork объект dlnet и мини-пакет входных данных dlX с соответствием маркирует Y, и возвращает потерю и градиенты потери относительно learnable параметров в dlnet.

Задайте стохастическую функцию градиентного спуска

Создайте функциональный sgdFunction, перечисленный в конце этого примера, который берет param и paramGradient, learnable параметр и градиент потери относительно того параметра, соответственно. Функция возвращает обновленный параметр с помощью стохастического алгоритма градиентного спуска, выраженного как

θl+1=θ-αE(θl)

где l номер итерации, α>0 темп обучения, θ вектор параметра, и E(θ) функция потерь.

Задайте опции обучения

Задайте опции, чтобы использовать во время обучения.

miniBatchSize = 128;
numEpochs = 20;
numObservations = numel(YTrain);
numIterationsPerEpoch = floor(numObservations./miniBatchSize);

Обучайтесь на графическом процессоре, если вы доступны. Используя графический процессор требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше.

executionEnvironment = "auto";

Инициализируйте скоростной параметр.

learnRate = 0.001;

Инициализируйте график процесса обучения.

plots = "training-progress";
if plots == "training-progress"
    iteration = 1;
    figure
    lineLossTrain = animatedline;
    xlabel("Total Iterations")
    ylabel("Loss")
end

Обучите сеть

Обучите модель с помощью пользовательского учебного цикла. В течение каждой эпохи переставьте данные и цикл по мини-пакетам данных. Обновите сетевые параметры путем вызова dlupdate с функциональным sgdFunction заданный в конце этого примера. В конце каждой эпохи отобразите прогресс обучения.

for epoch = 1:numEpochs
    % Shuffle data.
    idx = randperm(numel(YTrain));
    XTrain = XTrain(:,:,:,idx);
    YTrain = YTrain(idx);
    
    for i = 1:numIterationsPerEpoch
        
        % 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 and loss using dlfeval and the
        % modelGradients function.
        [grad,loss] = dlfeval(@modelGradients,dlnet,dlX,Y);
        
        % Update the network parameters using the SGD algorithm defined in the 
        % function sgdFunction.
        dlnet = dlupdate(@sgdFunction,dlnet,grad);
        
        % Display the training progress.
        if plots == "training-progress"
            addpoints(lineLossTrain,iteration,double(gather(extractdata(loss))))
            title("Loss During Training: Epoch - " + epoch + "; Iteration - " + i)
            drawnow
            iteration = iteration + 1;
        end
    end
end

Протестируйте сеть

Протестируйте точность классификации модели путем сравнения прогнозов на наборе тестов с истинными метками.

[XTest, YTest] = digitTest4DArrayData;

Преобразуйте данные в dlarray объект с форматом размерности 'SSCB'. Для прогноза графического процессора также преобразуйте данные в gpuArray.

dlXTest = dlarray(XTest,'SSCB');
if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu"
    dlXTest = gpuArray(dlXTest);
end

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

dlYPred = predict(dlnet,dlXTest);
[~,idx] = max(extractdata(dlYPred),[],1);
YPred = classes(idx);

Оцените точность классификации.

accuracy = mean(YPred==YTest)
accuracy = 0.7282

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

Функциональный modelGradients берет dlnetwork объект dlnet и мини-пакет входных данных dlX с соответствием маркирует Y, и возвращает потерю и градиенты потери относительно learnable параметров в dlnet. Чтобы вычислить градиенты автоматически, используйте dlgradient функция.

function [gradients,loss] = modelGradients(dlnet,dlX,Y)
    dlYPred = forward(dlnet,dlX);
    dlYPred = softmax(dlYPred);
    
    loss = crossentropy(dlYPred,Y);
    gradients = dlgradient(loss,dlnet.Learnables);
end

Стохастическая функция градиентного спуска

Функциональный sgdFunction берет param и paramGradient, learnable параметр и градиент потери относительно того параметра, и возвращают обновленный параметр с помощью стохастического алгоритма градиентного спуска, выраженного как

θl+1=θ-αE(θl)

где l номер итерации, α>0 темп обучения, θ вектор параметра, и E(θ) функция потерь.

function param = sgdFunction(param,paramGradient)
    learnRate = 0.01;
    param = param - learnRate.*paramGradient;
end

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

свернуть все

Функция, чтобы примениться к learnable параметрам, определенному функцией указателю.

dlupate оценивает fun каждым сетевым learnable параметром как вход. fun оценивается так же много раз, как существуют массивы learnable параметров в dlnet или params.

Сеть, заданная как dlnetwork объект.

Функция обновляет dlnet.Learnables свойство dlnetwork объект. dlnet.Learnables таблица с тремя переменными:

  • Layer — Имя слоя, заданное как скаляр строки.

  • Parameter — Название параметра, заданное как скаляр строки.

  • Value — Значение параметра, заданного как массив ячеек, содержащий dlarray.

Сетевые learnable параметры, заданные как dlarray, числовой массив, массив ячеек, структура или таблица.

Если вы задаете params как таблица, это должно содержать следующие три переменные.

  • Layer — Имя слоя, заданное как скаляр строки.

  • Parameter — Название параметра, заданное как скаляр строки.

  • Value — Значение параметра, заданного как массив ячеек, содержащий dlarray.

Можно задать params как контейнер learnable параметров для вашей сети с помощью массива ячеек, структуры, или таблицы, или вложенных массивов ячеек или структур. learnable параметрами в массиве ячеек, структуре или таблице должен быть dlarray или числовые значения типа данных double или single.

Входной параметр grad должен быть обеспечен точно совпадающим типом данных, упорядоченным расположением и полями (для структур) или переменные (для таблиц) как params.

Типы данных: single | double | struct | table | cell

Дополнительные входные параметры к fun, заданный как dlarray объекты, числовые массивы, массивы ячеек, структуры или таблицы с Value переменная.

Точная форма A1,...,An зависит от входа сетевые или learnable параметры. Следующая таблица показывает требуемый формат для A1,...,An для возможных входных параметров к dlupdate.

Входной параметрПараметры LearnableA1,...,An
dlnetТаблица dlnet.Learnables содержа Layer, Parameter, и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый learnable параметр как dlarray. Таблица с совпадающим типом данных, переменными, и заказывающий как dlnet.Learnables. A1,...,An должен иметь Value переменная, состоящая из массивов ячеек, которые содержат дополнительные входные параметры для функционального fun применяться к каждому learnable параметру.
paramsdlarraydlarray с совпадающим типом данных и заказывающий как params
Числовой массивЧисловой массив с совпадающим типом данных и заказывающий как params
CellArrayМассив ячеек с совпадающими типами данных, структурой, и заказывающий как params
СтруктураСтруктура с совпадающими типами данных, полями, и заказывающий как params
Таблица с Layer, Parameter, и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый learnable параметр как dlarray.Таблица с совпадающими типами данных, переменными и заказывающий как params. A1,...,An должен иметь Value переменная, состоящая из массивов ячеек, которые содержат дополнительный входной параметр для функционального fun применяться к каждому learnable параметру.

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

свернуть все

Сеть, возвращенная как dlnetwork объект.

Функция обновляет dlnet.Learnables свойство dlnetwork объект.

Обновленные сетевые learnable параметры, возвращенные как dlarray, числовой массив, массив ячеек, структура или таблица с Value переменная, содержащая обновленные learnable параметры сети.

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

Точная форма X1,...,Xm зависит от входа сетевые или learnable параметры. Следующая таблица показывает возвращенный формат X1,...,Xm для возможных входных параметров к dlupdate.

Входной параметрПараметры LearnableX1,...,Xm
dlnetТаблица dlnet.Learnables содержа Layer, Parameter, и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый learnable параметр как dlarray. Таблица с совпадающим типом данных, переменными, и заказывающий как dlnet.Learnables. X1,...,Xm имеет Value переменная, состоящая из массивов ячеек, которые содержат дополнительные выходные аргументы функционального fun примененный каждый learnable параметр.
paramsdlarraydlarray с совпадающим типом данных и заказывающий как params
Числовой массивЧисловой массив с совпадающим типом данных и заказывающий как params
CellArrayМассив ячеек с совпадающими типами данных, структурой, и заказывающий как params
СтруктураСтруктура с совпадающими типами данных, полями, и заказывающий как params
Таблица с Layer, Parameter, и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый learnable параметр как dlarray.Таблица с совпадающими типами данных, переменными. и упорядоченное расположение как params. X1,...,Xm имеет Value переменная, состоящая из массивов ячеек, которые содержат дополнительный выходной аргумент функционального fun примененный каждый learnable параметр.

Введенный в R2019b

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