Обновите параметры с помощью адаптивной оценки момента (Адам)
Обновите сетевые настраиваемые параметры в пользовательском учебном цикле с помощью адаптивной оценки момента (Адам) алгоритм.
Примечание
Эта функция применяет алгоритм оптимизации Адама, чтобы обновить сетевые параметры в пользовательских учебных циклах, которые используют сети, заданные в качестве dlnetwork
объекты или функции модели. Если вы хотите обучить сеть, заданную как Layer
массив или как LayerGraph
, используйте следующие функции:
Создайте TrainingOptionsADAM
объект с помощью trainingOptions
функция.
Используйте TrainingOptionsADAM
объект с trainNetwork
функция.
[
обновляет настраиваемые параметры сети dlnet
,averageGrad
,averageSqGrad
] = adamupdate(dlnet
,grad
,averageGrad
,averageSqGrad
,iteration
)dlnet
использование алгоритма Адама. Используйте этот синтаксис в учебном цикле, чтобы итеративно обновить сеть, заданную как dlnetwork
объект.
[
обновляет настраиваемые параметры в params
,averageGrad
,averageSqGrad
] = adamupdate(params
,grad
,averageGrad
,averageSqGrad
,iteration
)params
использование алгоритма Адама. Используйте этот синтаксис в учебном цикле, чтобы итеративно обновить настраиваемые параметры сети, заданной с помощью функций.
[___] = adamupdate(___
также задает значения, чтобы использовать для глобальной скорости обучения, затухания градиента, квадратного затухания градиента и маленького постоянного эпсилона, в дополнение к входным параметрам в предыдущих синтаксисах. learnRate
,gradDecay
,sqGradDecay
,epsilon
)
adamupdate
Выполните один адаптивный шаг обновления оценки момента с глобальной скоростью обучения 0.05
, фактор затухания градиента 0.75
, и градиент в квадрате затухает фактор 0.95
.
Создайте параметры и градиенты параметра как числовые массивы.
params = rand(3,3,4); grad = ones(3,3,4);
Инициализируйте счетчик итерации, средний градиент и средний градиент в квадрате для первой итерации.
iteration = 1; averageGrad = []; averageSqGrad = [];
Задайте пользовательские значения для глобальной скорости обучения, фактора затухания градиента и фактора затухания градиента в квадрате.
learnRate = 0.05; gradDecay = 0.75; sqGradDecay = 0.95;
Обновите настраиваемые параметры с помощью adamupdate
.
[params,averageGrad,averageSqGrad] = adamupdate(params,grad,averageGrad,averageSqGrad,iteration,learnRate,gradDecay,sqGradDecay);
Обновите счетчик итерации.
iteration = iteration + 1;
adamupdate
Используйте adamupdate
обучать сеть с помощью алгоритма Адама.
Загрузите обучающие данные
Загрузите обучающие данные цифр.
[XTrain,YTrain] = digitTrain4DArrayData; classes = categories(YTrain); numClasses = numel(classes);
Сеть Define
Задайте сеть и задайте среднее значение изображений с помощью '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);
Функция градиентов модели Define
Создайте функцию помощника modelGradients
, перечисленный в конце примера. Функция берет dlnetwork
объект dlnet
и мини-пакет входных данных dlX
с соответствием маркирует Y,
и возвращает потерю и градиенты потери относительно настраиваемых параметров в dlnet
.
Задайте опции обучения
Задайте опции, чтобы использовать во время обучения.
miniBatchSize = 128; numEpochs = 20; numObservations = numel(YTrain); numIterationsPerEpoch = floor(numObservations./miniBatchSize);
Обучайтесь на графическом процессоре, если вы доступны. Используя графический процессор требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше.
executionEnvironment = "auto";
Визуализируйте процесс обучения в графике.
plots = "training-progress";
Обучение сети
Обучите модель с помощью пользовательского учебного цикла. В течение каждой эпохи переставьте данные и цикл по мини-пакетам данных. Обновите сетевые параметры с помощью adamupdate
функция. В конце каждой эпохи отобразите прогресс обучения.
Инициализируйте график процесса обучения.
if plots == "training-progress" figure lineLossTrain = animatedline('Color',[0.85 0.325 0.098]); ylim([0 inf]) xlabel("Iteration") ylabel("Loss") grid on end
Инициализируйте средние градиенты и средние градиенты в квадрате.
averageGrad = []; averageSqGrad = [];
Обучите сеть.
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. [grad,loss] = dlfeval(@modelGradients,dlnet,dlX,Y); % Update the network parameters using the Adam optimizer. [dlnet,averageGrad,averageSqGrad] = adamupdate(dlnet,grad,averageGrad,averageSqGrad,iteration); % 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.9896
Функция градиентов модели
modelGradients
функция помощника берет 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
для возможных входных параметров к adamupdate
.
Входной параметр | Настраиваемые параметры | Градиенты |
---|---|---|
dlnet | Таблица dlnet.Learnables содержа Layer , Parameter , и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый настраиваемый параметр как dlarray . | Таблица с совпадающим типом данных, переменными, и заказывающий как dlnet.Learnables . grad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат градиент каждого настраиваемого параметра. |
params | dlarray | dlarray с совпадающим типом данных и заказывающий как params
|
Числовой массив | Числовой массив с совпадающим типом данных и заказывающий как params
| |
CellArray | Массив ячеек с совпадающими типами данных, структурой, и заказывающий как params | |
Структура | Структура с совпадающими типами данных, полями, и заказывающий как params | |
Таблица с Layer , Parameter , и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый настраиваемый параметр как dlarray . | Таблица с совпадающими типами данных, переменными, и заказывающий как params . grad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат градиент каждого настраиваемого параметра. |
Можно получить grad
от вызова до dlfeval
это выполняет функцию, которая содержит вызов dlgradient
. Для получения дополнительной информации смотрите Использование Автоматическое Дифференцирование В Deep Learning Toolbox.
averageGrad
— Скользящее среднее значение градиентов параметра[]
| dlarray
| числовой массив | массив ячеек | структура | таблицаСкользящее среднее значение градиентов параметра в виде пустого массива, dlarray
, числовой массив, массив ячеек, структура или таблица.
Точная форма averageGrad
зависит от входной сети или настраиваемых параметров. Следующая таблица показывает требуемый формат для averageGrad
для возможных входных параметров к adamupdate
.
Входной параметр | Настраиваемые параметры | Средние градиенты |
---|---|---|
dlnet | Таблица dlnet.Learnables содержа Layer , Parameter , и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый настраиваемый параметр как dlarray . | Таблица с совпадающим типом данных, переменными, и заказывающий как dlnet.Learnables . averageGrad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат средний градиент каждого настраиваемого параметра. |
params | dlarray | dlarray с совпадающим типом данных и заказывающий как params
|
Числовой массив | Числовой массив с совпадающим типом данных и заказывающий как params
| |
CellArray | Массив ячеек с совпадающими типами данных, структурой, и заказывающий как params | |
Структура | Структура с совпадающими типами данных, полями, и заказывающий как params | |
Таблица с Layer , Parameter , и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый настраиваемый параметр как dlarray . | Таблица с совпадающими типами данных, переменными, и заказывающий как params . averageGrad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат средний градиент каждого настраиваемого параметра. |
Если вы задаете averageGrad
и averageSqGrad
как пустые массивы, функция не принимает предыдущих градиентов и запусков таким же образом что касается первого обновления в серии итераций. Чтобы обновить настраиваемые параметры итеративно, используйте averageGrad
выход предыдущего вызова adamupdate
как averageGrad
входной параметр.
averageSqGrad
— Скользящее среднее значение градиентов параметра в квадрате[]
| dlarray
| числовой массив | массив ячеек | структура | таблицаСкользящее среднее значение градиентов параметра в квадрате в виде пустого массива, dlarray
, числовой массив, массив ячеек, структура или таблица.
Точная форма averageSqGrad
зависит от входной сети или настраиваемых параметров. Следующая таблица показывает требуемый формат для averageSqGrad
для возможных входных параметров к adamupdate
.
Входной параметр | Настраиваемые параметры | Средние градиенты в квадрате |
---|---|---|
dlnet | Таблица dlnet.Learnables содержа Layer , Parameter , и Value переменные. Value переменная состоит из массивов ячеек, которые содержат каждый настраиваемый параметр как dlarray . | Таблица с совпадающим типом данных, переменными, и заказывающий как dlnet.Learnables . averageSqGrad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат средний градиент в квадрате каждого настраиваемого параметра. |
params | dlarray | dlarray с совпадающим типом данных и заказывающий как params
|
Числовой массив | Числовой массив с совпадающим типом данных и заказывающий как params
| |
CellArray | Массив ячеек с совпадающими типами данных, структурой, и заказывающий как params | |
Структура | Структура с совпадающими типами данных, полями, и заказывающий как params | |
Таблица с Layer , Parameter , и Value переменные. Value переменная должна состоять из массивов ячеек, которые содержат каждый настраиваемый параметр как dlarray . | Таблица с совпадающими типами данных, переменными и заказывающий как params . averageSqGrad должен иметь Value переменная, состоящая из массивов ячеек, которые содержат средний градиент в квадрате каждого настраиваемого параметра. |
Если вы задаете averageGrad
и averageSqGrad
как пустые массивы, функция не принимает предыдущих градиентов и запусков таким же образом что касается первого обновления в серии итераций. Чтобы обновить настраиваемые параметры итеративно, используйте averageSqGrad
выход предыдущего вызова adamupdate
как averageSqGrad
входной параметр.
iteration
— Номер итерацииНомер итерации в виде положительного целого числа. Для первого вызова adamupdate
, используйте значение 1
. Необходимо постепенно увеличить iteration
1
для каждого последующего вызова в серии вызовов adamupdate
. Алгоритм Адама использует это значение, чтобы откорректировать для смещения в скользящих средних значениях в начале набора итераций.
learnRate
— Глобальная скорость обучения
(значение по умолчанию) | положительная скалярная величинаГлобальная скорость обучения в виде положительной скалярной величины. Значение по умолчанию learnRate
0.001
.
Если вы задаете сетевые параметры как dlnetwork
, скорость обучения для каждого параметра является глобальной скоростью обучения, умноженной на соответствующее свойство фактора скорости обучения, заданное в слоях сети.
gradDecay
— Фактор затухания градиента
(значение по умолчанию) | положительная скалярная величина между 0
и 1
Фактор затухания градиента в виде положительной скалярной величины между 0
и 1
. Значение по умолчанию gradDecay
0.9
.
sqGradDecay
— Фактор затухания градиента в квадрате
(значение по умолчанию) | положительная скалярная величина между 0
и 1
Фактор затухания градиента в квадрате в виде положительной скалярной величины между 0
и 1
. Значение по умолчанию sqGradDecay
0.999
.
epsilon
— Маленькая константа1e-8
(значение по умолчанию) | положительная скалярная величинаМаленькая константа для предотвращения делит на нуль ошибки в виде положительной скалярной величины. Значение по умолчанию epsilon
1e-8
.
dlnet
— Сеть Updateddlnetwork
объектСеть, возвращенная как dlnetwork
объект.
Функция обновляет dlnet.Learnables
свойство dlnetwork
объект.
params
— Обновленные сетевые настраиваемые параметрыdlarray
| числовой массив | массив ячеек | структура | таблицаОбновленные сетевые настраиваемые параметры, возвращенные как dlarray
, числовой массив, массив ячеек, структура или таблица с Value
переменная, содержащая обновленные настраиваемые параметры сети.
averageGrad
— Обновленное скользящее среднее значение градиентов параметраdlarray
| числовой массив | массив ячеек | структура | таблицаОбновленное скользящее среднее значение градиентов параметра, возвращенных как dlarray
, числовой массив, массив ячеек, структура или таблица.
averageSqGrad
— Обновленное скользящее среднее значение градиентов параметра в квадратеdlarray
| числовой массив | массив ячеек | структура | таблицаОбновленное скользящее среднее значение градиентов параметра в квадрате, возвращенных как dlarray
, числовой массив, массив ячеек, структура или таблица.
Функция использует адаптивную оценку момента (Адам) алгоритм, чтобы обновить настраиваемые параметры. Для получения дополнительной информации см. определение алгоритма Адама под Стохастическим Градиентным спуском на trainingOptions
страница с описанием.
Указания и ограничения по применению:
Когда по крайней мере одним из следующих входных параметров является gpuArray
или dlarray
с базовыми данными типа gpuArray
, эта функция работает на графическом процессоре.
grad
averageGrad
averageSqGrad
params
Для получения дополнительной информации смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox).
dlarray
| dlfeval
| dlgradient
| dlnetwork
| dlupdate
| forward
| rmspropupdate
| sgdmupdate
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.