exponenta event banner

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

Совет

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

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

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

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

  2. Объявить свойства слоя - укажите свойства слоя.

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

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

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

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

L=1N∑n=1N (1R∑i=1R'Yni−Tni|),

где 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-by-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-by-1-by-1-by-R-by-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=1N∑n=1N (1R∑i=1R'Yni−Tni|),

где 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 объекты, то слой совместим с GPU. В противном случае, чтобы быть совместимым с GPU, функции уровня должны поддерживать входы и обратные выходы типа gpuArray(Панель инструментов параллельных вычислений).

Поддержка многих встроенных функций MATLAB gpuArray(Панель инструментов параллельных вычислений) и dlarray входные аргументы. Список функций, поддерживающих dlarray см. Список функций с поддержкой dlarray. Список функций, выполняемых на графическом процессоре, см. в разделе Выполнение функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений). Чтобы использовать графический процессор для глубокого обучения, необходимо также иметь поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox). Дополнительные сведения о работе с графическими процессорами в MATLAB см. в разделе Вычисления графического процессора в 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.

Сводка тестов сообщает о количестве пройденных, неудачных, неполных и пропущенных тестов.

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

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

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

Загрузите пример учебных данных.

[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

См. также

| |

Связанные темы