Если Deep Learning Toolbox™ не обеспечивает слой, вы требуете для своей классификации или проблемы регрессии, то можно задать собственный слой. Для списка встроенных слоев смотрите Список слоев глубокого обучения.
Пример Задает Пользовательский Слой Глубокого обучения с Настраиваемыми параметрами, показывает, как создать пользовательский слой PreLU и проходит следующие шаги:
Назовите слой — Дают слою имя так, чтобы можно было использовать его в MATLAB®.
Объявите, что свойства слоя — Задают свойства слоя включая настраиваемые параметры и параметры состояния.
Создайте (дополнительную) функцию конструктора — Задают, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то при создании, программное обеспечение инициализирует Name
Описание
, и Type
свойства с []
и определяет номер вводов и выводов слоя к 1.
Создайте прямые функции — Задают, как данные передают вперед через слой (прямое распространение) во время предсказания и в учебное время.
Создайте (дополнительную) функцию состояния сброса — Задают, как сбросить параметры состояния.
Создайте обратную (дополнительную) функцию — Задают производные потери относительно входных данных и настраиваемых параметров (обратное распространение). Если вы не задаете обратную функцию, то прямые функции должны поддержать dlarray
объекты.
Если прямая функция только использует функции та поддержка dlarray
объекты, затем создавая обратную функцию являются дополнительными. В этом случае программное обеспечение определяет производные автоматически с помощью автоматического дифференцирования. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray. Если вы хотите использовать функции, которые не поддерживают dlarray
объекты, или хотят использовать определенный алгоритм для обратной функции, затем можно задать пользовательскую обратную функцию с помощью этого примера в качестве руководства.
Пример Задает Пользовательский Слой Глубокого обучения с Настраиваемыми параметрами, показывает, как создать слой PReLU. Слой PReLU выполняет пороговую операцию, где для каждого канала, любое входное значение меньше, чем нуль умножаются на скаляр, изученный при обучении time.[1] Для значений меньше, чем нуль, слой PReLU применяет масштабные коэффициенты к каждому каналу входа. Эти коэффициенты формируют настраиваемый параметр, который слой изучает во время обучения.
Операцией PReLU дают
где вход нелинейной активации f на канале i, и коэффициент, управляющий наклоном отрицательной части. Индекс i в указывает, что нелинейная активация может варьироваться на различных каналах.
Представление слой, созданный в примере, Задает Пользовательский Слой Глубокого обучения с Настраиваемыми параметрами. Этот слой не имеет backward
функция.
classdef preluLayer < nnet.layer.Layer % Example custom PReLU layer. properties (Learnable) % Layer learnable parameters % Scaling coefficient Alpha end methods function layer = preluLayer(numChannels,args) % layer = preluLayer(numChannels) creates a PReLU layer % with numChannels channels. % % layer = preluLayer(numChannels,Name=name) also specifies the % layer name. arguments numChannels args.Name = ""; end % Set layer name. layer.Name = name; % Set layer description. layer.Description = "PReLU with " + numChannels + " channels"; % Initialize scaling coefficient. layer.Alpha = rand([1 1 numChannels]); end function Z = predict(layer, X) % Z = predict(layer, X) forwards the input data X through the % layer and outputs the result Z. Z = max(X,0) + layer.Alpha .* min(0,X); end end end
Примечание
Если слой имеет пользовательскую обратную функцию, то можно все еще наследоваться nnet.layer.Formattable
.
Реализуйте backward
функция, которая возвращает производные потери относительно входных данных и настраиваемых параметров.
backward
синтаксис функций зависит от типа слоя.
dLdX = backward(layer,X,Z,dLdZ,memory)
возвращает производные dLdX
из потери относительно входа слоя, где layer
имеет один вход и один выход. Z
соответствует прямому функциональному выходу и dLdZ
соответствует производной потери относительно Z
. Входной параметр функции memory
соответствует выходу memory прямой функции.
[dLdX,dLdW] = backward(layer,X,Z,dLdZ,memory)
также возвращает производный dLdW
из потери относительно настраиваемого параметра, где layer
имеет один настраиваемый параметр.
[dLdX,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory)
также возвращает производный dLdSin
из потери относительно входа состояния с помощью любого из предыдущих синтаксисов, где layer
имеет один параметр состояния и dLdSout
соответствует производной потери относительно состояния слоя выход.
[dLdX,dLdW,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory)
также возвращает производный dLdW
из потери относительно настраиваемого параметра и возвращает производный dLdSin
из потери относительно входа состояния слоя с помощью любого из предыдущих синтаксисов, где layer
имеет один параметр состояния и один настраиваемый параметр.
Можно настроить синтаксисы для слоев с несколькими входными параметрами, несколькими выходными параметрами, несколькими настраиваемыми параметрами или несколькими параметрами состояния:
Для слоев с несколькими входными параметрами замените X
и dLdX
с X1,...,XN
и dLdX1,...,dLdXN
, соответственно, где N
количество входных параметров.
Для слоев с несколькими выходными параметрами замените Z
и dLdZ
с Z1,...,ZM
и dLdZ1,...,dLdZM
, соответственно, где M
количество выходных параметров.
Для слоев с несколькими настраиваемыми параметрами замените dLdW
с dLdW1,...,dLdWP
, где P
количество настраиваемых параметров.
Для слоев с несколькими параметрами состояния замените dLdSin
и dLdSout
с dLdSin1,...,dLdSinK
и dLdSout1,...,dLdSoutK
, соответственно, где K
количество параметров состояния.
Чтобы уменьшать использование памяти путем предотвращения неиспользуемых переменных, являющихся сохраненным между прямым и обратным проходом, замените соответствующие входные параметры на ~
.
Совет
Если количество входных параметров к backward
может варьироваться, затем использовать varargin
вместо входных параметров после layer
. В этом случае, varargin
массив ячеек входных параметров, где первый N
элементы соответствуют N
входные параметры слоя, следующий M
элементы соответствуют M
слой выходные параметры, следующий M
элементы соответствуют производным потери относительно M
слой выходные параметры, следующий K
элементы соответствуют K
производные потери относительно K
состояния выходные параметры и последний элемент соответствуют memory
.
Если количество выходных параметров может варьироваться, то используйте varargout
вместо выходных аргументов. В этом случае, varargout
массив ячеек выходных параметров, где первый N
элементы соответствуют N
производные потери относительно N
входные параметры слоя, следующий P
элементы соответствуют производным потери относительно P
настраиваемые параметры и следующий K
элементы соответствуют производным потери относительно K
входные параметры состояния.
Примечание
dlnetwork
объекты не поддерживают пользовательские слои, которые требуют значения памяти в пользовательской обратной функции. Использовать пользовательский слой с пользовательской обратной функцией в dlnetwork
объект, memory
вход backward
функциональным определением должен быть ~
.
Поскольку слой PReLU имеет только один вход, один выход, один настраиваемый параметр, и не требует выходных параметров слоя вперед функция или значение памяти, синтаксис для backward
для PReLU слоем является [dLdX,dLdAlpha] = backward(layer,X,~,dLdZ,~)
. Размерности X
эквивалентны в прямой функции. Размерности dLdZ
совпадают с размерностями выхода Z
из прямой функции. Размерности и тип данных dLdX
совпадают с размерностями и типом данных X
. Размерность и тип данных dLdAlpha
совпадает с размерностью и типом данных настраиваемого параметра Alpha
.
Во время обратного прохода слой автоматически обновляет настраиваемые параметры с помощью соответствующих производных.
Чтобы включать пользовательский слой в сеть, слой, прямые функции должны принять выходные параметры предыдущего слоя и вперед распространить массивы с размером, ожидаемым следующим слоем. Точно так же, когда backward
задан, backward
функция должна принять входные параметры с тем же размером как соответствующий выход прямой функции и назад распространить производные с тем же размером.
Производная потери относительно входных данных
где градиент, распространенный от следующего слоя, и производная активации
Производная потери относительно настраиваемых параметров
где i индексирует каналы, j индексирует элементы по высоте, ширине и наблюдениям, и градиент активации
Создайте обратную функцию, которая возвращает эти производные.
function [dLdX, dLdAlpha] = backward(layer, X, ~, dLdZ, ~)
% [dLdX, dLdAlpha] = backward(layer, X, ~, dLdZ, ~)
% backward propagates the derivative of the loss function
% through the layer.
% Inputs:
% layer - Layer to backward propagate through
% X - Input data
% dLdZ - Gradient propagated from the deeper layer
% Outputs:
% dLdX - Derivative of the loss with respect to the
% input data
% dLdAlpha - Derivative of the loss with respect to the
% learnable parameter Alpha
dLdX = layer.Alpha .* dLdZ;
dLdX(X>0) = dLdZ(X>0);
dLdAlpha = min(0,X) .* dLdZ;
dLdAlpha = sum(dLdAlpha,[1 2]);
% Sum over all observations in mini-batch.
dLdAlpha = sum(dLdAlpha,4);
end
Просмотрите завершенный файл класса слоя.
classdef preluLayer < nnet.layer.Layer % Example custom PReLU layer. properties (Learnable) % Layer learnable parameters % Scaling coefficient Alpha end methods function layer = preluLayer(numChannels,args) % layer = preluLayer(numChannels) creates a PReLU layer % with numChannels channels. % % layer = preluLayer(numChannels,Name=name) also specifies the % layer name. arguments numChannels args.Name = ""; end % Set layer name. layer.Name = name; % Set layer description. layer.Description = "PReLU with " + numChannels + " channels"; % Initialize scaling coefficient. layer.Alpha = rand([1 1 numChannels]); end function Z = predict(layer, X) % Z = predict(layer, X) forwards the input data X through the % layer and outputs the result Z. Z = max(X,0) + layer.Alpha .* min(0,X); end function [dLdX, dLdAlpha] = backward(layer, X, ~, dLdZ, ~) % [dLdX, dLdAlpha] = backward(layer, X, ~, dLdZ, ~) % backward propagates the derivative of the loss function % through the layer. % Inputs: % layer - Layer to backward propagate through % X - Input data % dLdZ - Gradient propagated from the deeper layer % Outputs: % dLdX - Derivative of the loss with respect to the % input data % dLdAlpha - Derivative of the loss with respect to the % learnable parameter Alpha dLdX = layer.Alpha .* dLdZ; dLdX(X>0) = dLdZ(X>0); dLdAlpha = min(0,X) .* dLdZ; dLdAlpha = sum(dLdAlpha,[1 2]); % Sum over all observations in mini-batch. dLdAlpha = sum(dLdAlpha,4); end end end
Если слой вперед функции полностью поддерживает 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).
[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