Задайте вложенный слой глубокого обучения

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

Чтобы создать пользовательский слой, который сам задает график слоев, можно объявить dlnetwork возразите как настраиваемый параметр в properties (Learnable) раздел определения слоя. Этот метод известен как сетевой состав. Можно использовать сетевой состав для:

  • Создайте один пользовательский слой, который представляет блок learnable слоев, например, остаточный блок.

  • Создайте сеть с потоком управления, например, сеть с разделом, который может динамически измениться в зависимости от входных данных.

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

Для вложенных сетей, которые имеют и настраиваемые параметры и параметры состояния, например, сети с нормализацией партии. или слоями LSTM, объявляют сеть в properties (Learnable, State) раздел определения слоя.

Для получения дополнительной информации смотрите Состав Нейронной сети для глубокого обучения.

В этом примере показано, как создать пользовательский слой, представляющий остаточный блок. Пользовательский слой residualBlockLayer содержит learnable блок слоев, состоящих из свертки, нормализации группы, ReLU и слоев сложения, и также включает связь пропуска и дополнительный слой свертки и слой нормализации группы в связи пропуска. Слой имеет один вход, который используется дважды как вход к каждой ветви. Эта схема подсвечивает остаточную блочную структуру.

Structure of residual block. It contains a convolution, a group normalization, a ReLU, a second convolution, a second group normalization, an addition, and a ReLU layer connected in series. There is a skip connection from the block input to the addition layer. There is also another convolution and group normalization layer connected in series that appears on the skip connection. The layers appearing on the skip connection are highlighted as optional.

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

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

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

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

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

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

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

Промежуточный шаблон слоя

Скопируйте промежуточный шаблон слоя в новый файл в MATLAB. Этот шаблон обрисовывает в общих чертах структуру промежуточного определения класса слоя. Это обрисовывает в общих чертах:

  • Дополнительный properties блоки для свойств слоя, настраиваемых параметров и параметров состояния.

  • Функция конструктора слоя.

  • predict функционируйте и дополнительный forward функция.

  • Дополнительный resetState функция для слоев со свойствами состояний.

  • Дополнительный backward функция.

classdef myLayer < nnet.layer.Layer % & nnet.layer.Formattable (Optional)

    properties
        % (Optional) Layer properties.

        % Declare layer properties here.
    end

    properties (Learnable)
        % (Optional) Layer learnable parameters.

        % Declare learnable parameters here.
    end

    properties (State)
        % (Optional) Layer state parameters.

        % Declare state parameters here.
    end

    properties (Learnable, State)
        % (Optional) Nested dlnetwork objects with both learnable
        % parameters and state.

        % Declare nested networks with learnable and state parameters here.
    end

    methods
        function layer = myLayer()
            % (Optional) Create a myLayer.
            % This function must have the same name as the class.

            % Define layer constructor function here.
        end

        function [Z,state] = predict(layer,X)
            % Forward input data through the layer at prediction time and
            % output the result and updated state.
            %
            % Inputs:
            %         layer - Layer to forward propagate through 
            %         X     - Input data
            % Outputs:
            %         Z     - Output of layer forward function
            %         state - (Optional) Updated layer state.
            %
            %  - For layers with multiple inputs, replace X with X1,...,XN, 
            %    where N is the number of inputs.
            %  - For layers with multiple outputs, replace Z with 
            %    Z1,...,ZM, where M is the number of outputs.
            %  - For layers with multiple state parameters, replace state 
            %    with state1,...,stateK, where K is the number of state 
            %    parameters.

            % Define layer predict function here.
        end

        function [Z,state,memory] = forward(layer,X)
            % (Optional) Forward input data through the layer at training
            % time and output the result, updated state, and a memory
            % value.
            %
            % Inputs:
            %         layer - Layer to forward propagate through 
            %         X     - Layer input data
            % Outputs:
            %         Z      - Output of layer forward function 
            %         state  - (Optional) Updated layer state 
            %         memory - (Optional) Memory value for custom backward
            %                  function
            %
            %  - For layers with multiple inputs, replace X with X1,...,XN, 
            %    where N is the number of inputs.
            %  - For layers with multiple outputs, replace Z with 
            %    Z1,...,ZM, where M is the number of outputs.
            %  - For layers with multiple state parameters, replace state 
            %    with state1,...,stateK, where K is the number of state 
            %    parameters.

            % Define layer forward function here.
        end

        function layer = resetState(layer)
            % (Optional) Reset layer state.

            % Define reset state function here.
        end

        function [dLdX,dLdW,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory)
            % (Optional) Backward propagate the derivative of the loss
            % function through the layer.
            %
            % Inputs:
            %         layer   - Layer to backward propagate through 
            %         X       - Layer input data 
            %         Z       - Layer output data 
            %         dLdZ    - Derivative of loss with respect to layer 
            %                   output
            %         dLdSout - (Optional) Derivative of loss with respect 
            %                   to state output
            %         memory  - Memory value from forward function
            % Outputs:
            %         dLdX   - Derivative of loss with respect to layer input
            %         dLdW   - (Optional) Derivative of loss with respect to
            %                  learnable parameter 
            %         dLdSin - (Optional) Derivative of loss with respect to 
            %                  state input
            %
            %  - For layers with state parameters, the backward syntax must
            %    include both dLdSout and dLdSin, or neither.
            %  - For layers with multiple inputs, replace X and dLdX with
            %    X1,...,XN and dLdX1,...,dLdXN, respectively, where N is
            %    the number of inputs.
            %  - For layers with multiple outputs, replace Z and dlZ with
            %    Z1,...,ZM and dLdZ,...,dLdZM, respectively, where M is the
            %    number of outputs.
            %  - For layers with multiple learnable parameters, replace 
            %    dLdW with dLdW1,...,dLdWP, where P is the number of 
            %    learnable parameters.
            %  - For layers with multiple state parameters, replace dLdSin
            %    and dLdSout with dLdSin1,...,dLdSinK and 
            %    dLdSout1,...dldSoutK, respectively, where K is the number
            %    of state parameters.

            % Define layer backward function here.
        end
    end
