Совет
Чтобы создать регрессию выходной слой с потерей среднеквадратической ошибки, использовать regressionLayer
. Если вы хотите использовать различную функцию потерь для своих проблем регрессии, то можно задать пользовательскую регрессию выходной слой с помощью этого примера в качестве руководства.
В этом примере показано, как создать пользовательскую регрессию выходной слой с потерей средней абсолютной погрешности (MAE).
Чтобы задать пользовательскую регрессию выходной слой, можно использовать шаблон, обеспеченный в этом примере, который берет вас через следующие шаги:
Назовите слой – Дают слою имя, таким образом, это может использоваться в MATLAB®.
Объявите, что свойства слоя – Задают свойства слоя.
Создайте (дополнительную) функцию конструктора – Задают, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то программное обеспечение инициализирует свойства ''
при создании.
Создайте прямую функцию потерь – Задают потерю между предсказаниями и учебными целями.
Создайте обратную (дополнительную) функцию потерь – Задают производную потери относительно предсказаний. Если вы не задаете обратную функцию потерь, то прямая функция потерь должна поддержать dlarray
объекты.
Слой 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) % (Optional) 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
– Имя слоя в виде вектора символов или строкового скаляра. Чтобы включать слой в график слоев, необходимо задать непустое, уникальное имя слоя. Если вы обучаете серийную сеть со слоем и Name
установлен в ''
, затем программное обеспечение автоматически присваивает имя к слою в учебное время.
Description
– Однострочное описание слоя в виде вектора символов или строкового скаляра. Это описание появляется, когда слой отображен в Layer
массив. Если вы не задаете описание слоя, то программное обеспечение отображает "Classification Output"
или "Regression Output"
.
Type
– Тип слоя в виде вектора символов или строкового скаляра. Значение Type
появляется, когда слой отображен в Layer
массив. Если вы не задаете тип слоя, то программное обеспечение отображает имя класса слоя.
Пользовательские слои классификации также имеют следующее свойство:
Classes
– Классы выходного слоя в виде категориального вектора, массива строк, массива ячеек из символьных векторов или 'auto'
. Если Classes
'auto'
, затем программное обеспечение автоматически устанавливает классы в учебное время. Если вы задаете массив строк или массив ячеек из символьных векторов str
, затем программное обеспечение устанавливает классы выходного слоя к categorical(str,str)
.
Пользовательские слои регрессии также имеют следующее свойство:
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
Поскольку forwardLoss
функционируйте только использует функции та поддержка dlarray
объекты, задавая backwardLoss
функция является дополнительной. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray.
Просмотрите завершенную регрессию выходной файл класса слоя.
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 end end
Если слой вперед функции полностью поддерживает dlarray
объекты, затем слоем является совместимый графический процессор. В противном случае, чтобы быть совместимым графическим процессором, функции слоя должны поддержать входные параметры и возвратить выходные параметры типа gpuArray
(Parallel Computing Toolbox).
Много поддержки встроенных функций MATLAB gpuArray
(Parallel Computing Toolbox) и dlarray
входные параметры. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray. Для списка функций, которые выполняются на графическом процессоре, смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox). Чтобы использовать графический процессор для глубокого обучения, у вас должно также быть поддерживаемое устройство графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox). Для получения дополнительной информации о работе с графическими процессорами в MATLAB смотрите, что графический процессор Вычисляет в MATLAB (Parallel Computing Toolbox).
Функции MATLAB используются в forwardLoss
в maeRegressionLayer
вся поддержка dlarray
объекты, таким образом, слоем является совместимый графический процессор.
Проверяйте валидность слоя пользовательской классификации выходной слой 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. Skipping code generation compatibility tests. To check validity of the layer for code generation, specify the 'CheckCodegenCompatibility' and 'ObservationDimension' options. Running nnet.checklayer.TestOutputLayerWithoutBackward ........ Done nnet.checklayer.TestOutputLayerWithoutBackward __________ Test Summary: 8 Passed, 0 Failed, 0 Incomplete, 2 Skipped. Time elapsed: 1.0155 seconds.
В сводке тестов указывается количество пройденных, неудачных, неполных и пропущенных тестов.
Можно использовать пользовательский выходной слой таким же образом в качестве любого другого выходного слоя в Deep Learning Toolbox. Этот раздел показывает, как создать и обучить сеть для регрессии с помощью пользовательского выходного слоя, который вы создали ранее.
Пример создает архитектуру сверточной нейронной сети, обучает сеть и использует обучивший сеть, чтобы предсказать углы вращаемых, рукописных цифр. Эти предсказания полезны для оптического распознавания символов.
Загрузите обучающие данные в качестве примера.
[XTrain,~,YTrain] = 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(XTrain,YTrain,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.28 | 25.1 | 0.0100 | | 2 | 50 | 00:00:02 | 14.27 | 11.3 | 0.0100 | | 3 | 100 | 00:00:04 | 14.30 | 11.5 | 0.0100 | | 4 | 150 | 00:00:06 | 10.07 | 7.7 | 0.0100 | | 6 | 200 | 00:00:08 | 9.81 | 7.5 | 0.0100 | | 7 | 250 | 00:00:10 | 10.20 | 7.5 | 0.0100 | | 8 | 300 | 00:00:12 | 9.57 | 7.2 | 0.0100 | | 9 | 350 | 00:00:14 | 8.61 | 6.5 | 0.0100 | | 11 | 400 | 00:00:16 | 9.45 | 6.8 | 0.0100 | | 12 | 450 | 00:00:17 | 8.26 | 6.0 | 0.0100 | | 13 | 500 | 00:00:19 | 9.51 | 6.1 | 0.0100 | | 15 | 550 | 00:00:21 | 10.00 | 7.7 | 0.0100 | | 16 | 600 | 00:00:23 | 8.60 | 6.1 | 0.0100 | | 17 | 650 | 00:00:24 | 7.18 | 5.4 | 0.0100 | | 18 | 700 | 00:00:26 | 8.89 | 6.3 | 0.0100 | | 20 | 750 | 00:00:28 | 7.76 | 5.9 | 0.0100 | | 21 | 800 | 00:00:29 | 8.07 | 6.0 | 0.0100 | | 22 | 850 | 00:00:31 | 7.38 | 5.6 | 0.0100 | | 24 | 900 | 00:00:33 | 7.51 | 5.5 | 0.0100 | | 25 | 950 | 00:00:35 | 6.88 | 4.9 | 0.0100 | | 26 | 1000 | 00:00:37 | 6.83 | 4.7 | 0.0100 | | 27 | 1050 | 00:00:40 | 6.70 | 4.8 | 0.0100 | | 29 | 1100 | 00:00:42 | 6.57 | 4.8 | 0.0100 | | 30 | 1150 | 00:00:44 | 6.87 | 4.9 | 0.0100 | | 30 | 1170 | 00:00:45 | 7.75 | 6.2 | 0.0100 | |========================================================================================|
Оцените производительность сети путем вычисления ошибки предсказания между предсказанными и фактическими углами вращения.
[XTest,~,YTest] = digitTest4DArrayData; YPred = predict(net,XTest); predictionError = YTest - YPred;
Вычислите количество предсказаний в приемлемом допуске на погрешность от истинных углов. Установите порог, чтобы быть 10 градусами и вычислить процент предсказаний в этом пороге.
thr = 10; numCorrect = sum(abs(predictionError) < thr); numTestImages = size(XTest,4); accuracy = numCorrect/numTestImages
accuracy = 0.7524
assembleNetwork
| checkLayer
| regressionLayer