Если Deep Learning Toolbox™ не обеспечивает слой, вы требуете для своей классификации или проблемы регрессии, то можно задать собственный слой с помощью этого примера в качестве руководства. Для списка встроенных слоев смотрите Список слоев глубокого обучения.
Чтобы создать пользовательский слой, который сам задает график слоев, можно задать dlnetwork
возразите как настраиваемый параметр. Это известно как сетевой состав. Можно использовать сетевой состав для:
Создайте один пользовательский слой, который представляет блок learnable слоев. Например, остаточный блок.
Создайте сети с потоком управления. Например, где раздел сети может динамически измениться в зависимости от входных данных.
Создайте сети с циклами. Например, где разделы сети подают ее выход назад в себя.
Для получения дополнительной информации смотрите Состав Нейронной сети для глубокого обучения.
В этом примере показано, как создать пользовательский слой, представляющий остаточный блок. Пользовательский слой residualBlockLayer
содержит learnable блок слоев, состоящих из свертки, нормализации группы, ReLU и слоев сложения, и также включает связь пропуска и дополнительную свертку и слой нормализации группы в связи пропуска. Эта схема подсвечивает остаточную блочную структуру.
Чтобы задать пользовательский слой глубокого обучения, можно использовать шаблон, обеспеченный в этом примере, который берет вас через следующие шаги:
Назовите слой – дают слою имя так, чтобы это могло использоваться в MATLAB®.
Объявите, что свойства слоя – задают свойства слоя и какие параметры изучены во время обучения.
Создайте (дополнительную) функцию конструктора – задают, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то при создании, программное обеспечение инициализирует Name
Описание
, и Type
свойства с []
и определяет номер вводов и выводов слоя к 1.
Создайте прямые функции – задают, как данные передают вперед через слой (прямое распространение) во время предсказания и в учебное время.
Создайте обратную (дополнительную) функцию – задают производные потери относительно входных данных и настраиваемых параметров (обратное распространение). Если вы не задаете обратную функцию, то прямые функции должны поддержать dlarray
объекты.
Скопируйте слой с шаблоном настраиваемых параметров в новый файл в MATLAB. Этот шаблон обрисовывает в общих чертах структуру слоя с настраиваемыми параметрами и включает функции, которые задают поведение слоя.
classdef myLayer < nnet.layer.Layer 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
разделите) так, чтобы это имело то же имя как слой.
methods function layer = residualBlockLayer() ... end ... end
Сохраните файл класса слоя в новом файле с именем residualBlockLayer.m
. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке на пути MATLAB.
Объявите свойства слоя в properties
разделите и объявите настраиваемые параметры путем листинга их в properties (Learnable)
раздел.
По умолчанию пользовательские промежуточные слои имеют эти свойства:
Свойство | Описание |
---|---|
Name |
Имя слоя в виде вектора символов или строкового скаляра. Чтобы включать слой в график слоев, необходимо задать непустое уникальное имя слоя. Если вы обучаете серийную сеть со слоем и Name установлен в '' , затем программное обеспечение автоматически присваивает имя к слою в учебное время.
|
Description | Однострочное описание слоя в виде вектора символов или строкового скаляра. Это описание появляется, когда слой отображен в |
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
, задайте два необходимых входных параметра под названием inputSize
и numFilters
, и дополнительные аргументы как пары "имя-значение" с именем NameValueArgs
. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксис функции.
function layer = residualBlockLayer(inputSize,numFilters,NameValueArgs) % layer = residualBlockLayer(inputSize,numFilters) creates a % residual block layer with the specified input size and number % of filters. % % layer = residualBlockLayer(inputSize,numFilters,Name,Value) % specifies additional options using one or more name-value % pairs: % % '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 inputSize 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";
Задайте остаточный блок. Во-первых, создайте массив слоя, содержащий основные слои блока, и преобразуйте его в график слоев. График слоев должен иметь входной слой.
% Define nested layer graph. layers = [ imageInputLayer(inputSize,'Normalization','None','Name','in') 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,'in','convSkip'); lgraph = connectLayers(lgraph,'gnSkip','add/in2'); else lgraph = connectLayers(lgraph,'in','add/in2'); end
Наконец, преобразуйте график слоев в dlnetwork
объект и набор слой Network
свойство.
% Convert to dlnetwork. dlnet = dlnetwork(lgraph); % Set Network property. layer.Network = dlnet;
Просмотрите завершенную функцию конструктора.
function layer = residualBlockLayer(inputSize,numFilters,NameValueArgs)
% layer = residualBlockLayer(inputSize,numFilters) creates a
% residual block layer with the specified input size and number
% of filters.
%
% layer = residualBlockLayer(inputSize,numFilters,Name,Value)
% specifies additional options using one or more name-value
% pairs:
%
% '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
inputSize
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 = [
imageInputLayer(inputSize,'Normalization','None','Name','in')
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,'in','convSkip');
lgraph = connectLayers(lgraph,'gnSkip','add/in2');
else
lgraph = connectLayers(lgraph,'in','add/in2');
end
% Convert to dlnetwork.
dlnet = dlnetwork(lgraph);
% Set Network property.
layer.Network = dlnet;
end
С этой функцией конструктора, команда residualBlockLayer([32 32 64],64,'Stride',2,'IncludeSkipConvolution',true,'Name','res5')
создает остаточный слой блока с входным размером [32 32 64]
, 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
функция гарантирует, что программное обеспечение использует правильные операции слоя для предсказания.
Поскольку остаточный блок имеет только один вход и один выход, синтаксис для predict
поскольку пользовательским слоем является Z = predict(layer,X)
.
По умолчанию слой использует predict
как прямая функция в учебное время. Использовать различную прямую функцию в учебное время или сохранить значение потребовали для пользовательской обратной функции, необходимо также создать функцию с именем forward
.
Размерности входных параметров зависят от типа данных и выхода связанных слоев:
Вход слоя | Введите размер | Размерность наблюдения |
---|---|---|
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 |
Для остаточного слоя блока прямая передача слоя является просто прямой передачей dlnetwork
объект. Передать входные данные dlnetwork
объект, необходимо сначала преобразовать его в отформатированный dlarray
объект.
Реализуйте эту операцию в пользовательской функции слоя predict
. Выполнять прямую передачу dlnetwork
для предсказания используйте predict
функция для dlnetwork
объекты.
Поскольку слои в 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);
% 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(inputSize,numFilters,NameValueArgs) % layer = residualBlockLayer(inputSize,numFilters) creates a % residual block layer with the specified input size and number % of filters. % % layer = residualBlockLayer(inputSize,numFilters,Name,Value) % specifies additional options using one or more name-value % pairs: % % '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 inputSize 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 = [ imageInputLayer(inputSize,'Normalization','None','Name','in') 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,'in','convSkip'); lgraph = connectLayers(lgraph,'gnSkip','add/in2'); else lgraph = connectLayers(lgraph,'in','add/in2'); end % Convert to dlnetwork. dlnet = dlnetwork(lgraph); % 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); % Strip dimension labels. Z = stripdims(Z); end end end
Если слой вперед функции полностью поддерживает 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).
В этом примере функции MATLAB используются в predict
вся поддержка dlarray
объекты, таким образом, слоем является совместимый графический процессор.
checkLayer
Проверяйте валидность слоя пользовательского слоя residualBlockLayer
использование checkLayer
функция.
Создайте экземпляр остаточного слоя блока. Чтобы получить доступ к этому слою, откройте этот пример как Живой Scirpt.
inputSize = [56 56 64]; numFilters = 64; layer = residualBlockLayer(inputSize,numFilters)
layer = residualBlockLayer with properties: Name: '' Learnable Parameters Network: [1x1 dlnetwork] Show all properties
Проверяйте валидность слоя с помощью checkLayer
функция. Слой ожидает 4-D входные параметры массивов, где первые три измерения соответствуют высоте, ширине и количеству каналов предыдущего слоя выход, и четвертая размерность соответствует наблюдениям. Задайте допустимый входной размер, который соответствует, размер раньше создавал слой и устанавливал 'ObservationDimension'
опция к 4.
validInputSize = inputSize;
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, 8 Skipped. Time elapsed: 3.4097 seconds.
Здесь, функция не обнаруживает проблем со слоем.
assembleNetwork
| checkLayer
| getL2Factor
| getLearnRateFactor
| setL2Factor
| setLearnRateFactor