end

Назовите слой

Во-первых, дайте слою имя. В первой линии файла класса замените существующее имя myLayer с residualBlockLayer.

classdef residualBlockLayer < nnet.layer.Layer
    ...
end

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

    methods
        function layer = residualBlockLayer()           
            ...
        end

        ...
     end

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

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

Объявите свойства и настраиваемые параметры

Объявите свойства слоя в properties разделите и объявите настраиваемые параметры путем листинга их в properties (Learnable) раздел.

По умолчанию пользовательские промежуточные слои имеют эти свойства. Не объявляйте эти свойства в properties раздел.

СвойствоОписание
NameИмя слоя в виде вектора символов или строкового скаляра. Для Layer вход массивов, trainNetwork, assembleNetwork, layerGraph, и dlnetwork функции автоматически присваивают имена к слоям с Name установите на ''.
Description

Однострочное описание слоя в виде строкового скаляра или вектора символов. Это описание появляется, когда слой отображен в Layer массив.

Если вы не задаете описание слоя, то программное обеспечение отображает имя класса слоя.

Type

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

Если вы не задаете тип слоя, то программное обеспечение отображает имя класса слоя.

NumInputsКоличество входных параметров слоя в виде положительного целого числа. Если вы не задаете это значение, то программное обеспечение автоматически устанавливает NumInputs к количеству имен в InputNames. Значение по умолчанию равняется 1.
InputNamesВведите имена слоя в виде массива ячеек из символьных векторов. Если вы не задаете это значение и NumInputs больше 1, затем программное обеспечение автоматически устанавливает InputNames к {'in1',...,'inN'}, где N равно NumInputs. Значением по умолчанию является {'in'}.
NumOutputsКоличество выходных параметров слоя в виде положительного целого числа. Если вы не задаете это значение, то программное обеспечение автоматически устанавливает NumOutputs к количеству имен в OutputNames. Значение по умолчанию равняется 1.
OutputNamesВыведите имена слоя в виде массива ячеек из символьных векторов. Если вы не задаете это значение и NumOutputs больше 1, затем программное обеспечение автоматически устанавливает OutputNames к {'out1',...,'outM'}, где M равно NumOutputs. Значением по умолчанию является {'out'}.

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

