Чтобы создать регрессию выходной слой с потерей среднеквадратической ошибки, используйте regressionLayer
. Если вы хотите использовать различную функцию потерь для своих проблем регрессии, то можно задать пользовательскую регрессию выходной слой с помощью этого примера в качестве руководства.
Этот пример показывает, как создать пользовательскую регрессию выходной слой с потерей средней абсолютной погрешности (MAE).
Чтобы задать пользовательскую регрессию выходной слой, можно использовать шаблон, обеспеченный в этом примере, который берет вас через следующие шаги:
Назовите слой – Дают слою имя, таким образом, это может использоваться в MATLAB®.
Объявите, что свойства слоя – Задают свойства слоя.
Создайте функцию конструктора – Задают, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то программное обеспечение инициализирует свойства с ''
при создании.
Создайте прямую функцию потерь – Задают потерю между прогнозами и учебными целями.
Создайте обратную функцию потерь – Задают производную потери относительно прогнозов.
Слой MAE регрессии вычисляет среднюю потерю абсолютной погрешности для проблем регрессии. Потеря MAE является ошибочной мерой между двумя непрерывными случайными переменными. Для прогнозов Y и обучение предназначаются для T, потерей MAE между Y и T дают
где N является количеством наблюдений, и R является количеством ответов.
Скопируйте регрессию выходной шаблон слоя в новый файл в MATLAB. Этот шаблон обрисовывает в общих чертах структуру регрессии выходной слой и включает функции, которые задают поведение слоя.
classdef myRegressionLayer < nnet.layer.RegressionLayer properties % (Optional) Layer properties. % Layer properties go here. end methods function layer = myRegressionLayer() % (Optional) Create a myRegressionLayer. % Layer constructor function goes here. end function loss = forwardLoss(layer, Y, T) % Return the loss between the predictions Y and the % training targets T. % % Inputs: % layer - Output layer % Y – Predictions made by network % T – Training targets % % Output: % loss - Loss between Y and T % Layer forward loss function goes here. end function dLdY = backwardLoss(layer, Y, T) % Backward propagate the derivative of the loss function. % % Inputs: % layer - Output layer % Y – Predictions made by network % T – Training targets % % Output: % dLdY - Derivative of the loss with respect to the predictions Y % Layer backward loss function goes here. end end end
Во-первых, дайте слою имя. В первой строке файла класса замените существующее имя myRegressionLayer
на maeRegressionLayer
.
classdef maeRegressionLayer < nnet.layer.RegressionLayer ... end
Затем, переименуйте функцию конструктора myRegressionLayer
(первая функция в разделе methods
) так, чтобы это имело то же имя как слой.
methods function layer = maeRegressionLayer() ... end ... end
Сохраните файл класса слоя в новом файле с именем maeRegressionLayer.m
. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке на пути MATLAB.
Объявите свойства слоя в разделе properties
.
По умолчанию пользовательские выходные слои имеют следующие свойства:
Имя
Имя слоя, заданное как вектор символов или скаляр строки. Чтобы включать слой в график слоя, необходимо задать непустое уникальное имя слоя. Если вы обучаете серийную сеть со слоем, и Name
установлен в ''
, то программное обеспечение автоматически присваивает имя к слою в учебное время.
Описание
Короткое описание слоя, заданного как вектор символов или скаляр строки. Это описание появляется, когда слой отображен в массиве Layer
. Если вы не задаете описание слоя, то программное обеспечение отображает "Classification Output"
или "Regression Output"
.
Ввод
Тип слоя, заданного как вектор символов или скаляр строки. Значение Type
появляется, когда слой отображен в массиве Layer
. Если вы не задаете тип слоя, то программное обеспечение отображает имя класса слоя.
Пользовательские слои классификации также имеют следующее свойство:
Классы
Классы выходного слоя, заданного как категориальный вектор, массив строк, массив ячеек из символьных векторов или 'auto'
. Если Classes
является 'auto'
, то программное обеспечение автоматически устанавливает классы в учебное время. Если вы задаете массив строк или массив ячеек из символьных векторов str
, то программное обеспечение устанавливает классы выходного слоя к categorical(str,str)
. Значением по умолчанию является 'auto'
.
Пользовательские слои регрессии также имеют следующее свойство:
ResponseNames
– Имена ответов, заданных массив ячеек из символьных векторов или массив строк. В учебное время программное обеспечение автоматически определяет имена ответа согласно данным тренировки. Значением по умолчанию является {}
.
Если слой не имеет никаких других свойств, то можно не использовать раздел properties
.
Слой не требует никаких дополнительных свойств, таким образом, можно удалить раздел properties
.
Создайте функцию, которая создает слой и инициализирует свойства слоя. Задайте любые переменные, требуемые создать слой как входные параметры к функции конструктора.
Чтобы инициализировать свойство Name
при создании, задайте входной параметр name
. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксис функции.
function layer = maeRegressionLayer(name) % layer = maeRegressionLayer(name) creates a % mean-absolute-error regression layer and specifies the layer % name. ... end
Замените комментарий % Layer constructor function goes here
на код, который инициализирует свойства слоя.
Дайте слою короткое описание путем установки свойства Description
слоя. Установите свойство Name
на входной параметр name
. Установите описание описывать тип слоя и его размера.
function layer = maeRegressionLayer(name)
% layer = maeRegressionLayer(name) creates a
% mean-absolute-error regression layer and specifies the layer
% name.
% Set layer name.
layer.Name = name;
% Set layer description.
layer.Description = 'Mean absolute error';
end
Создайте функцию с именем forwardLoss
, который возвращает потерю MAE между прогнозами, сделанными сетью и учебными целями. Синтаксисом для forwardLoss
является loss = forwardLoss(layer, Y, T)
, где Y
является вывод предыдущего слоя, и T
содержит учебные цели.
Для проблем регрессии размерности T
также зависят от типа проблемы.
Задача регрессии | Введите размер | Размерность наблюдения |
---|---|---|
2D регрессия изображений | 1 1 R N, где R является количеством ответов и N, количество наблюдений. | 4 |
2D регрессия От изображения к изображению | h-by-w-by-c-by-N , где h, w и c являются высотой, шириной, и количеством каналов вывода соответственно и N, является количеством наблюдений. | 4 |
3-D регрессия изображений | 1 1 1 R N, где R является количеством ответов и N, количество наблюдений. | 5 |
3-D регрессия От изображения к изображению | h-by-w-by-d-by-c-by-N , где h, w, d и c являются высотой, шириной, глубиной, и количеством каналов вывода соответственно и N, является количеством наблюдений. | 5 |
Регрессия Sequence-one | R-by-N, где R является количеством ответов и N, является количеством наблюдений. | 2 |
Регрессия от последовательности к последовательности | R-by-N-by-S, где R является количеством ответов, N, является количеством наблюдений, и S является длиной последовательности. | 2 |
Например, если сеть задает сеть регрессии изображений с одним ответом и имеет мини-пакеты размера 50, то T
является 4-D массивом размера 1 1 1 50.
Размер Y
зависит от вывода предыдущего слоя. Чтобы гарантировать, что Y
одного размера как T
, необходимо включать слой, который выводит правильный размер перед выходным слоем. Например, для регрессии изображений с ответами R, чтобы гарантировать, что Y
является 4-D массивом правильного размера, можно включать полносвязный слой размера R перед выходным слоем.
Слой MAE регрессии вычисляет среднюю потерю абсолютной погрешности для проблем регрессии. Потеря MAE является ошибочной мерой между двумя непрерывными случайными переменными. Для прогнозов Y и обучение предназначаются для T, потерей MAE между Y и T дают
где N является количеством наблюдений, и R является количеством ответов.
Входные параметры Y
и T
соответствуют Y и T в уравнении, соответственно. Вывод loss
соответствует L. Чтобы гарантировать, что loss
является скаляром, выводит среднюю потерю по мини-пакету. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксисы функции.
function loss = forwardLoss(layer, Y, T)
% loss = forwardLoss(layer, Y, T) returns the MAE loss between
% the predictions Y and the training targets T.
% Calculate MAE.
R = size(Y,3);
meanAbsoluteError = sum(abs(Y-T),3)/R;
% Take mean over mini-batch.
N = size(Y,4);
loss = sum(meanAbsoluteError)/N;
end
Создайте обратную функцию потерь.
Создайте функцию с именем backwardLoss
, который возвращает производные потери MAE относительно прогнозов Y
. Синтаксисом для backwardLoss
является loss = backwardLoss(layer, Y, T)
, где Y
является вывод предыдущего слоя, и T
содержит учебные цели.
Размерности Y
и T
совпадают с входными параметрами в forwardLoss
.
Производной потери MAE относительно прогнозов Y дают
где N является количеством наблюдений, и R является количеством ответов. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксисы функции.
function dLdY = backwardLoss(layer, Y, T)
% Returns the derivatives of the MAE loss with respect to the predictions Y
R = size(Y,3);
N = size(Y,4);
dLdY = sign(Y-T)/(N*R);
end
Просмотрите завершенную регрессию выходной файл класса слоя.
classdef maeRegressionLayer < nnet.layer.RegressionLayer % Example custom regression layer with mean-absolute-error loss. methods function layer = maeRegressionLayer(name) % layer = maeRegressionLayer(name) creates a % mean-absolute-error regression layer and specifies the layer % name. % Set layer name. layer.Name = name; % Set layer description. layer.Description = 'Mean absolute error'; end function loss = forwardLoss(layer, Y, T) % loss = forwardLoss(layer, Y, T) returns the MAE loss between % the predictions Y and the training targets T. % Calculate MAE. R = size(Y,3); meanAbsoluteError = sum(abs(Y-T),3)/R; % Take mean over mini-batch. N = size(Y,4); loss = sum(meanAbsoluteError)/N; end function dLdY = backwardLoss(layer, Y, T) % Returns the derivatives of the MAE loss with respect to the predictions Y R = size(Y,3); N = size(Y,4); dLdY = sign(Y-T)/(N*R); end end end
Для совместимости графического процессора функции уровня должны поддержать входные параметры и возвратить выходные параметры типа gpuArray
. Любые другие функции использование слоя должны сделать то же самое. Много встроенных функций MATLAB поддерживают входные параметры gpuArray
. Если вы вызываете какую-либо из этих функций по крайней мере с одним входом gpuArray
, то функция выполняется на графическом процессоре и возвращает gpuArray
вывод. Для списка функций, которые выполняются на графическом процессоре, смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox). Чтобы использовать графический процессор для глубокого обучения, у вас должен также быть CUDA®, включенный NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Для получения дополнительной информации о работе с графическими процессорами в MATLAB смотрите, что графический процессор Вычисляет в MATLAB (Parallel Computing Toolbox).
Функции MATLAB использовали в forwardLoss
и backwardLoss
в maeRegressionLayer
вся поддержка входные параметры gpuArray
, таким образом, слоем является совместимый графический процессор.
Проверяйте валидность слоя пользовательской классификации выходной слой maeRegressionLayer
.
Задайте пользовательский средний слой регрессии абсолютной погрешности. Чтобы создать этот слой, сохраните файл maeRegressionLayer.m
в текущей папке. Создайте экземпляр слоя.
layer = maeRegressionLayer('mae');
Проверяйте, что слой является допустимым использованием checkLayer
. Задайте допустимый входной размер, чтобы быть размером одного наблюдения за типичным входом к слою. Слой ожидает 1 1 R N входными параметрами массивов, где R является количеством ответов, и N является количеством наблюдений в мини-пакете.
validInputSize = [1 1 10];
checkLayer(layer,validInputSize,'ObservationDimension',4);
Skipping GPU tests. No compatible GPU device found. Running nnet.checklayer.OutputLayerTestCase .......... ... Done nnet.checklayer.OutputLayerTestCase __________ Test Summary: 13 Passed, 0 Failed, 0 Incomplete, 4 Skipped. Time elapsed: 0.21127 seconds.
Тестовые сводные отчеты количество переданных, отказавших, неполные, и пропущенные тесты.
Можно использовать пользовательский выходной слой таким же образом в качестве любого другого выходного слоя в Deep Learning Toolbox. Этот раздел показывает, как создать и обучить сеть для регрессии с помощью пользовательского выходного слоя, который вы создали ранее.
Пример создает сверточную архитектуру нейронной сети, обучает сеть и использует обучивший сеть, чтобы предсказать углы вращаемых, рукописных цифр. Эти прогнозы полезны для оптического распознавания символов.
Загрузите данные тренировки в качестве примера.
[trainImages,~,trainAngles] = digitTrain4DArrayData;
Создайте массив слоя включая регрессию выходной слой maeRegressionLayer
.
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20)
batchNormalizationLayer
reluLayer
fullyConnectedLayer(1)
maeRegressionLayer('mae')]
layers = 6x1 Layer array with layers: 1 '' Image Input 28x28x1 images with 'zerocenter' normalization 2 '' Convolution 20 5x5 convolutions with stride [1 1] and padding [0 0 0 0] 3 '' Batch Normalization Batch normalization 4 '' ReLU ReLU 5 '' Fully Connected 1 fully connected layer 6 'mae' Regression Output Mean absolute error
Установите опции обучения и обучите сеть.
options = trainingOptions('sgdm');
net = trainNetwork(trainImages,trainAngles,layers,options);
Training on single CPU. Initializing input data normalization. |========================================================================================| | Epoch | Iteration | Time Elapsed | Mini-batch | Mini-batch | Base Learning | | | | (hh:mm:ss) | RMSE | Loss | Rate | |========================================================================================| | 1 | 1 | 00:00:00 | 28.21 | 25.1 | 0.0100 | | 2 | 50 | 00:00:01 | 14.46 | 11.4 | 0.0100 | | 3 | 100 | 00:00:03 | 13.04 | 10.0 | 0.0100 | | 4 | 150 | 00:00:04 | 10.21 | 7.9 | 0.0100 | | 6 | 200 | 00:00:06 | 10.61 | 8.1 | 0.0100 | | 7 | 250 | 00:00:07 | 9.83 | 7.3 | 0.0100 | | 8 | 300 | 00:00:09 | 8.85 | 7.2 | 0.0100 | | 9 | 350 | 00:00:10 | 9.21 | 7.3 | 0.0100 | | 11 | 400 | 00:00:12 | 10.07 | 8.3 | 0.0100 | | 12 | 450 | 00:00:13 | 8.63 | 6.4 | 0.0100 | | 13 | 500 | 00:00:15 | 9.45 | 6.2 | 0.0100 | | 15 | 550 | 00:00:16 | 9.10 | 6.8 | 0.0100 | | 16 | 600 | 00:00:18 | 8.46 | 6.3 | 0.0100 | | 17 | 650 | 00:00:19 | 8.38 | 6.3 | 0.0100 | | 18 | 700 | 00:00:21 | 8.37 | 6.4 | 0.0100 | | 20 | 750 | 00:00:22 | 7.06 | 5.2 | 0.0100 | | 21 | 800 | 00:00:24 | 7.35 | 5.5 | 0.0100 | | 22 | 850 | 00:00:25 | 6.43 | 5.0 | 0.0100 | | 24 | 900 | 00:00:27 | 6.78 | 4.7 | 0.0100 | | 25 | 950 | 00:00:28 | 6.54 | 4.4 | 0.0100 | | 26 | 1000 | 00:00:30 | 8.16 | 6.1 | 0.0100 | | 27 | 1050 | 00:00:32 | 6.96 | 5.0 | 0.0100 | | 29 | 1100 | 00:00:33 | 6.21 | 4.6 | 0.0100 | | 30 | 1150 | 00:00:34 | 6.38 | 4.9 | 0.0100 | | 30 | 1170 | 00:00:35 | 6.14 | 4.6 | 0.0100 | |========================================================================================|
Оцените производительность сети путем вычисления ошибки прогноза между предсказанными и фактическими углами вращения.
[testImages,~,testAngles] = digitTest4DArrayData; predictedTestAngles = predict(net,testImages); predictionError = testAngles - predictedTestAngles;
Вычислите количество прогнозов в приемлемом допуске на погрешность от истинных углов. Установите порог, чтобы быть 10 градусами и вычислить процент прогнозов в этом пороге.
thr = 10; numCorrect = sum(abs(predictionError) < thr); numTestImages = size(testImages,4); accuracy = numCorrect/numTestImages
accuracy = 0.7872
assembleNetwork
| checkLayer
| regressionLayer