Совет
Чтобы создать слой регрессионного выхода со средними потерями квадратичной невязки, используйте 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
section) так, чтобы оно имело то же имя что и слой.
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
также зависят от типа задачи.
Регрессионная задача | Вход сигнала | Размерность наблюдения |
---|---|---|
2-D регрессию изображения | 1 на 1-by - R -by - N, где R - количество откликов, а N - количество наблюдений. | 4 |
2-D регрессию «изображение-изображение» | 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 |
Регрессия от последовательности к единице | 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
Если функции слоя forward полностью поддерживают dlarray
объекты, тогда слой совместим с графическим процессором. В противном случае, чтобы быть совместимым с графический процессор, функции слоя должны поддерживать входы и выходные выходы возврата типа gpuArray
(Parallel Computing Toolbox).
Многие встроенные функции MATLAB поддерживают gpuArray
(Parallel Computing Toolbox) и dlarray
входные параметры. Список функций, поддерживающих dlarray
объекты, см. Список функций с поддержкой dlarray. Список функций, которые выполняются на графическом процессоре, см. в разделе Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox). Для использования графический процессор для глубокого обучения необходимо иметь также поддерживаемое графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Для получения дополнительной информации о работе с графическими процессорами в MATLAB, смотрите GPU Computing в MATLAB (Parallel Computing Toolbox).
Функции MATLAB, используемые в forwardLoss
в maeRegressionLayer
все dlarray поддержки
объекты, поэтому слой совместим с графическим процессором.
Проверьте валидность слоя пользовательского выходного слоя классификации maeRegressionLayer
.
Задайте пользовательский слой абсолютной регрессии ошибок. Чтобы создать этот слой, сохраните файл maeRegressionLayer.m
в текущей папке. Создайте образец слоя.
layer = maeRegressionLayer('mae');
Проверьте допустимость слоя с помощью checkLayer
. Задайте допустимый размер входного сигнала, чтобы быть размером одного наблюдения типового входа для слоя. Слой ожидает входных параметров 1-by-1-by-R-by-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