Совет

Если вы создаете слой с несколькими входными параметрами, то необходимо установить любого NumInputs или InputNames свойства в конструкторе слоя. Если вы создаете слой с несколькими выходными параметрами, то необходимо установить любого NumOutputs или OutputNames свойства в конструкторе слоя. Для примера смотрите, Задают Пользовательский Слой Глубокого обучения с Несколькими Входными параметрами.

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

Этот пользовательский слой имеет только один настраиваемый параметр, сам остаточный блок, заданный как dlnetwork объект. Объявите этот настраиваемый параметр в properties (Learnable) разделите и вызовите параметр Network.

    properties (Learnable)
        % Layer learnable parameters
    
        % Residual block.
        Network
    end

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

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

Остаточная функция конструктора слоя блока требует четырех входных параметров:

  • Количество сверточных фильтров

  • Шаг (дополнительный, шагом по умолчанию 1)

  • Отметьте, чтобы включать свертку в связь пропуска (дополнительный, с флагом false по умолчанию)

  • Имя слоя (дополнительный, с именем по умолчанию '')

В функции конструктора residualBlockLayer, задайте необходимый входной параметр numFilters и дополнительные аргументы как пары "имя-значение" с именем NameValueArgs. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксис функции.

        function layer = residualBlockLayer(numFilters,NameValueArgs)
            % layer = residualBlockLayer(numFilters) creates a residual
            % block layer with the specified number of filters.
            %
            % layer = residualBlockLayer(numFilters,Name,Value) specifies
            % additional options using one or more name-value pair
            % arguments:
            % 
            %     'Stride'                 - Stride of convolution operation 
            %                                (default 1)
            %
            %     'IncludeSkipConvolution' - Flag to include convolution in
            %                                skip connection
            %                                (default false)
            %
            %     'Name'                   - Layer name
            %                                (default '')

            ...
        end

Проанализируйте входные параметры

Проанализируйте входные параметры с помощью arguments блок. Перечислите аргументы в том же порядке как синтаксис функций и задайте значения по умолчанию. Затем извлеките значения из NameValueArgs входной параметр.

            % Parse input arguments.
            arguments
                numFilters                
                NameValueArgs.Stride = 1
                NameValueArgs.IncludeSkipConvolution = false
                NameValueArgs.Name = ''
            end
            
            stride = NameValueArgs.Stride;
            includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;
            name = NameValueArgs.Name;

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

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

Установите Name свойство к входному параметру name.

            % Set layer name.
            layer.Name = name;

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

            % Set layer description.
            description = "Residual block with " + numFilters + " filters, stride " + stride;
            if includeSkipConvolution
                description = description + ", and skip convolution";
            end
            layer.Description = description;

Задайте тип слоя путем установки Type свойство. Значение Type появляется, когда слой отображен в Layer массив.

            % Set layer type.
            layer.Type = "Residual Block";

Задайте остаточный блок. Можно создать остаточные слои блока как неинициализированный вложенный dlnetwork объект без входного слоя и позволяет программному обеспечению автоматически инициализировать настраиваемые параметры и параметры состояния в учебное время. Для получения дополнительной информации смотрите, Автоматически Инициализируют Объекты Learnable dlnetwork для Обучения.

Во-первых, создайте массив слоя, содержащий основные слои блока, и преобразуйте его в график слоев.

            % Define nested layer graph.
            layers = [
                convolution2dLayer(3,numFilters,'Padding','same','Stride',stride,'Name','conv1')
                groupNormalizationLayer('all-channels','Name','gn1')
                reluLayer('Name','relu1')
                convolution2dLayer(3,numFilters,'Padding','same','Name','conv2')
                groupNormalizationLayer('channel-wise','Name','gn2')
                
                additionLayer(2,'Name','add')
                reluLayer('Name','relu2')];
            
            lgraph = layerGraph(layers);

Затем добавьте связь пропуска. Если includeSkipConvolution флагом является true, затем также включайте слой свертки и слой нормализации группы в связи пропуска.

            % Add skip connection.
            if includeSkipConvolution
                layers = [
                    convolution2dLayer(1,numFilters,'Stride',stride,'Name','convSkip')
                    groupNormalizationLayer('all-channels','Name','gnSkip')];
                
                lgraph = addLayers(lgraph,layers);
                lgraph = connectLayers(lgraph,'gnSkip','add/in2'); 
            end

