Обновляйте параметры с помощью стохастического градиентного спуска с импульсом (SGDM)
Обновите сетевые настраиваемые параметры в пользовательском цикле обучения с помощью алгоритма стохастического градиента с импульсом (SGDM).
Примечание
Эта функция применяет алгоритм оптимизации SGDM, чтобы обновить сетевые параметры в пользовательских циклах обучения, которые используют сети, определенные как dlnetwork
объекты или функции модели. Если вы хотите обучить сеть, определенную как Layer
массив или как LayerGraph
, используйте следующие функции:
Создайте TrainingOptionsSGDM
использование объекта trainingOptions
функция.
Используйте TrainingOptionsSGDM
объект с trainNetwork
функция.
sgdmupdate
Выполните один шаг обновления SGDM с глобальной скоростью обучения 0.05
и импульс 0.95
.
Создайте параметры и градиенты параметров как числовые массивы.
params = rand(3,3,4); grad = ones(3,3,4);
Инициализируйте скорости параметров для первой итерации.
vel = [];
Задайте пользовательские значения для глобальной скорости обучения и импульса.
learnRate = 0.05; momentum = 0.95;
Обновляйте настраиваемые параметры с помощью sgdmupdate
.
[params,vel] = sgdmupdate(params,grad,vel,learnRate,momentum);
sgdmupdate
Использование sgdmupdate
для обучения сети с помощью алгоритма SGDM.
Загрузка обучающих данных
Загрузите обучающие данные цифр.
[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') softmaxLayer('Name','softmax')]; lgraph = layerGraph(layers);
Создайте dlnetwork
объект из графика слоев.
dlnet = dlnetwork(lgraph);
Задайте функцию градиентов модели
Создайте вспомогательную функцию modelGradients
, перечисленный в конце примера. Функция принимает dlnetwork
dlnet объекта
и мини-пакет входных данных dlX
с соответствующими метками Y
, и возвращает потерю и градиенты потери относительно настраиваемых параметров в dlnet
.
Настройка опций обучения
Задайте опции, которые будут использоваться во время обучения.
miniBatchSize = 128; numEpochs = 20; numObservations = numel(YTrain); numIterationsPerEpoch = floor(numObservations./miniBatchSize);
Обучите на графическом процессоре, если он доступен. Для использования графический процессор требуется Parallel Computing Toolbox™ и поддерживаемый графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox).
executionEnvironment = "auto";
Визуализируйте процесс обучения на графике.
plots = "training-progress";
Обучите сеть
Обучите модель с помощью пользовательского цикла обучения. Для каждой эпохи перетасуйте данные и закольцовывайте по мини-пакетам данных. Обновляйте параметры сети с помощью 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
Инициализируйте параметр скорости.
vel = [];
Обучите сеть.
iteration = 0; start = tic; for epoch = 1:numEpochs % Shuffle data. idx = randperm(numel(YTrain)); XTrain = XTrain(:,:,:,idx); YTrain = YTrain(idx); 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 a dlarray. dlX = dlarray(single(X),'SSCB'); % If training on a GPU, then convert data to a gpuArray. if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu" dlX = gpuArray(dlX); end % Evaluate the model gradients and loss using dlfeval and the % modelGradients helper function. [gradients,loss] = dlfeval(@modelGradients,dlnet,dlX,Y); % Update the network parameters using the SGDM optimizer. [dlnet,vel] = sgdmupdate(dlnet,gradients,vel); % 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
Чтобы классифицировать изображения с помощью dlnetwork
объект, используйте predict
функция и найти классы с самыми высокими счетами.
dlYPred = predict(dlnet,dlXTest); [~,idx] = max(extractdata(dlYPred),[],1); YPred = classes(idx);
Оцените точность классификации.
accuracy = mean(YPred==YTest)
accuracy = 0.9916
Функция градиентов модели
The modelGradients
Функция helper принимает dlnetwork
dlnet объекта
и мини-пакет входных данных dlX
с соответствующими метками Y
, и возвращает потерю и градиенты потери относительно настраиваемых параметров в dlnet
. Чтобы вычислить градиенты автоматически, используйте dlgradient
функция.
function [gradients,loss] = modelGradients(dlnet,dlX,Y) dlYPred = forward(dlnet,dlX); loss = crossentropy(dlYPred,Y); gradients = dlgradient(loss,dlnet.Learnables); end
dlnet
- Сетьdlnetwork
объектСеть, заданная как dlnetwork
объект.
Функция обновляет dlnet.Learnables
свойство dlnetwork
объект. dlnet.Learnables
- таблица с тремя переменными:
Layer
- Имя слоя, заданное как строковый скаляр.
Parameter
- Имя параметра, заданное как строковый скаляр.
Value
- Значение параметра, заданное как массив ячеек, содержащий dlarray
.
Входной параметр grad
должна быть таблицей той же формы, что и dlnet.Learnables
.
params
- Параметры, учитываемые в сетиdlarray
| числовой массив | массив ячеек | структуру | таблицуСетевые настраиваемые параметры, заданная как dlarray
, числовой массив, массив ячеек, структура или таблица.
Если вы задаете params
как таблица, она должна содержать следующие три переменные.
Layer
- Имя слоя, заданное как строковый скаляр.
Parameter
- Имя параметра, заданное как строковый скаляр.
Value
- Значение параметра, заданное как массив ячеек, содержащий dlarray
.
Можно задать params
как контейнер настраиваемых параметров для сети с помощью массива ячеек, структуры или таблицы или вложенных массивов ячеек или структур. Настраиваемые параметры в массиве ячеек, структуре или таблице должны быть dlarray
или числовые значения типа данных double
или single
.
Входной параметр grad
должны быть снабжены точно совпадающим типом данных, упорядоченным расположением и полями (для структур) или переменными (для таблиц), как params
.
Типы данных: single
| double
| struct
| table
| cell
grad
- Градиенты потерьdlarray
| числовой массив | массив ячеек | структуру | таблицуГрадиенты потерь, заданные как dlarray
, числовой массив, массив ячеек, структура или таблица.
Точная форма grad
зависит от входа сети или настраиваемых параметров. В следующей таблице показан необходимый формат для grad
для возможных входов в sgdmupdate
.
Вход | Настраиваемые параметры | Градиенты |
---|---|---|
dlnet | Табличные dlnet.Learnables содержащие Layer , Parameter , и Value переменные. The Value переменная состоит из массивов ячеек, которые содержат каждый настраиваемый параметр в виде dlarray . | Таблица с совпадающим типом данных, переменными и порядком, что и dlnet.Learnables . grad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат градиент каждого настраиваемого параметра. |
params | dlarray | dlarray с совпадающим типом данных и порядком, что и params
|
Числовой массив | Числовой массив с совпадающим типом данных и порядком, что и params
| |
Массив ячеек | Массив ячеек с совпадающими типами данных, структурой и порядком, как params | |
Структура | Структура с совпадающими типами данных, полями и порядками, что и params | |
Таблица с Layer , Parameter , и Value переменные. The Value переменная должна состоять из массивов ячеек, которые содержат каждый настраиваемый параметр в виде dlarray . | Таблица с совпадающими типами данных, переменными и порядками, что и params . grad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат градиент каждого настраиваемого параметра. |
Можно получить grad
из вызова в dlfeval
которая оценивает функцию, содержащую вызов на dlgradient
. Для получения дополнительной информации смотрите Использование автоматической дифференциации в Deep Learning Toolbox.
vel
- Скорости параметра[]
| dlarray
| числовой массив | массив ячеек | структуру | таблицуСкорости параметра, заданные как пустой массив, a dlarray
, числовой массив, массив ячеек, структура или таблица.
Точная форма vel
зависит от входа сети или настраиваемых параметров. В следующей таблице показан необходимый формат для vel
для возможных входов в sgdmpdate
.
Вход | Настраиваемые параметры | Скорости |
---|---|---|
dlnet | Табличные dlnet.Learnables содержащие Layer , Parameter , и Value переменные. The Value переменная состоит из массивов ячеек, которые содержат каждый настраиваемый параметр в виде dlarray . | Таблица с совпадающим типом данных, переменными и порядком, что и dlnet.Learnables . vel должен иметь Value переменная, состоящая из массивов ячеек, которые содержат скорость каждого настраиваемого параметра. |
params | dlarray | dlarray с совпадающим типом данных и порядком, что и params
|
Числовой массив | Числовой массив с совпадающим типом данных и порядком, что и params
| |
Массив ячеек | Массив ячеек с совпадающими типами данных, структурой и порядком, как params | |
Структура | Структура с совпадающими типами данных, полями и порядками, что и params | |
Таблица с Layer , Parameter , и Value переменные. The Value переменная должна состоять из массивов ячеек, которые содержат каждый настраиваемый параметр в виде dlarray . | Таблица с совпадающими типами данных, переменными и порядками, что и params . vel должен иметь Value переменная, состоящая из массивов ячеек, которые содержат скорость каждого настраиваемого параметра. |
Если вы задаете vel
в качестве пустого массива функция не принимает предыдущих скоростей и запускается так же, как и для первого обновления в серии итераций. Чтобы итерационно обновить настраиваемые параметры, используйте vel
выход предыдущего вызова на sgdmupdate
как vel
вход.
learnRate
- Глобальная скорость обучения0.01
(по умолчанию) | положительная скалярная величинаСкорость обучения, заданная как положительная скалярная величина. Значение по умолчанию learnRate
является 0.01
.
Если вы задаете сетевые параметры как dlnetwork
объект, скорость обучения для каждого параметра является глобальной скоростью обучения, умноженной на соответствующее свойство коэффициента скорости обучения, заданное в слоях сети.
momentum
- Импульс0.9
(по умолчанию) | положительная скалярная величина между 0
и 1
Импульс, заданный как положительная скалярная величина между 0 и
1
. Значение по умолчанию momentum
является 0.9
.
dlnet
- Обновленная сетьdlnetwork
объектСеть, возвращается как dlnetwork
объект.
Функция обновляет dlnet.Learnables
свойство dlnetwork
объект.
params
- Обновленные настраиваемые параметры сетиdlarray
| числовой массив | массив ячеек | структуру | таблицуОбновлённые сетевые настраиваемые параметры, возвращенный как dlarray
, числовой массив, массив ячеек, структура или таблица с Value
переменная, содержащая обновленные настраиваемые параметры сети.
vel
- Обновленные скорости параметровdlarray
| числовой массив | массив ячеек | структуру | таблицуОбновленные скорости параметра, возвращенные как dlarray
, числовой массив, массив ячеек, структура или таблица.
Функция использует стохастический градиентный спуск с алгоритмом импульса, чтобы обновить настраиваемые параметры. Для получения дополнительной информации смотрите определение стохастического градиентного спуска с алгоритмом импульса под Стохастическим градиентным спуском на trainingOptions
страница с описанием.
Указания и ограничения по применению:
Когда по крайней мере один из следующих входных параметров является gpuArray
или dlarray
с базовыми данными типа gpuArray
эта функция выполняется на графическом процессоре.
grad
params
Для получения дополнительной информации смотрите Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox).
adamupdate
| dlarray
| dlfeval
| dlgradient
| dlnetwork
| dlupdate
| forward
| rmspropupdate
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.