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

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

Пример Задает Пользовательский Взвешенный Слой Классификации, показывает, как задать и создать пользовательскую взвешенную классификацию выходной слой со взвешенной потерей перекрестной энтропии и проходит следующие шаги:

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

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

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

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

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

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

Создайте пользовательский слой

Пример Задает Пользовательский Взвешенный Слой Классификации, показывает, как создать взвешенный слой классификации.

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

L=1Nn=1Ni=1KwiTnilog(Yni),

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

Представление слой, созданный в примере, Задает Пользовательский Взвешенный Слой Классификации. Этот слой не имеет backwardLoss функция.

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
    end
end

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

Реализуйте backwardLoss функция, которая возвращает производные потери относительно входных данных и настраиваемых параметров.

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

Размерности 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

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

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

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

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

|

Похожие темы