С тех пор нет никакого входного слоя, эта сеть имеет два несвязанных входных параметров. Если сеть не имеет связи пропуска, входа к 'conv2' слой и одни из входных параметров к 'add' слой не связан. Если сеть действительно имеет связь пропуска, то несвязанные входные параметры являются входными параметрами к 'conv1' и 'convSkip' слои.

Наконец, преобразуйте график слоев в dlnetwork объект и набор слой Network свойство. Создайте неинициализированный dlnetwork объект. Веса и настраиваемые параметры в dlnetwork объект автоматически инициализируется, когда полная сеть собрана для обучения.

            % Convert to dlnetwork.
            dlnet = dlnetwork(lgraph,'Initialize',false);
            
            % Set Network property.
            layer.Network = dlnet;

Просмотрите завершенную функцию конструктора.

        function layer = residualBlockLayer(numFilters,NameValueArgs)
            % layer = residualBlockLayer(numFilters) creates a residual
            % block layer with the specified number of filters.
            %
            % layer = residualBlockLayer(numFilters,Name,Value) specifies
            % additional options using one or more name-value pair
            % arguments:
            % 
            %     'Stride'                 - Stride of convolution operation 
            %                                (default 1)
            %
            %     'IncludeSkipConvolution' - Flag to include convolution in
            %                                skip connection
            %                                (default false)
            %
            %     'Name'                   - Layer name
            %                                (default '')
    
            % Parse input arguments.
            arguments
                numFilters
                NameValueArgs.Stride = 1
                NameValueArgs.IncludeSkipConvolution = false
                NameValueArgs.Name = ''
            end
    
            stride = NameValueArgs.Stride;
            includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;
            name = NameValueArgs.Name;
    
            % Set layer name.
            layer.Name = name;
    
            % Set layer description.
            description = "Residual block with " + numFilters + " filters, stride " + stride;
            if includeSkipConvolution
                description = description + ", and skip convolution";
            end
            layer.Description = description;
            
            % Set layer type.
            layer.Type = "Residual Block";
    
            % Define nested layer graph.
            layers = [
                convolution2dLayer(3,numFilters,'Padding','same','Stride',stride,'Name','conv1')
                groupNormalizationLayer('all-channels','Name','gn1')
                reluLayer('Name','relu1')
                convolution2dLayer(3,numFilters,'Padding','same','Name','conv2')
                groupNormalizationLayer('channel-wise','Name','gn2')
    
                additionLayer(2,'Name','add')
                reluLayer('Name','relu2')];
    
            lgraph = layerGraph(layers);
    
            % Add skip connection.
            if includeSkipConvolution
                layers = [
                    convolution2dLayer(1,numFilters,'Stride',stride,'Name','convSkip')
                    groupNormalizationLayer('all-channels','Name','gnSkip')];
     
                lgraph = addLayers(lgraph,layers);
                lgraph = connectLayers(lgraph,'gnSkip','add/in2');  
            end 
    
            % Convert to dlnetwork.
            dlnet = dlnetwork(lgraph,'Initialize',false);
    
            % Set Network property.
            layer.Network = dlnet;
        end

С этой функцией конструктора, команда residualBlockLayer(64,'Stride',2,'IncludeSkipConvolution',true,'Name','res5') создает остаточный слой блока с 64 фильтрами, шагом 2, свертка в связи пропуска, и с именем 'res5'. Необходимые размеры весов и параметров определяются, когда завершенная сеть собрана для обучения.

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

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

Создайте функцию с именем predict это распространяет данные вперед через слой во время предсказания и выводит результат.

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

  • Z = predict(layer,X) вперед входные данные X через слой и выходные параметры результат Z, где layer имеет один вход, один выход.

  • [Z,state] = predict(layer,X) также выводит обновленный параметр состояния state, где layer имеет один параметр состояния.

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

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

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

  • Для слоев с несколькими параметрами состояния замените state с state1,...,stateK, где K количество параметров состояния.

