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

Совет

Чтобы создать слой выхода классификации с потерей перекрестной энтропии для 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 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

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

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

Для задач классификации, размерности T зависят от типа задачи.

Задача классификацииВход сигналаРазмерность наблюдения
2-D классификации изображений1 на 1-by - K -by - 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

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

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

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

Можно использовать пользовательский выходной слой так же, как и любой другой выходной слой в 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 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

См. также

| |

Похожие темы