Если Deep Learning Toolbox™ не обеспечивает слой, вы требуете для своей классификации или проблемы регрессии, то можно задать собственный слой с помощью этого примера в качестве руководства. Для списка встроенных слоев смотрите Список слоев глубокого обучения.
Чтобы задать пользовательский слой глубокого обучения, можно использовать шаблон, обеспеченный в этом примере, который берет вас через следующие шаги:
Назовите слой — Дают слою имя так, чтобы можно было использовать его в MATLAB®.
Объявите, что свойства слоя — Задают свойства слоя включая настраиваемые параметры и параметры состояния.
Создайте (дополнительную) функцию конструктора — Задают, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то при создании, программное обеспечение инициализирует Name
Описание
, и Type
свойства с []
и определяет номер вводов и выводов слоя к 1.
Создайте прямые функции — Задают, как данные передают вперед через слой (прямое распространение) во время предсказания и в учебное время.
Создайте (дополнительную) функцию состояния сброса — Задают, как сбросить параметры состояния.
Создайте обратную (дополнительную) функцию — Задают производные потери относительно входных данных и настраиваемых параметров (обратное распространение). Если вы не задаете обратную функцию, то прямые функции должны поддержать dlarray
объекты.
Чтобы создать пользовательский слой, который поддерживает генерацию кода:
Слой должен задать прагму %#codegen
в определении слоя.
Входные параметры predict
должен быть:
Сопоставимый в размерности. Каждый вход должен иметь то же количество размерностей.
Сопоставимый в пакетном размере. Каждый вход должен иметь тот же пакетный размер.
Выходные параметры predict
должно быть сопоставимым в размерности и пакетном размере с входными параметрами слоя.
Нескалярные свойства должны иметь один тип, дважды, или символьный массив.
Скалярные свойства должны иметь тип, числовой, логический, или строка.
Генерация кода поддерживает промежуточные слои с 2D изображением или входом функции только. Генерация кода не делает уровней поддержки со свойствами состояний (свойства с атрибутом State
).
В этом примере показано, как создать слой [1] PReLU, который является слоем с настраиваемым параметром, и используйте его в сверточной нейронной сети. Слой PReLU выполняет пороговую операцию, где для каждого канала, любое входное значение меньше, чем нуль умножаются на скаляр, изученный в учебное время. Для значений меньше, чем нуль слой PReLU применяет масштабные коэффициенты к каждому каналу входа. Эти коэффициенты формируют настраиваемый параметр, который слой изучает во время обучения.
Этот рисунок от [1] сравнивает функции слоя ReLU и PReLU.
Скопируйте промежуточный шаблон слоя в новый файл в 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
с codegenPreluLayer
и добавьте комментарий, описывающий слой.
classdef codegenPreluLayer < nnet.layer.Layer & nnet.layer.Formattable % Example custom PReLU layer with codegen support. ... end
Если вы не задаете обратную функцию, то функции слоя, по умолчанию, получают, восстановил после форматирования
dlarray
объекты, как введено. Указывать, что слой получает, отформатировало
dlarray
объекты, как введено и также выходные параметры отформатировали dlarray
объекты, также наследуйтесь nnet.layer.Formattable
класс при определении пользовательского слоя.
Слой не требует formattable входных параметров, поэтому удаляет дополнительный nnet.layer.Formattable
суперкласс.
classdef codegenPreluLayer < nnet.layer.Layer % Example custom PReLU layer with codegen support. ... end
Затем переименуйте myLayer
функция конструктора (первая функция в methods
разделите) так, чтобы это имело то же имя как слой.
methods function layer = codegenPreluLayer() ... end ... end
Сохраните файл класса слоя в новом файле с именем codegenPreluLayer.m
. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке на пути MATLAB.
Добавьте %#codegen
директива (или прагма) к вашему определению слоя, чтобы указать, что вы намереваетесь сгенерировать код для этого слоя. Добавление этой директивы дает Анализатору кода MATLAB команду помогать вам диагностировать и зафиксировать нарушения, которые приводят к ошибкам во время генерации кода.
classdef codegenPreluLayer < nnet.layer.Layer % Example custom PReLU layer with codegen support. %#codegen ... end
Объявите свойства слоя в properties
разделите и объявите настраиваемые параметры путем листинга их в properties (Learnable)
раздел.
По умолчанию пользовательские промежуточные слои имеют эти свойства. Не объявляйте эти свойства в properties
раздел.
Свойство | Описание |
---|---|
Name | Имя слоя в виде вектора символов или строкового скаляра. Для Layer вход массивов, trainNetwork , assembleNetwork , layerGraph , и dlnetwork функции автоматически присваивают имена к слоям с Name установите на '' . |
Description | Однострочное описание слоя в виде строкового скаляра или вектора символов. Это описание появляется, когда слой отображен в Если вы не задаете описание слоя, то программное обеспечение отображает имя класса слоя. |
Type | Тип слоя в виде вектора символов или строкового скаляра. Значение Если вы не задаете тип слоя, то программное обеспечение отображает имя класса слоя. |
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
свойства в конструкторе слоя. Для примера смотрите, Задают Пользовательский Слой Глубокого обучения с Несколькими Входными параметрами.
Поддерживать генерацию кода:
Нескалярные свойства должны иметь один тип, дважды, или символьный массив.
Скалярные свойства должны быть числовыми или иметь логический тип или строка.
Слой PReLU не требует никаких дополнительных свойств, таким образом, можно удалить properties
раздел.
Слой PReLU имеет только один настраиваемый параметр, масштабирующийся коэффициент a. Объявите этот настраиваемый параметр в properties (Learnable)
разделите и вызовите параметр Alpha
.
properties (Learnable)
% Layer learnable parameters
% Scaling coefficient
Alpha
end
Создайте функцию, которая создает слой и инициализирует свойства слоя. Задайте любые переменные, требуемые создать слой как входные параметры к функции конструктора.
Функция конструктора слоя PReLU требует двух входных параметров: количество каналов ожидаемых входных данных и имени слоя. Количество каналов задает размер настраиваемого параметра Alpha
. Задайте два входных параметра под названием numChannels
и name
в codegenPreluLayer
функция. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксис функции.
function layer = codegenPreluLayer(numChannels, name) % layer = codegenPreluLayer(numChannels) creates a PReLU layer with % numChannels channels and specifies the layer name. ... end
Генерация кода не поддерживает arguments
блоки.
Инициализируйте свойства слоя, включая настраиваемые параметры, в функции конструктора. Замените комментарий % Layer constructor function goes here
с кодом, который инициализирует свойства слоя.
Установите Name
свойство к входному параметру name
.
% Set layer name.
layer.Name = name;
Дайте слою однострочное описание путем установки Description
свойство слоя. Установите описание описывать тип слоя и его размера.
% Set layer description. layer.Description = "PReLU with " + numChannels + " channels";
Для слоя PReLU, когда входные значения отрицательны, слой умножает каждый канал входа соответствующим каналом Alpha
. Инициализируйте настраиваемый параметр Alpha
как случайный вектор из размера 1 1 numChannels
. С третьей размерностью, заданной как размер numChannels
, слой может использовать поэлементное умножение входа в прямой функции. Alpha
свойство расположенного на слое объекта, таким образом, необходимо присвоить вектор layer.Alpha
.
% Initialize scaling coefficient.
layer.Alpha = rand([1 1 numChannels]);
Просмотрите завершенную функцию конструктора.
function layer = codegenPreluLayer(numChannels, name)
% layer = codegenPreluLayer(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
С этой функцией конструктора, команда codegenPreluLayer(3,'prelu')
создает слой PReLU с тремя каналами и именем 'prelu'
.
Создайте слой вперед функции, чтобы использовать во время предсказания и учебное время.
Создайте функцию с именем 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
.
Поскольку слой PReLU имеет только один вход и один выход, синтаксис для predict
для PReLU слоем является Z = predict(layer,X)
.
Генерация кода поддерживает пользовательские промежуточные слои с 2D входом изображений только. Входными параметрами является h-by-w-by-c-by-N массивы, где h, w и c соответствуют высоте, ширине и количеству каналов изображений, соответственно, и N является количеством наблюдений. Размерность наблюдения равняется 4.
Для поддержки генерации кода все входные параметры слоя должны иметь то же количество размерностей и пакетного размера.
По умолчанию слой использует predict
как прямая функция в учебное время. Использовать различную прямую функцию в учебное время или сохранить значение потребовали для пользовательской обратной функции, необходимо также создать функцию с именем forward
. Программное обеспечение не генерирует код для forward
функционируйте, но это должна быть совместимая генерация кода.
forward
функция распространяет данные вперед через слой в учебное время и также выводит значение памяти.
forward
синтаксис функций зависит от типа слоя:
Z = forward(layer,X)
вперед входные данные X
через слой и выходные параметры результат Z
, где layer
имеет один вход, один выход.
[Z,state] = forward(layer,X)
также выводит обновленный параметр состояния state
, где layer
имеет один параметр состояния.
[__,memory] = forward(layer,X)
также возвращает значение памяти для пользовательского backward
функция с помощью любого из предыдущих синтаксисов. Если слой имеет обоих пользовательский forward
функционируйте и пользовательский backward
функция, затем прямая функция должна возвратить значение памяти.
Можно настроить синтаксисы для слоев с несколькими входными параметрами, несколькими выходными параметрами или несколькими параметрами состояния:
Для слоев с несколькими входными параметрами замените 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
.
Операцией PReLU дают
где вход нелинейной активации f на канале i, и коэффициент, управляющий наклоном отрицательной части. Индекс i в указывает, что нелинейная активация может варьироваться на различных каналах.
Реализуйте эту операцию в predict
. В predict
, вход X
соответствует x в уравнении. Выход Z
соответствует .
Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксисы функции.
Совет
Если вы предварительно выделяете массивы с помощью функций такой как zeros
, затем необходимо гарантировать, что типы данных этих массивов сопоставимы с входными параметрами функции слоя. Чтобы создать массив нулей совпадающего типа данных как другой массив, используйте "like"
опция zeros
. Например, чтобы инициализировать массив нулей размера sz
с совпадающим типом данных как массив X
, используйте Z = zeros(sz,"like",X)
.
Реализация backward
функция является дополнительной, когда прямые функции полностью поддерживают dlarray
входной параметр. Для поддержки генерации кода, predict
функция должна также поддержать числовой вход.
Один способ вычислить выход операции PReLU состоит в том, чтобы использовать следующий код.
Z = max(X,0) + layer.Alpha .* min(0,X);
.*
операция, можно использовать bsxfun
функцию вместо этого.Z = max(X,0) + bsxfun(@times, layer.Alpha, min(0,X));
bsxfun
не поддерживает dlarray
входной параметр. Реализовывать predict
функция, которая поддерживает и генерацию кода и dlarray
введите, используйте if
оператор с isdlarray
функционируйте, чтобы выбрать соответствующий код для типа входа. function Z = predict(layer, X)
% Z = predict(layer, X) forwards the input data X through the
% layer and outputs the result Z.
if isdlarray(X)
Z = max(X,0) + layer.Alpha .* min(0,X);
else
Z = max(X,0) + bsxfun(@times, layer.Alpha, min(0,X));
end
end
Поскольку predict
функционируйте полностью поддерживает dlarray
объекты, задавая backward
функция является дополнительной. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray.
Просмотрите завершенный файл класса слоя.
classdef codegenPreluLayer < nnet.layer.Layer % Example custom PReLU layer with codegen support. %#codegen properties (Learnable) % Layer learnable parameters % Scaling coefficient Alpha end methods function layer = codegenPreluLayer(numChannels, name) % layer = codegenPreluLayer(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. if isdlarray(X) Z = max(X,0) + layer.Alpha .* min(0,X); else Z = max(X,0) + bsxfun(@times, layer.Alpha, min(0,X)); end end end end
Проверяйте совместимость генерации кода пользовательского слоя codegenPreluLayer
.
Пользовательский слой codegenPreluLayer
, присоединенный к этому пример как вспомогательный файл, применяет операцию PReLU к входным данным. Чтобы получить доступ к этому слою, откройте этот пример как live скрипт.
Создайте экземпляр слоя и проверяйте его валидность с помощью checkLayer
. Задайте допустимый входной размер как размер одного наблюдения за типичным входом к слою. Слой ожидает 4-D входные параметры массивов, где первые три измерения соответствуют высоте, ширине и количеству каналов предыдущего слоя выход, и четвертая размерность соответствует наблюдениям.
Задайте типичный размер входа наблюдения и установите 'ObservationDimension'
опция к 4. Чтобы проверять на совместимость генерации кода, установите CheckCodegenCompatibility
опция к true
. checkLayer
функция не проверяет на функции, которые не совместимы с генерацией кода. Чтобы проверять, что пользовательское определение слоя поддерживается для генерации кода, сначала используйте приложение Готовности Генерации кода. Для получения дополнительной информации смотрите Проверку кода при помощи Инструмента Готовности Генерации кода (MATLAB Coder).
layer = codegenPreluLayer(20,"prelu");
validInputSize = [24 24 20];
checkLayer(layer,validInputSize,ObservationDimension=4,CheckCodegenCompatibility=true)
Skipping GPU tests. No compatible GPU device found. Running nnet.checklayer.TestLayerWithoutBackward .......... .......... ... Done nnet.checklayer.TestLayerWithoutBackward __________ Test Summary: 23 Passed, 0 Failed, 0 Incomplete, 5 Skipped. Time elapsed: 0.54964 seconds.
Функция не обнаруживает проблем со слоем.
[1] "Копаясь Глубоко в Выпрямителях: Превышение Эффективности Человеческого Уровня на Классификации ImageNet". На 2 015 Международных конференциях IEEE по вопросам Компьютерного зрения (ICCV), 1026–34. Сантьяго, Чили: IEEE, 2015. https://doi.org/10.1109/ICCV.2015.123.
functionLayer
| checkLayer
| setLearnRateFactor
| setL2Factor
| getLearnRateFactor
| getL2Factor
| findPlaceholderLayers
| replaceLayer
| assembleNetwork
| PlaceholderLayer