Совет

Если количество входных параметров к слою может варьироваться, то используйте varargin вместо X1,…,XN. В этом случае, varargin массив ячеек входных параметров, где varargin{i} соответствует Xi.

Если количество выходных параметров может варьироваться, то используйте varargout вместо Z1,…,ZN. В этом случае, varargout массив ячеек выходных параметров, где varargout{j} соответствует Zj.

Совет

Если пользовательский слой имеет dlnetwork объект для настраиваемого параметра, затем в predict функция пользовательского слоя, используйте predict функция для dlnetwork. Используя dlnetwork объект predict функция гарантирует, что программное обеспечение использует правильные операции слоя для предсказания.

Поскольку остаточный блок имеет только один вход и один выход, синтаксис для предсказывают для пользовательского слоя, Z = predict(layer,X).

По умолчанию слой использует predict как прямая функция в учебное время. Использовать различную прямую функцию в учебное время или сохранить значение потребовали для пользовательской обратной функции, необходимо также создать функцию с именем forward.

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

Вход слояВведите размерРазмерность наблюдения
Характеристические векторыc-by-N, где c соответствует количеству каналов и N, является количеством наблюдений.2
2D изображенияh-by-w-by-c-by-N, где h, w и c соответствуют высоте, ширине, и количеству каналов изображений, соответственно, и N, является количеством наблюдений.4
3-D изображенияh-by-w-by-d-by-c-by-N, где h, w, d и c соответствуют высоте, ширине, глубине, и количеству каналов 3-D изображений, соответственно, и N, является количеством наблюдений.5
Векторные последовательностиc-by-N-by-S, где c является количеством функций последовательностей, N, является количеством наблюдений, и S является длиной последовательности.2
2D последовательности изображенийh-by-w-by-c-by-N-by-S, где h, w и c соответствуют высоте, ширине и количеству каналов изображений, соответственно, N, является количеством наблюдений, и S является длиной последовательности.4
3-D последовательности изображенийh-by-w-by-d-by-c-by-N-by-S, где h, w, d и c соответствуют высоте, ширине, глубине и количеству каналов 3-D изображений, соответственно, N, является количеством наблюдений, и S является длиной последовательности.5

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

Для остаточного слоя блока прямая передача слоя является просто прямой передачей dlnetwork объект. Передать входные данные dlnetwork объект, необходимо сначала преобразовать его в отформатированный dlarray объект.

Реализуйте эту операцию в пользовательской функции слоя predict. Выполнять прямую передачу dlnetwork для предсказания используйте predict функция для dlnetwork объекты. В этом случае вход к остаточному слою блока используется в качестве входа к обоим из несвязанных входных параметров к dlnetwork объект, таким образом, синтаксис для predict для dlnetwork объектом является Z = predict(dlnet,X,X).

Поскольку слои в dlnetwork объект не ведет себя по-другому во время обучения и что остаточный слой блока не требует памяти или различной прямой функции для обучения, можно удалить forward функция из файла класса.

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

        function Z = predict(layer, X)
            % Forward input data through the layer at prediction time and
            % output the result.
            %
            % Inputs:
            %         layer - Layer to forward propagate through
            %         X     - Input data
            % Outputs:
            %         Z - Output of layer forward function
                       
            % Convert input data to formatted dlarray.
            X = dlarray(X,'SSCB');
            
            % Predict using network.
            dlnet = layer.Network;
            Z = predict(dlnet,X,X);
            
            % Strip dimension labels.
            Z = stripdims(Z);
        end

Поскольку predict функционируйте только использует функции та поддержка dlarray объекты, задавая backward функция является дополнительной. Для списка функций та поддержка dlarray объекты, см. Список Функций с Поддержкой dlarray.

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

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

