exponenta event banner

Определение вложенного слоя глубокого обучения

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

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

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

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

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

Дополнительные сведения см. в разделе Состав сети глубокого обучения.

В этом примере показано, как создать пользовательский слой, представляющий остаточный блок. Пользовательский слой residualBlockLayer содержит обучаемый блок уровней, состоящий из уровней свертки, нормализации группы, 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. Объявить свойства слоя (Declare the layer properties) - укажите свойства слоя и параметры, которые будут изучены во время обучения.

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

  4. Создать функции прямой передачи - укажите способ передачи данных через уровень (прямое распространение) во время прогнозирования и во время обучения.

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

Слой с шаблоном обучаемых параметров

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

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

    properties
        % (Optional) Layer properties.

        % Layer properties go here.
    end

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

        % Layer learnable parameters go here.
    end
    
    methods
        function layer = myLayer()
            % (Optional) Create a myLayer.
            % This function must have the same name as the class.

            % Layer constructor function goes here.
        end
        
        function [Z1, …, Zm] = predict(layer, X1, …, Xn)
            % Forward input data through the layer at prediction time and
            % output the result.
            %
            % Inputs:
            %         layer       - Layer to forward propagate through
            %         X1, ..., Xn - Input data
            % Outputs:
            %         Z1, ..., Zm - Outputs of layer forward function
            
            % Layer forward function for prediction goes here.
        end

        function [Z1, …, Zm, memory] = forward(layer, X1, …, Xn)
            % (Optional) Forward input data through the layer at training
            % time and output the result and a memory value.
            %
            % Inputs:
            %         layer       - Layer to forward propagate through
            %         X1, ..., Xn - Input data
            % Outputs:
            %         Z1, ..., Zm - Outputs of layer forward function
            %         memory      - Memory value for custom backward propagation

            % Layer forward function for training goes here.
        end

        function [dLdX1, …, dLdXn, dLdW1, …, dLdWk] = ...
                backward(layer, X1, …, Xn, Z1, …, Zm, dLdZ1, …, dLdZm, memory)
            % (Optional) Backward propagate the derivative of the loss  
            % function through the layer.
            %
            % Inputs:
            %         layer             - Layer to backward propagate through
            %         X1, ..., Xn       - Input data
            %         Z1, ..., Zm       - Outputs of layer forward function            
            %         dLdZ1, ..., dLdZm - Gradients propagated from the next layers
            %         memory            - Memory value from forward function
            % Outputs:
            %         dLdX1, ..., dLdXn - Derivatives of the loss with respect to the
            %                             inputs
            %         dLdW1, ..., dLdWk - Derivatives of the loss with respect to each
            %                             learnable parameter
            
            % Layer backward function goes here.
        end
    end
end

Именованный слой

Сначала присвойте слою имя. В первой строке файла класса замените существующее имя myLayer с residualBlockLayer.

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

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

    methods
        function layer = residualBlockLayer()           
            ...
        end

        ...
     end

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

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

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

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

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

СобственностьОписание
NameИмя слоя, указанное как символьный вектор или строковый скаляр. Чтобы включить слой в график слоев, необходимо указать непустое уникальное имя слоя. Если вы обучаете последовательную сеть с уровнем и 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

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

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

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

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

  • Stride (необязательно, с шагом по умолчанию 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 объект без входного уровня и позволяет программному обеспечению автоматически инициализировать обучаемые параметры и параметры состояния во время обучения. Дополнительные сведения см. в разделе Автоматическая инициализация обучаемых объектов 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 является [Z1,…,Zm] = predict(layer,X1,…,Xn), где X1,…,Xn являются n входные данные слоев и Z1,…,Zm являются m выходы слоев. Ценности n и m должны соответствовать NumInputs и NumOutputs свойства слоя.

Совет

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

Совет

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

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

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

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

Ввод слоевРазмер вводаИзмерение наблюдения
2-D изображенияh-by-w-c-by-N, где h, w и c соответствуют высоте, ширине и количеству каналов изображений соответственно, а N - количество наблюдений.4
3-D изображенияh-by-w-d-by-c-by-N, где h, w, d и c соответствуют высоте, ширине, глубине и количеству каналов 3-D изображений соответственно, а N - количество наблюдений.5
Векторные последовательностиc-by-N-by-S, где c - число признаков последовательностей, N - число наблюдений, а S - длина последовательности.2
2-D последовательности изображенийh-by-w-c-by-N-by-S, где h, w и c соответствуют высоте, ширине и количеству каналов изображений, соответственно, N - количество наблюдений, а S - длина последовательности.4
3-D последовательности изображенийh-by-w-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

Совместимость графического процессора

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

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

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

Проверка достоверности слоя с помощью checkLayer

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

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

numFilters = 64;

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

       Name: ''

   Learnable Parameters
    Network: [1x1 dlnetwork]

  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:
	 13 Passed, 0 Failed, 0 Incomplete, 9 Skipped.
	 Time elapsed: 5.2727 seconds.

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

См. также

| | | | |

Связанные темы