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

Совет

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

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

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

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

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

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

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

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

Слой SSE классификации вычисляет ошибочную потерю суммы квадратов для проблем классификации. SSE является ошибочной мерой между двумя непрерывными случайными переменными. Для предсказаний Y и обучение предназначаются для T, потерей SSE между Y и T дают

L=1Nn=1Ni=1K(YniTni)2,

где N является количеством наблюдений, и K является количеством классов.

Классификация Выходной шаблон слоя

Скопируйте классификацию выходной шаблон слоя в новый файл в MATLAB. Этот шаблон обрисовывает в общих чертах структуру классификации выходной слой и включает функции, которые задают поведение слоя.

classdef myClassificationLayer < nnet.layer.ClassificationLayer
        
    properties
        % (Optional) Layer properties.

        % Layer properties go here.
    end
 
    methods
        function layer = myClassificationLayer()           
            % (Optional) Create a myClassificationLayer.

            % 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

Назовите слой

Во-первых, дайте слою имя. В первой линии файла класса замените существующее имя myClassificationLayer с sseClassificationLayer.

classdef sseClassificationLayer < nnet.layer.ClassificationLayer
    ...
end

Затем переименуйте myClassificationLayer функция конструктора (первая функция в methods разделите) так, чтобы это имело то же имя как слой.

    methods
        function layer = sseClassificationLayer()           
            ...
        end

        ...
     end

Сохраните слой

Сохраните файл класса слоя в новом файле с именем sseClassificationLayer.m. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке на пути MATLAB.

Объявите свойства слоя

Объявите свойства слоя в properties раздел.

По умолчанию пользовательские выходные слои имеют следующие свойства:

  • NameИмя слоя в виде вектора символов или строкового скаляра. Чтобы включать слой в график слоев, необходимо задать непустое уникальное имя слоя. Если вы обучаете серийную сеть со слоем и Name установлен в '', затем программное обеспечение автоматически присваивает имя к слою в учебное время.

  • Description – Однострочное описание слоя в виде вектора символов или строкового скаляра. Это описание появляется, когда слой отображен в Layer массив. Если вы не задаете описание слоя, то программное обеспечение отображает "Classification Output" или "Regression Output".

  • Type – Тип слоя в виде вектора символов или строкового скаляра. Значение Type появляется, когда слой отображен в Layer массив. Если вы не задаете тип слоя, то программное обеспечение отображает имя класса слоя.

Пользовательские слои классификации также имеют следующее свойство:

  • ClassesКлассы выходного слоя в виде категориального вектора, массива строк, массива ячеек из символьных векторов или 'auto'. Если Classes 'auto', затем программное обеспечение автоматически устанавливает классы в учебное время. Если вы задаете массив строк или массив ячеек из символьных векторов str, затем программное обеспечение устанавливает классы выходного слоя к categorical(str,str). Значением по умолчанию является 'auto'.

Пользовательские слои регрессии также имеют следующее свойство:

  • ResponseNamesИмена ответов, заданных массив ячеек из символьных векторов или массив строк. В учебное время программное обеспечение автоматически определяет имена ответа согласно обучающим данным. Значением по умолчанию является {}.

Если слой не имеет никаких других свойств, то можно не использовать properties раздел.

В этом примере слой не требует никаких дополнительных свойств, таким образом, можно удалить properties раздел.

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

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

Задайте входной параметр name присваивать Name свойство при создании. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксис функции.

        function layer = sseClassificationLayer(name)
            % layer = sseClassificationLayer(name) creates a sum of squares
            % error classification layer and specifies the layer name.

            ...
        end

Инициализируйте свойства слоя

Замените комментарий % Layer constructor function goes here с кодом, который инициализирует свойства слоя.

Дайте слою однострочное описание путем установки Description свойство слоя. Установите Name свойство к входному параметру name.

        function layer = sseClassificationLayer(name)
            % layer = sseClassificationLayer(name) creates a sum of squares
            % error classification layer and specifies the layer name.
    
            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = 'Sum of squares error';
        end

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

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

Для проблем классификации, размерностей T зависьте от типа проблемы.

Задача классификацииВведите размерРазмерность наблюдения
2D классификация изображений1 1 K N, где K является количеством классов и N, количество наблюдений.4
3-D классификация изображений1 1 1 K N, где K является количеством классов и N, количество наблюдений.5
Классификация последовательностей к меткеK-by-N, где K является количеством классов и N, является количеством наблюдений.2
Классификация от последовательности к последовательностиK-by-N-by-S, где K является количеством классов, N, является количеством наблюдений, и S является длиной последовательности.2

Размер Y зависит от выхода предыдущего слоя. Гарантировать тот Y одного размера с T, необходимо включать слой, который выводит правильный размер перед выходным слоем. Например, чтобы гарантировать тот Y 4-D массив музыки предсказания к классам K, можно включать полносвязный слой размера K, сопровождаемый softmax слоем перед выходным слоем.

Слой SSE классификации вычисляет ошибочную потерю суммы квадратов для проблем классификации. SSE является ошибочной мерой между двумя непрерывными случайными переменными. Для предсказаний Y и обучение предназначаются для T, потерей SSE между Y и T дают

L=1Nn=1Ni=1K(YniTni)2,

где N является количеством наблюдений, и K является количеством классов.

Входные параметры Y и T соответствуйте Y и T в уравнении, соответственно. Выход loss соответствует L. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксисы функции.

        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the SSE loss between
            % the predictions Y and the training targets T.

            % Calculate sum of squares.
            sumSquares = sum((Y-T).^2);
    
            % Take mean over mini-batch.
            N = size(Y,4);
            loss = sum(sumSquares)/N;
        end