classdef residualBlockLayer < nnet.layer.Layer
    % Example custom residual block layer.


    properties (Learnable)
        % Layer learnable parameters
    
        % Residual block.
        Network
    end
    
    methods
        function layer = residualBlockLayer(numFilters,NameValueArgs)
            % layer = residualBlockLayer(numFilters) creates a residual
            % block layer with the specified number of filters.
            %
            % layer = residualBlockLayer(numFilters,Name,Value) specifies
            % additional options using one or more name-value pair
            % arguments:
            % 
            %     'Stride'                 - Stride of convolution operation 
            %                                (default 1)
            %
            %     'IncludeSkipConvolution' - Flag to include convolution in
            %                                skip connection
            %                                (default false)
            %
            %     'Name'                   - Layer name
            %                                (default '')
    
            % Parse input arguments.
            arguments
                numFilters
                NameValueArgs.Stride = 1
                NameValueArgs.IncludeSkipConvolution = false
                NameValueArgs.Name = ''
            end
    
            stride = NameValueArgs.Stride;
            includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;
            name = NameValueArgs.Name;
    
            % Set layer name.
            layer.Name = name;
    
            % Set layer description.
            description = "Residual block with " + numFilters + " filters, stride " + stride;
            if includeSkipConvolution
                description = description + ", and skip convolution";
            end
            layer.Description = description;
            
            % Set layer type.
            layer.Type = "Residual Block";
    
            % Define nested layer graph.
            layers = [
                convolution2dLayer(3,numFilters,'Padding','same','Stride',stride,'Name','conv1')
                groupNormalizationLayer('all-channels','Name','gn1')
                reluLayer('Name','relu1')
                convolution2dLayer(3,numFilters,'Padding','same','Name','conv2')
                groupNormalizationLayer('channel-wise','Name','gn2')
    
                additionLayer(2,'Name','add')
                reluLayer('Name','relu2')];
    
            lgraph = layerGraph(layers);
    
            % Add skip connection.
            if includeSkipConvolution
                layers = [
                    convolution2dLayer(1,numFilters,'Stride',stride,'Name','convSkip')
                    groupNormalizationLayer('all-channels','Name','gnSkip')];
     
                lgraph = addLayers(lgraph,layers);
                lgraph = connectLayers(lgraph,'gnSkip','add/in2');  
            end 
    
            % Convert to dlnetwork.
            dlnet = dlnetwork(lgraph,'Initialize',false);
    
            % Set Network property.
            layer.Network = dlnet;
        end
        
        function Z = predict(layer, X)
            % Forward input data through the layer at prediction time and
            % output the result.
            %
            % Inputs:
            %         layer - Layer to forward propagate through
            %         X     - Input data
            % Outputs:
            %         Z - Output of layer forward function
                       
            % Convert input data to formatted dlarray.
            X = dlarray(X,'SSCB');
            
            % Predict using network.
            dlnet = layer.Network;
            Z = predict(dlnet,X,X);
            
            % Strip dimension labels.
            Z = stripdims(Z);
        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).

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

Проверяйте валидность слоя Используя checkLayer

Проверяйте валидность слоя пользовательского слоя residualBlockLayer использование checkLayer функция.

Создайте экземпляр остаточного слоя блока. Чтобы получить доступ к этому слою, откройте этот пример как live скрипт.

numFilters = 64;

layer = residualBlockLayer(numFilters)
layer = 
  residualBlockLayer with properties:

       Name: ''

   Learnable Parameters
    Network: [1x1 dlnetwork]

   State Parameters
    No properties.

  Show all properties

Проверяйте валидность слоя с помощью checkLayer функция. Слой ожидает 4-D входные параметры массивов, где первые три измерения соответствуют высоте, ширине и количеству каналов предыдущего слоя выход, и четвертая размерность соответствует наблюдениям. Задайте типичный входной размер и установите 'ObservationDimension' опция к 4.

validInputSize = [56 56 64];
checkLayer(layer,validInputSize,'ObservationDimension',4)
Skipping GPU tests. No compatible GPU device found.
 
Skipping code generation compatibility tests. To check validity of the layer for code generation, specify the 'CheckCodegenCompatibility' and 'ObservationDimension' options.
 
Running nnet.checklayer.TestLayerWithoutBackward
.......... ........
Done nnet.checklayer.TestLayerWithoutBackward
__________

Test Summary:
	 18 Passed, 0 Failed, 0 Incomplete, 10 Skipped.
	 Time elapsed: 6.8268 seconds.

Функция не обнаруживает проблем со слоем.

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

| | | | |

Похожие темы