exponenta event banner

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

Совет

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

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

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

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

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

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

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

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

Уровень SSE классификации вычисляет сумму потерь ошибок квадратов для проблем классификации. SSE - мера ошибки между двумя непрерывными случайными переменными. Для прогнозов Y и учебных целей T потеря МРЗ между Y и T задается

L=1N∑n=1N​∑i=1K​ (Yni Tni) 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 section), чтобы он имел то же имя, что и слой.

    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).

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

  • 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 зависит от типа проблемы.

Задача классификацииРазмер вводаИзмерение наблюдения
2-D классификация изображений1-by-1-by-K-by-N, где K - число классов, а N - число наблюдений.4
3-D классификация изображений1-by-1-by-1-by-K-by-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 потеря МРЗ между Y и T задается

L=1N∑n=1N​∑i=1K​ (Yni Tni) 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

Совместимость графического процессора

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

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

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

Проверка достоверности выходного уровня

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

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

layer = sseClassificationLayer('sse');

Проверка допустимости слоя с помощью checkLayer. Укажите допустимый размер ввода, который должен быть размером одного наблюдения за типовым вводом в слой. Слой ожидает 1-by-1-by-K-by-N входных данных массива, где K - количество классов, а 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: 0.34606 seconds.

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

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

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

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

[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 CPU.
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:05 |       75.00% |       0.3560 |          0.0100 |
|       3 |         100 |       00:00:09 |       92.97% |       0.1293 |          0.0100 |
|       4 |         150 |       00:00:13 |       96.88% |       0.0926 |          0.0100 |
|       6 |         200 |       00:00:17 |       95.31% |       0.0726 |          0.0100 |
|       7 |         250 |       00:00:21 |       97.66% |       0.0479 |          0.0100 |
|       8 |         300 |       00:00:26 |       99.22% |       0.0204 |          0.0100 |
|       9 |         350 |       00:00:30 |       99.22% |       0.0264 |          0.0100 |
|      11 |         400 |       00:00:34 |      100.00% |       0.0066 |          0.0100 |
|      12 |         450 |       00:00:38 |      100.00% |       0.0041 |          0.0100 |
|      13 |         500 |       00:00:43 |      100.00% |       0.0073 |          0.0100 |
|      15 |         550 |       00:00:47 |      100.00% |       0.0059 |          0.0100 |
|      16 |         600 |       00:00:51 |      100.00% |       0.0021 |          0.0100 |
|      17 |         650 |       00:00:55 |      100.00% |       0.0040 |          0.0100 |
|      18 |         700 |       00:01:00 |      100.00% |       0.0024 |          0.0100 |
|      20 |         750 |       00:01:04 |      100.00% |       0.0032 |          0.0100 |
|      21 |         800 |       00:01:09 |      100.00% |       0.0020 |          0.0100 |
|      22 |         850 |       00:01:13 |      100.00% |       0.0017 |          0.0100 |
|      24 |         900 |       00:01:16 |      100.00% |       0.0020 |          0.0100 |
|      25 |         950 |       00:01:19 |      100.00% |       0.0013 |          0.0100 |
|      26 |        1000 |       00:01:22 |      100.00% |       0.0012 |          0.0100 |
|      27 |        1050 |       00:01:25 |       99.22% |       0.0105 |          0.0100 |
|      29 |        1100 |       00:01:28 |      100.00% |       0.0014 |          0.0100 |
|      30 |        1150 |       00:01:31 |      100.00% |       0.0011 |          0.0100 |
|      30 |        1170 |       00:01:32 |       99.22% |       0.0093 |          0.0100 |
|========================================================================================|

Оцените производительность сети, сделав прогнозы по новым данным и рассчитав точность.

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

См. также

| |

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