Поскольку forwardLoss функционируйте только использует функции та поддержка dlarray объекты, задавая backwardLoss функция является дополнительной. Для списка функций та поддержка dlarray объекты, см. Список Функций с Поддержкой dlarray.

Завершенный слой

Просмотрите завершенную классификацию выходной файл класса слоя.

classdef sseClassificationLayer < nnet.layer.ClassificationLayer
    % Example custom classification layer with sum of squares error loss.
    
    methods
        function layer = sseClassificationLayer(name)
            % layer = sseClassificationLayer(name) creates a sum of squares
            % error classification layer and specifies the layer name.
    
            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = 'Sum of squares error';
        end
        
        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the SSE loss between
            % the predictions Y and the training targets T.

            % Calculate sum of squares.
            sumSquares = sum((Y-T).^2);
    
            % Take mean over mini-batch.
            N = size(Y,4);
            loss = sum(sumSquares)/N;
        end
    end
end

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

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

Много встроенных функций MATLAB поддерживают gpuArray и dlarray входные параметры. Для списка функций та поддержка dlarray объекты, см. Список Функций с Поддержкой dlarray. Для списка функций, которые выполняются на графическом процессоре, смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox). Чтобы использовать графический процессор в глубоком обучении, у вас должен также быть CUDA®, включенный NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Для получения дополнительной информации о работе с графическими процессорами в MATLAB смотрите, что графический процессор Вычисляет в MATLAB (Parallel Computing Toolbox).

Функции MATLAB используются в forwardLoss вся поддержка dlarray объекты, таким образом, слоем является совместимый графический процессор.

Проверяйте Выходную валидность слоя

Проверяйте валидность слоя пользовательской классификации выходной слой sseClassificationLayer.

Задайте пользовательский слой классификации ошибок суммы квадратов. Чтобы создать этот слой, сохраните файл sseClassificationLayer.m в текущей папке. Создайте экземпляр слоя.

layer = sseClassificationLayer('sse');

Проверяйте, что слой является допустимым использованием checkLayer. Задайте допустимый входной размер, чтобы быть размером одного наблюдения за типичным входом к слою. Слой ожидает 1 1 K N входными параметрами массивов, где K является количеством классов, и N является количеством наблюдений в мини-пакете.

validInputSize = [1 1 10];
checkLayer(layer,validInputSize,'ObservationDimension',4);
Running nnet.checklayer.TestOutputLayerWithoutBackward
..........
Done nnet.checklayer.TestOutputLayerWithoutBackward
__________

Test Summary:
	 10 Passed, 0 Failed, 0 Incomplete, 0 Skipped.
	 Time elapsed: 0.4044 seconds.

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

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

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

Загрузите обучающие данные в качестве примера.

[XTrain,YTrain] = digitTrain4DArrayData;

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

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(10)
    softmaxLayer
    sseClassificationLayer('sse')]
layers = 
  7x1 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         10 fully connected layer
     6   ''      Softmax                 softmax
     7   'sse'   Classification Output   Sum of squares error

Установите опции обучения и обучите сеть.

options = trainingOptions('sgdm');
net = trainNetwork(XTrain,YTrain,layers,options);
Training on single GPU.
Initializing input data normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:00 |        9.38% |       0.9944 |          0.0100 |
|       2 |          50 |       00:00:03 |       75.00% |       0.3538 |          0.0100 |
|       3 |         100 |       00:00:05 |       92.97% |       0.1297 |          0.0100 |
|       4 |         150 |       00:00:08 |       94.53% |       0.0993 |          0.0100 |
|       6 |         200 |       00:00:10 |       95.31% |       0.0759 |          0.0100 |
|       7 |         250 |       00:00:12 |       96.88% |       0.0477 |          0.0100 |
|       8 |         300 |       00:00:14 |       99.22% |       0.0196 |          0.0100 |
|       9 |         350 |       00:00:16 |       99.22% |       0.0257 |          0.0100 |
|      11 |         400 |       00:00:19 |      100.00% |       0.0076 |          0.0100 |
|      12 |         450 |       00:00:21 |      100.00% |       0.0043 |          0.0100 |
|      13 |         500 |       00:00:23 |      100.00% |       0.0093 |          0.0100 |
|      15 |         550 |       00:00:25 |      100.00% |       0.0058 |          0.0100 |
|      16 |         600 |       00:00:27 |      100.00% |       0.0020 |          0.0100 |
|      17 |         650 |       00:00:29 |      100.00% |       0.0039 |          0.0100 |
|      18 |         700 |       00:00:32 |      100.00% |       0.0023 |          0.0100 |
|      20 |         750 |       00:00:34 |      100.00% |       0.0028 |          0.0100 |
|      21 |         800 |       00:00:36 |      100.00% |       0.0020 |          0.0100 |
|      22 |         850 |       00:00:38 |      100.00% |       0.0017 |          0.0100 |
|      24 |         900 |       00:00:40 |      100.00% |       0.0020 |          0.0100 |
|      25 |         950 |       00:00:44 |      100.00% |       0.0013 |          0.0100 |
|      26 |        1000 |       00:00:48 |      100.00% |       0.0012 |          0.0100 |
|      27 |        1050 |       00:00:52 |       99.22% |       0.0104 |          0.0100 |
|      29 |        1100 |       00:00:56 |      100.00% |       0.0013 |          0.0100 |
|      30 |        1150 |       00:01:00 |      100.00% |       0.0012 |          0.0100 |
|      30 |        1170 |       00:01:01 |       99.22% |       0.0080 |          0.0100 |
|========================================================================================|

Оцените производительность сети путем создания предсказаний на новых данных и вычисления точности.

[XTest,YTest] = digitTest4DArrayData;
YPred = classify(net, XTest);
accuracy = mean(YTest == YPred)
accuracy = 0.9844

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

| |

Похожие темы