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

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

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

  1. Назовите слой – дают слою имя так, чтобы это могло использоваться в MATLAB®.

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

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

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

  5. Создайте обратную (дополнительную) функцию – задают производные потери относительно входных данных и настраиваемых параметров (обратное распространение). Если вы не задаете обратную функцию, то прямые функции должны поддержать 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, name) 
            % layer = preluLayer(numChannels, name) creates a PReLU layer
            % for 2-D image input with numChannels channels and specifies 
            % the layer name.

            % 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

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

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

Синтаксис для backward

[dLdX1,…,dLdXn,dLdW1,…,dLdWk] = backward(layer,X1,…,Xn,Z1,…,Zm,dLdZ1,…,dLdZm,memory)
где:

  • X1,…,Xn n входные параметры слоя

  • Z1,…,Zm m выходные параметры слоя передают функции

  • dLdZ1,…,dLdZm градиенты, назад распространенные от следующего слоя

  • memory выход memory forward если forward задан, в противном случае, memory [].

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

Совет

Если количество входных параметров к backward может варьироваться, затем использовать varargin вместо входных параметров после layer. В этом случае, varargin массив ячеек входных параметров, где varargin{i} соответствует Xi для i=1, …, NumInputs, varargin{NumInputs+j} и varargin{NumInputs+NumOutputs+j} соответствуйте Zj и dLdZj, соответственно, для j=1, …, NumOutputs, и varargin{end} соответствует memory.

Если количество выходных параметров может варьироваться, то используйте varargout вместо выходных аргументов. В этом случае, varargout массив ячеек выходных параметров, где varargout{i} соответствует dLdXi для i=1, …, NumInputs и varargout{NumInputs+t} соответствует dLdWt для t=1, …, k, где k количество настраиваемых параметров.

Поскольку слой 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, name) 
            % layer = preluLayer(numChannels, name) creates a PReLU layer
            % for 2-D image input with numChannels channels and specifies 
            % the layer name.

            % 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). Чтобы использовать графический процессор для глубокого обучения, у вас должен также быть CUDA®, включенный NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Для получения дополнительной информации о работе с графическими процессорами в MATLAB смотрите, что графический процессор Вычисляет в MATLAB (Parallel Computing Toolbox).

Ссылки

[1] Он, Kaiming, Сянюй Чжан, Шаоцин Жэнь и Цзянь Сунь. "Копаясь глубоко в выпрямителях: Превосходная эффективность человеческого уровня на классификации ImageNet". В Продолжениях международной конференции IEEE по вопросам компьютерного зрения, стр 1026-1034. 2015.

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

|

Похожие темы