Задайте пользовательский выходной слой регрессии

Совет

Чтобы создать слой регрессионного выхода со средними потерями квадратичной невязки, используйте regressionLayer. Если вы хотите использовать другую функцию потерь для задач регрессии, то можно задать пользовательский выходной слой регрессии, используя этот пример в качестве руководства.

В этом примере показано, как создать пользовательский выходной слой регрессии со средней абсолютной ошибкой (MAE).

Чтобы определить пользовательский выходной слой регрессии, можно использовать шаблон, представленный в этом примере, который проходит через следующие шаги:

  1. Назовите слой - Дайте слою имя, чтобы он мог использоваться в MATLAB®.

  2. Объявить свойства слоя - Задать свойства слоя.

  3. Создайте функцию конструктора (необязательно) - задайте, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то программное обеспечение инициализирует свойства с '' при создании.

  4. Создайте функцию потерь вперед - Задайте потерю между предсказаниями и целями обучения.

  5. Создайте функцию обратных потерь (необязательно) - задайте производную от потерь относительно предсказаний. Если вы не задаете функцию обратных потерь, то функция прямых потерь должна поддерживать dlarray объекты.

Регрессионный слой MAE вычисляет среднюю абсолютную потерю ошибки для регрессионных задач. Потеря MAE является мерой ошибки между двумя непрерывными случайными переменными. Для предсказаний Y и обучающих T целей, потеря MAE между Y и T задается как

L=1Nn=1N(1Ri=1R|YniTni|),

где 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

Создайте функцию Forward Loss

Создайте функцию с именем 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 задается как

L=1Nn=1N(1Ri=1R|YniTni|),

где 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

Совместимость с GPU

Если функции слоя 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

См. также

| |

Похожие темы