Обновите параметры с помощью стохастического градиентного спуска с импульсом (SGDM)
Обновите сетевые learnable параметры в пользовательском учебном цикле с помощью стохастического градиентного спуска с импульсом (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;
Обновите learnable параметры с помощью 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')]; lgraph = layerGraph(layers);
Создайте dlnetwork
объект из графика слоя.
dlnet = dlnetwork(lgraph);
Задайте функцию градиентов модели
Создайте функциональный modelGradients
, перечисленный в конце примера, который берет dlnetwork
объект dlnet
, мини-пакет входных данных dlX
с соответствием маркирует Y
и возвращает потерю и градиенты потери относительно learnable параметров в dlnet
.
Задайте опции обучения
Задайте опции, чтобы использовать во время обучения.
miniBatchSize = 128; numEpochs = 20; numObservations = numel(YTrain); numIterationsPerEpoch = floor(numObservations./miniBatchSize);
Обучайтесь на графическом процессоре, если вы доступны. Используя графический процессор требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше.
executionEnvironment = "auto";
Инициализируйте скоростной параметр.
vel = [];
Инициализируйте график процесса обучения.
plots = "training-progress"; if plots == "training-progress" iteration = 1; figure lineLossTrain = animatedline; xlabel("Total Iterations") ylabel("Loss") end
Обучите сеть
Обучите модель с помощью пользовательского учебного цикла. В течение каждой эпохи переставьте данные и цикл по мини-пакетам данных. Обновите сетевые параметры с помощью sgdmupdate
функция. каждой эпохи отобразите прогресс обучения.
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 SGDM optimizer. [dlnet,vel] = sgdmupdate(dlnet,grad,vel); % 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.9914
Функция градиентов модели
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
dlnet
— Сетьdlnetwork
объектСеть, заданная как dlnetwork
объект.
Функция обновляет dlnet.Learnables
свойство dlnetwork
объект. dlnet.Learnables
таблица с тремя переменными:
Layer
— Имя слоя, заданное как скаляр строки.
Parameter
— Название параметра, заданное как скаляр строки.
Value
— Значение параметра, заданного как массив ячеек, содержащий dlarray
.
Входной параметр grad
должна быть таблица той же формы как dlnet.Learnables
.
params
— Сетевые learnable параметрыdlarray
| числовой массив | массив ячеек | структура | таблицаСетевые learnable параметры, заданные как dlarray
, числовой массив, массив ячеек, структура или таблица.
Если вы задаете params
как таблица, это должно содержать следующие три переменные.
Layer
— Имя слоя, заданное как скаляр строки.
Parameter
— Название параметра, заданное как скаляр строки.
Value
— Значение параметра, заданного как массив ячеек, содержащий dlarray
.
Можно задать params
как контейнер learnable параметров для вашей сети с помощью массива ячеек, структуры, или таблицы, или вложенных массивов ячеек или структур. learnable параметрами в массиве ячеек, структуре или таблице должен быть dlarray
или числовые значения типа данных double
или single
.
Входной параметр grad
должен быть обеспечен точно совпадающим типом данных, упорядоченным расположением и полями (для структур) или переменные (для таблиц) как params
.
Типы данных: single
| double
| struct
| table
| cell
grad
— Градиенты потериdlarray
| числовой массив | массив ячеек | структура | таблицаГрадиенты потери, заданной как dlarray
, числовой массив, массив ячеек, структура или таблица.
Точная форма grad
зависит от входа сетевые или learnable параметры. Следующая таблица показывает требуемый формат для grad
для возможных входных параметров к sgdmupdate
.
Входной параметр | Параметры Learnable | Градиенты |
---|---|---|
dlnet | Таблица dlnet.Learnables содержа Layer , Parameter , и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый learnable параметр как dlarray . | Таблица с совпадающим типом данных, переменными, и заказывающий как dlnet.Learnables . grad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат градиент каждого learnable параметра. |
params | dlarray | dlarray с совпадающим типом данных и заказывающий как params
|
Числовой массив | Числовой массив с совпадающим типом данных и заказывающий как params
| |
CellArray | Массив ячеек с совпадающими типами данных, структурой, и заказывающий как params | |
Структура | Структура с совпадающими типами данных, полями, и заказывающий как params | |
Таблица с Layer , Parameter , и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый learnable параметр как dlarray . | Таблица с совпадающими типами данных, переменными, и заказывающий как params . grad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат градиент каждого learnable параметра. |
Можно получить grad
от вызова до dlfeval
это выполняет функцию, которая содержит вызов dlgradient
. Для получения дополнительной информации смотрите Использование Автоматическое Дифференцирование В Deep Learning Toolbox.
vel
— Скорости параметра[]
| dlarray
| числовой массив | массив ячеек | структура | таблицаСкорости параметра, заданные как пустой массив, dlarray
, числовой массив, массив ячеек, структура или таблица.
Точная форма vel
зависит от входа сетевые или learnable параметры. Следующая таблица показывает требуемый формат для vel
для возможных входных параметров к sgdmpdate
.
Входной параметр | Параметры Learnable | Скорости |
---|---|---|
dlnet | Таблица dlnet.Learnables содержа Layer , Parameter , и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый learnable параметр как dlarray . | Таблица с совпадающим типом данных, переменными, и заказывающий как dlnet.Learnables . vel должен иметь Value переменная, состоящая из массивов ячеек, которые содержат скорость каждого learnable параметра. |
params | dlarray | dlarray с совпадающим типом данных и заказывающий как params
|
Числовой массив | Числовой массив с совпадающим типом данных и заказывающий как params
| |
CellArray | Массив ячеек с совпадающими типами данных, структурой, и заказывающий как params | |
Структура | Структура с совпадающими типами данных, полями, и заказывающий как params | |
Таблица с Layer , Parameter , и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый learnable параметр как dlarray . | Таблица с совпадающими типами данных, переменными, и заказывающий как params . vel должен иметь Value переменная, состоящая из массивов ячеек, которые содержат скорость каждого learnable параметра. |
Если вы задаете vel
как пустой массив, функция не принимает предыдущих скоростей и запусков таким же образом что касается первого обновления в серии итераций. Чтобы обновить learnable параметры итеративно, используйте vel
выход предыдущего вызова sgdmupdate
как vel
входной параметр.
learnRate
— Глобальный темп обучения
(значение по умолчанию) | положительная скалярная величинаТемп обучения, заданный как положительная скалярная величина. Значение по умолчанию learnRate
0.01
.
Если вы задаете сетевые параметры как dlnetwork
объект, темп обучения для каждого параметра является глобальным темпом обучения, умноженным на соответствующее свойство фактора темпа обучения, заданное в сетевых слоях.
momentum
— Импульс
(значение по умолчанию) | положительная скалярная величина между 0
и 1
Импульс, заданный как положительная скалярная величина между 0
и 1
. Значение по умолчанию momentum
0.9
.
dlnet
— Сеть Updateddlnetwork
объектСеть, возвращенная как dlnetwork
объект.
Функция обновляет dlnet.Learnables
свойство dlnetwork
объект.
params
— Обновленные сетевые learnable параметрыdlarray
| числовой массив | массив ячеек | структура | таблицаОбновленные сетевые learnable параметры, возвращенные как dlarray
, числовой массив, массив ячеек, структура или таблица с Value
переменная, содержащая обновленные learnable параметры сети.
vel
— Обновленные скорости параметраdlarray
| числовой массив | массив ячеек | структура | таблицаОбновленные скорости параметра, возвращенные как dlarray
, числовой массив, массив ячеек, структура или таблица.
Функция использует стохастический градиентный спуск с алгоритмом импульса, чтобы обновить learnable параметры. Для получения дополнительной информации см. определение стохастического градиентного спуска с алгоритмом импульса под Стохастическим Градиентным спуском на trainingOptions
страница с описанием.
adamupdate
| dlarray
| dlfeval
| dlgradient
| dlnetwork
| dlupdate
| forward
| rmspropupdate
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.