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

Совет

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

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

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

  1. Назовите слой – Дают слою имя, таким образом, это может использоваться в MATLAB®.

  2. Объявите, что свойства слоя – Задают свойства слоя.

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

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

  5. Создайте обратную функцию потерь – Задают производную потери относительно прогнозов.

Слой 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)
            % 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-oneR-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

Создайте обратную функцию потерь

Создайте обратную функцию потерь.

Создайте функцию с именем backwardLoss, который возвращает производные потери MAE относительно прогнозов Y. Синтаксисом для backwardLoss является loss = backwardLoss(layer, Y, T), где Y является вывод предыдущего слоя, и T содержит учебные цели.

Размерности Y и T совпадают с входными параметрами в forwardLoss.

Производной потери MAE относительно прогнозов Y дают

LYi=1NRзнак(YiTi),

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

Смотрите также

| |

Похожие темы