Укажите, что пользовательский слой назад функционирует

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

Пример Задает Пользовательский Слой Глубокого обучения с Настраиваемыми параметрами, показывает, как создать пользовательский слой PreLU и проходит следующие шаги:

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

  2. Объявите, что свойства слоя — Задают свойства слоя включая настраиваемые параметры и параметры состояния.

  3. Создайте (дополнительную) функцию конструктора — Задают, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то при создании, программное обеспечение инициализирует NameОписание, и Type свойства с [] и определяет номер вводов и выводов слоя к 1.

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

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

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

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

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

Пример Задает Пользовательский Слой Глубокого обучения с Настраиваемыми параметрами, показывает, как создать слой PReLU. Слой PReLU выполняет пороговую операцию, где для каждого канала, любое входное значение меньше, чем нуль умножаются на скаляр, изученный при обучении time.[1] Для значений меньше, чем нуль, слой PReLU применяет масштабные коэффициенты αi к каждому каналу входа. Эти коэффициенты формируют настраиваемый параметр, который слой изучает во время обучения.

Операцией PReLU дают

f(xi)={xiесли xi>0αixiесли xi0

где xi вход нелинейной активации f на канале i, и αi коэффициент, управляющий наклоном отрицательной части. Индекс i в αi указывает, что нелинейная активация может варьироваться на различных каналах.

Представление слой, созданный в примере, Задает Пользовательский Слой Глубокого обучения с Настраиваемыми параметрами. Этот слой не имеет backward функция.

classdef preluLayer < nnet.layer.Layer
    % Example custom PReLU layer.

    properties (Learnable)
        % Layer learnable parameters
            
        % Scaling coefficient
        Alpha
    end
    
    methods
        function layer = preluLayer(numChannels,args) 
            % layer = preluLayer(numChannels) creates a PReLU layer
            % with numChannels channels.
            %
            % layer = preluLayer(numChannels,Name=name) also specifies the
            % layer name.
    
            arguments
                numChannels
                args.Name = "";
            end
    
            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = "PReLU with " + numChannels + " channels";
        
            % Initialize scaling coefficient.
            layer.Alpha = rand([1 1 numChannels]); 
        end
        
        function Z = predict(layer, X)
            % Z = predict(layer, X) forwards the input data X through the
            % layer and outputs the result Z.
            
            Z = max(X,0) + layer.Alpha .* min(0,X);
        end
    end
end

Примечание

Если слой имеет пользовательскую обратную функцию, то можно все еще наследоваться nnet.layer.Formattable.

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

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

backward синтаксис функций зависит от типа слоя.

  • dLdX = backward(layer,X,Z,dLdZ,memory) возвращает производные dLdX из потери относительно входа слоя, где layer имеет один вход и один выход. Z соответствует прямому функциональному выходу и dLdZ соответствует производной потери относительно Z. Входной параметр функции memory соответствует выходу memory прямой функции.

  • [dLdX,dLdW] = backward(layer,X,Z,dLdZ,memory) также возвращает производный dLdW из потери относительно настраиваемого параметра, где layer имеет один настраиваемый параметр.

  • [dLdX,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory) также возвращает производный dLdSin из потери относительно входа состояния с помощью любого из предыдущих синтаксисов, где layer имеет один параметр состояния и dLdSout соответствует производной потери относительно состояния слоя выход.

  • [dLdX,dLdW,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory) также возвращает производный dLdW из потери относительно настраиваемого параметра и возвращает производный dLdSin из потери относительно входа состояния слоя с помощью любого из предыдущих синтаксисов, где layer имеет один параметр состояния и один настраиваемый параметр.

Можно настроить синтаксисы для слоев с несколькими входными параметрами, несколькими выходными параметрами, несколькими настраиваемыми параметрами или несколькими параметрами состояния:

  • Для слоев с несколькими входными параметрами замените X и dLdX с X1,...,XN и dLdX1,...,dLdXN, соответственно, где N количество входных параметров.

  • Для слоев с несколькими выходными параметрами замените Z и dLdZ с Z1,...,ZM и dLdZ1,...,dLdZM, соответственно, где M количество выходных параметров.

  • Для слоев с несколькими настраиваемыми параметрами замените dLdW с dLdW1,...,dLdWP, где P количество настраиваемых параметров.

  • Для слоев с несколькими параметрами состояния замените dLdSin и dLdSout с dLdSin1,...,dLdSinK и dLdSout1,...,dLdSoutK, соответственно, где K количество параметров состояния.

Чтобы уменьшать использование памяти путем предотвращения неиспользуемых переменных, являющихся сохраненным между прямым и обратным проходом, замените соответствующие входные параметры на ~.

Совет

Если количество входных параметров к backward может варьироваться, затем использовать varargin вместо входных параметров после layer. В этом случае, varargin массив ячеек входных параметров, где первый N элементы соответствуют N входные параметры слоя, следующий M элементы соответствуют M слой выходные параметры, следующий M элементы соответствуют производным потери относительно M слой выходные параметры, следующий K элементы соответствуют K производные потери относительно K состояния выходные параметры и последний элемент соответствуют memory.

Если количество выходных параметров может варьироваться, то используйте varargout вместо выходных аргументов. В этом случае, varargout массив ячеек выходных параметров, где первый N элементы соответствуют N производные потери относительно N входные параметры слоя, следующий P элементы соответствуют производным потери относительно P настраиваемые параметры и следующий K элементы соответствуют производным потери относительно K входные параметры состояния.

Примечание

dlnetwork объекты не поддерживают пользовательские слои, которые требуют значения памяти в пользовательской обратной функции. Использовать пользовательский слой с пользовательской обратной функцией в dlnetwork объект, memory вход backward функциональным определением должен быть ~.

Поскольку слой PReLU имеет только один вход, один выход, один настраиваемый параметр, и не требует выходных параметров слоя вперед функция или значение памяти, синтаксис для backward для PReLU слоем является [dLdX,dLdAlpha] = backward(layer,X,~,dLdZ,~). Размерности X эквивалентны в прямой функции. Размерности dLdZ совпадают с размерностями выхода Z из прямой функции. Размерности и тип данных dLdX совпадают с размерностями и типом данных X. Размерность и тип данных dLdAlpha совпадает с размерностью и типом данных настраиваемого параметра Alpha.

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

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

Производная потери относительно входных данных

Lxi=Lf(xi)f(xi)xi

где L/f(xi) градиент, распространенный от следующего слоя, и производная активации

f(xi)xi={1если xi0αiif xi<0.

Производная потери относительно настраиваемых параметров

Lαi=jLf(xij)f(xij)αi

где i индексирует каналы, j индексирует элементы по высоте, ширине и наблюдениям, и градиент активации

f(xi)αi={0если xi0xiесли xi<0.

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

        function [dLdX, dLdAlpha] = backward(layer, X, ~, dLdZ, ~)
            % [dLdX, dLdAlpha] = backward(layer, X, ~, dLdZ, ~)
            % backward propagates the derivative of the loss function
            % through the layer.
            % Inputs:
            %         layer    - Layer to backward propagate through
            %         X        - Input data
            %         dLdZ     - Gradient propagated from the deeper layer
            % Outputs:
            %         dLdX     - Derivative of the loss with respect to the
            %                    input data
            %         dLdAlpha - Derivative of the loss with respect to the
            %                    learnable parameter Alpha
            
            dLdX = layer.Alpha .* dLdZ;
            dLdX(X>0) = dLdZ(X>0);
            dLdAlpha = min(0,X) .* dLdZ;
            dLdAlpha = sum(dLdAlpha,[1 2]);
    
            % Sum over all observations in mini-batch.
            dLdAlpha = sum(dLdAlpha,4);
        end

Полный слой

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

classdef preluLayer < nnet.layer.Layer
    % Example custom PReLU layer.

    properties (Learnable)
        % Layer learnable parameters
            
        % Scaling coefficient
        Alpha
    end
    
    methods
        function layer = preluLayer(numChannels,args) 
            % layer = preluLayer(numChannels) creates a PReLU layer
            % with numChannels channels.
            %
            % layer = preluLayer(numChannels,Name=name) also specifies the
            % layer name.
    
            arguments
                numChannels
                args.Name = "";
            end
    
            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = "PReLU with " + numChannels + " channels";
        
            % Initialize scaling coefficient.
            layer.Alpha = rand([1 1 numChannels]); 
        end
        
        function Z = predict(layer, X)
            % Z = predict(layer, X) forwards the input data X through the
            % layer and outputs the result Z.
            
            Z = max(X,0) + layer.Alpha .* min(0,X);
        end
        
        function [dLdX, dLdAlpha] = backward(layer, X, ~, dLdZ, ~)
            % [dLdX, dLdAlpha] = backward(layer, X, ~, dLdZ, ~)
            % backward propagates the derivative of the loss function
            % through the layer.
            % Inputs:
            %         layer    - Layer to backward propagate through
            %         X        - Input data
            %         dLdZ     - Gradient propagated from the deeper layer
            % Outputs:
            %         dLdX     - Derivative of the loss with respect to the
            %                    input data
            %         dLdAlpha - Derivative of the loss with respect to the
            %                    learnable parameter Alpha
            
            dLdX = layer.Alpha .* dLdZ;
            dLdX(X>0) = dLdZ(X>0);
            dLdAlpha = min(0,X) .* dLdZ;
            dLdAlpha = sum(dLdAlpha,[1 2]);
    
            % Sum over all observations in mini-batch.
            dLdAlpha = sum(dLdAlpha,4);
        end
    end
end

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

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

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

Ссылки

[1] "Копаясь Глубоко в Выпрямителях: Превышение Эффективности Человеческого Уровня на Классификации ImageNet". На 2 015 Международных конференциях IEEE по вопросам Компьютерного зрения (ICCV), 1026–34. Сантьяго, Чили: IEEE, 2015. https://doi.org/10.1109/ICCV.2015.123.

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

| | | | | | | | |

Похожие темы