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

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

Пример Define Custom Classification Output Layer показывает, как определить и создать пользовательский выходной слой классификации с суммой потерь при ошибке квадратов (SSE), и проходит следующие шаги:

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

  2. Объявить свойства слоя - Задать свойства слоя.

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

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

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

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

Создание пользовательского слоя

В примере Define Custom Classification Output Layer показано, как создать слой классификации SSE.

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

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

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

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

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

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

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

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

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

Производная от потерь SSE относительно Y предсказаний задается как

δLδYi=2N(YiTi),

где N - количество наблюдений во входе.

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

        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the SSE loss with respect to the predictions Y.
            
            N = size(Y,4);
            dLdY = 2*(Y-T)/N;
        end

Полный слой

Просмотрите заполненный файл класса слоя.

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

        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the SSE loss with respect to the predictions Y.
            
            N = size(Y,4);
            dLdY = 2*(Y-T)/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).

См. также

|

Похожие темы