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

Совет

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

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

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

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

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

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

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

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

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

L=1Nn=1Ni=1KwiTniжурнал(Yni),

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

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

Скопируйте классификацию выходной шаблон слоя в новый файл в 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)
            % 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 на weightedClassificationLayer.

classdef weightedClassificationLayer < nnet.layer.ClassificationLayer
    ...
end

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

    methods
        function layer = weightedClassificationLayer()           
            ...
        end

        ...
     end

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    properties
        % Vector of weights corresponding to the classes in the training
        % data
        ClassWeights
    end

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

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

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

        function layer = weightedClassificationLayer(classWeights, name)
            % layer = weightedClassificationLayer(classWeights) creates a
            % weighted cross entropy loss layer. classWeights is a row
            % vector of weights corresponding to the classes in the order
            % that they appear in the training data.
            % 
            % layer = weightedClassificationLayer(classWeights, name)
            % additionally specifies the layer name.

            ...
        end

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

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

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

        function layer = weightedClassificationLayer(classWeights, name)
            % layer = weightedClassificationLayer(classWeights) creates a
            % weighted cross entropy loss layer. classWeights is a row
            % vector of weights corresponding to the classes in the order
            % that they appear in the training data.
            % 
            % layer = weightedClassificationLayer(classWeights, name)
            % additionally specifies the layer name. 

            % Set class weights
            layer.ClassWeights = classWeights;

            % Set layer name
            if nargin == 2
                layer.Name = name;
            end

            % Set layer description
            layer.Description = 'Weighted cross entropy';
        end

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

Создайте функцию с именем forwardLoss, который возвращает взвешенную перекрестную энтропийную потерю между прогнозами, сделанными сетью и учебными целями. Синтаксисом для 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 слоем перед выходным слоем.

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

L=1Nn=1Ni=1KwiTniжурнал(Yni),

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

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

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

            N = size(Y,4);
            Y = squeeze(Y);
            T = squeeze(T);
            W = layer.ClassWeights;
    
            loss = -sum(W*(T.*log(Y)))/N;
        end

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

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

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

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

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

δLδYi=1NwiTiYi,

где N является количеством наблюдений, и w является вектором весов для каждого класса. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксисы функции.

        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the weighted cross entropy loss with respect to the
            % predictions Y.

            [~,~,K,N] = size(Y);
            Y = squeeze(Y);
            T = squeeze(T);
            W = layer.ClassWeights;
			
            dLdY = -(W'.*T./Y)/N;
            dLdY = reshape(dLdY,[1 1 K N]);
        end

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

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

classdef weightedClassificationLayer < nnet.layer.ClassificationLayer
               
    properties
        % Vector of weights corresponding to the classes in the training
        % data
        ClassWeights
    end

    methods
        function layer = weightedClassificationLayer(classWeights, name)
            % layer = weightedClassificationLayer(classWeights) creates a
            % weighted cross entropy loss layer. classWeights is a row
            % vector of weights corresponding to the classes in the order
            % that they appear in the training data.
            % 
            % layer = weightedClassificationLayer(classWeights, name)
            % additionally specifies the layer name. 

            % Set class weights
            layer.ClassWeights = classWeights;

            % Set layer name
            if nargin == 2
                layer.Name = name;
            end

            % Set layer description
            layer.Description = 'Weighted cross entropy';
        end
        
        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the weighted cross
            % entropy loss between the predictions Y and the training
            % targets T.

            N = size(Y,4);
            Y = squeeze(Y);
            T = squeeze(T);
            W = layer.ClassWeights;
    
            loss = -sum(W*(T.*log(Y)))/N;
        end
        
        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the weighted cross entropy loss with respect to the
            % predictions Y.

            [~,~,K,N] = size(Y);
            Y = squeeze(Y);
            T = squeeze(T);
            W = layer.ClassWeights;
			
            dLdY = -(W'.*T./Y)/N;
            dLdY = reshape(dLdY,[1 1 K N]);
        end
    end
end

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

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

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

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

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

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

Создайте экземпляр слоя. Задайте веса класса как вектор с тремя элементами, соответствующими трем классам.

classWeights = [0.1 0.7 0.2];
layer = weightedClassificationLayer(classWeights);

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

numClasses = numel(classWeights);
validInputSize = [1 1 numClasses];
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.18924 seconds.

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

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

| |

Похожие темы