Если Deep Learning Toolbox™ не обеспечивает слой, вы требуете для своей задачи, то можно задать собственный слой с помощью этого примера в качестве руководства. Для списка встроенных слоев смотрите Список слоев глубокого обучения.
Чтобы задать пользовательский слой глубокого обучения, можно использовать шаблон, обеспеченный в этом примере, который берет вас через следующие шаги:
Назовите слой — Дают слою имя так, чтобы можно было использовать его в MATLAB®.
Объявите, что свойства слоя — Задают свойства слоя включая настраиваемые параметры и параметры состояния.
Создайте (дополнительную) функцию конструктора — Задают, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то при создании, программное обеспечение инициализирует Name
Описание
, и Type
свойства с []
и определяет номер вводов и выводов слоя к 1.
Создайте прямые функции — Задают, как данные передают вперед через слой (прямое распространение) во время предсказания и в учебное время.
Создайте (дополнительную) функцию состояния сброса — Задают, как сбросить параметры состояния.
Создайте обратную (дополнительную) функцию — Задают производные потери относительно входных данных и настраиваемых параметров (обратное распространение). Если вы не задаете обратную функцию, то прямые функции должны поддержать dlarray
объекты.
При определении функций слоя можно использовать dlarray
объекты. Используя dlarray
объекты делают работу с высокими размерными данными легче, позволяя вам пометить размерности. Например, можно пометить, которому размерности соответствуют пространственный, время, канал, и обрабатывают размерности в пакетном режиме с помощью "S"
T
C
, и "B"
метки, соответственно. Для незаданных и других размерностей используйте "U"
метка. Для dlarray
возразите функциям, которые действуют по конкретным размерностям, можно задать метки размерности путем форматирования dlarray
возразите непосредственно, или при помощи DataFormat
опция.
Используя отформатированный dlarray
объекты в пользовательских слоях также позволяют вам задавать слои, где вводы и выводы имеют различные форматы, такие как слои, которые переставляют, добавляют или удаляют размерности. Например, можно задать слой, который берет в качестве входа мини-пакет изображений с форматом "SSCB"
(пространственный, пространственный, канал, пакет) и выход мини-пакет последовательностей с форматом "CBT"
(образуйте канал, обработайте в пакетном режиме, время). Используя отформатированный dlarray
объекты также позволяют вам задавать слои, которые могут управлять на данных с различными форматами ввода, например, слоями, которые поддерживают входные параметры с форматами "SSCB"
(пространственный, пространственный, канал, пакет) и "CBT"
(образуйте канал, обработайте в пакетном режиме, время).
dlarray
объекты также включают поддержку автоматического дифференцирования. Это означает это, если ваши прямые функции полностью поддерживают dlarray
объекты, затем задавая обратную функцию являются дополнительными.
Включить поддержку использования отформатированного dlarray
объекты в пользовательском слое прямые функции, также наследуйтесь nnet.layer.Formattable
класс при определении пользовательского слоя. Для примера смотрите, Задают Пользовательский Слой Глубокого обучения с Отформатированными Входными параметрами.
В этом примере показано, как задать слой [1] LSTM глазка, который является текущим слоем с настраиваемыми параметрами, и используйте его в нейронной сети. Слой LSTM глазка является вариантом слоя LSTM, где вычисления логического элемента используют состояние ячейки слоя.
Скопируйте промежуточный шаблон слоя в новый файл в 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
с peepholeLSTMLayer
. Позволить слою выводить различные форматы данных, например, данные с форматом "CBT"
(образуйте канал, обработайте в пакетном режиме, время) для последовательности выход и формат "CB"
(образуйте канал, пакет) для одного временного шага или показывают выход, также включают nnet.layer.Formattable
mixin.
classdef peepholeLSTMLayer < nnet.layer.Layer & nnet.layer.Formattable ... end
Затем переименуйте myLayer
функция конструктора (первая функция в methods
разделите) так, чтобы это имело то же имя как слой.
methods function layer = peepholeLSTMLayer() ... end ... end
Сохраните файл класса слоя в новом файле с именем peepholeLSTMLayer.m
. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке на пути MATLAB.
Объявите свойства слоя в properties
разделите, состояния слоя в properties (State)
разделите, и настраиваемые параметры в 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
свойства в конструкторе слоя. Для примера смотрите, Задают Пользовательский Слой Глубокого обучения с Несколькими Входными параметрами.
Объявите следующие свойства слоя в properties
раздел:
NumHiddenUnits
— Количество скрытых модулей в операции LSTM глазка.
OutputMode
— Отметьте указание, возвращает ли слой последовательность или один временной шаг.
properties
% Layer properties.
NumHiddenUnits
OutputMode
end
Слой LSTM глазка имеет четыре настраиваемых параметра: входные веса, текущие веса, веса глазка и смещение. Объявите эти настраиваемые параметры в properties (Learnable)
разделите с именами InputWeights
, RecurrentWeights
, PeepholeWeights
, и Bias
, соответственно.
properties (Learnable)
% Layer learnable parameters.
InputWeights
RecurrentWeights
PeepholeWeights
Bias
end
Слой LSTM глазка имеет параметры с двумя состояниями: скрытое состояние и состояние ячейки. Объявите эти параметры состояния в properties (State)
разделите с именами HiddenState
и CellState
, соответственно.
properties (State)
% Layer state parameters.
HiddenState
CellState
end
Создайте функцию, которая создает слой и инициализирует свойства слоя. Задайте любые переменные, требуемые создать слой как входные параметры к функции конструктора.
Функция конструктора слоя LSTM глазка требует двух входных параметров (количество скрытых модулей и количество входных каналов) и два дополнительных аргумента (имя слоя и режим вывода). Задайте два входных параметра под названием numHiddenUnits
и inputSize
в peepholeLSTMLayer
функция, которые соответствуют количеству скрытых модулей и количеству входных каналов, соответственно. Задайте дополнительные входные параметры как отдельный аргумент с именем args
. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксисы функции.
function layer = peepholeLSTMLayer(numHiddenUnits,inputSize,args) %PEEPHOLELSTMLAYER Peephole LSTM Layer % layer = peepholeLSTMLayer(numHiddenUnits,inputSize) % creates a peephole LSTM layer with the specified number of % hidden units and input channels. % % layer = peepholeLSTMLayer(numHiddenUnits,inputSize,Name=Value) % creates a peephole LSTM layer and specifies additional % options using one or more name-value arguments: % % Name - Name for the layer, specified as a string. % The default is "". % % OutputMode - Output mode, specified as one of the % following: % "sequence" - Output the entire sequence % of data. % % "last" - Output the last time step % of the data. % The default is "sequence". ... end
Инициализируйте свойства слоя, включая настраиваемые параметры и параметры состояния в функции конструктора. Замените комментарий % Layer constructor function goes here
с кодом, который инициализирует свойства слоя.
Проанализируйте входные параметры с помощью arguments
блокируйте и установите Name
и выходные свойства.
arguments numHiddenUnits inputSize args.Name = ""; args.OutputMode = "sequence" end layer.NumHiddenUnits = numHiddenUnits; layer.Name = args.Name; layer.OutputMode = args.OutputMode;
Дайте слою однострочное описание путем установки Description
свойство слоя. Установите описание описывать тип слоя и его размера.
% Set layer description. layer.Description = "Peephole LSTM with " + numHiddenUnits + " hidden units";
Инициализируйте настраиваемые параметры. Инициализируйте входное использование весов инициализация Glorot. Инициализируйте текущие веса с помощью ортогональной инициализации. Инициализируйте смещение с помощью нормализации "модуль, забывают логический элемент". Этот код использует функции помощника initializeGlorot
, initializeOrthogonal
, и initializeUnitForgetGate
. Чтобы получить доступ к этим функциям, откройте пример как live скрипт. Для получения дополнительной информации об инициализации весов, смотрите, Инициализируют Настраиваемые параметры для Функции Модели.
Обратите внимание на то, что текущие веса слоя LSTM глазка и стандартных слоев LSTM имеют различные размеры. Слой LSTM глазка не требует текущих весов для кандидата ячейки вычисление, таким образом, текущими весами является 3*NumHiddenUnits
- NumHiddenUnits
массив.
% Initialize weights and bias.
sz = [4*numHiddenUnits inputSize];
numOut = 4*numHiddenUnits;
numIn = inputSize;
layer.InputWeights = initializeGlorot(sz,numOut,numIn);
sz = [4*numHiddenUnits numHiddenUnits];
layer.RecurrentWeights = initializeOrthogonal(sz);
sz = [3*numHiddenUnits 1];
numOut = 3*numHiddenUnits;
numIn = 1;
layer.PeepholeWeights = initializeGlorot(sz,numOut,numIn);
layer.Bias = initializeUnitForgetGate(numHiddenUnits);
Инициализируйте параметры состояния слоя. Для удобства используйте resetState
функция, определяемая в разделе.
% Initialize layer states.
layer = resetState(layer);
Просмотрите завершенную функцию конструктора.
function layer = peepholeLSTMLayer(numHiddenUnits,inputSize,args)
%PEEPHOLELSTMLAYER Peephole LSTM Layer
% layer = peepholeLSTMLayer(numHiddenUnits,inputSize)
% creates a peephole LSTM layer with the specified number of
% hidden units and input channels.
%
% layer = peepholeLSTMLayer(numHiddenUnits,inputSize,Name=Value)
% creates a peephole LSTM layer and specifies additional
% options using one or more name-value arguments:
%
% Name - Name for the layer, specified as a string.
% The default is "".
%
% OutputMode - Output mode, specified as one of the
% following:
% "sequence" - Output the entire sequence
% of data.
%
% "last" - Output the last time step
% of the data.
% The default is "sequence".
% Parse input arguments.
arguments
numHiddenUnits
inputSize
args.Name = "";
args.OutputMode = "sequence";
end
layer.NumHiddenUnits = numHiddenUnits;
layer.Name = args.Name;
layer.OutputMode = args.OutputMode;
% Set layer description.
layer.Description = "Peephole LSTM with " + numHiddenUnits + " hidden units";
% Initialize weights and bias.
sz = [4*numHiddenUnits inputSize];
numOut = 4*numHiddenUnits;
numIn = inputSize;
layer.InputWeights = initializeGlorot(sz,numOut,numIn);
sz = [4*numHiddenUnits numHiddenUnits];
layer.RecurrentWeights = initializeOrthogonal(sz);
sz = [3*numHiddenUnits 1];
numOut = 3*numHiddenUnits;
numIn = 1;
layer.PeepholeWeights = initializeGlorot(sz,numOut,numIn);
layer.Bias = initializeUnitForgetGate(numHiddenUnits);
% Initialize layer states.
layer = resetState(layer);
end
С этой функцией конструктора, команда peepholeLSTMLayer(200,12,OutputMode="last",Name="peephole")
создает слой LSTM глазка с 200 скрытыми модулями, входным размером 12, и имя "peephole"
, и выходные параметры последний временной шаг операции LSTM глазка.
Создайте слой вперед функции, чтобы использовать во время предсказания и учебное время.
Создайте функцию с именем 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
функция гарантирует, что программное обеспечение использует правильные операции слоя для предсказания.
Поскольку слой LSTM глазка имеет только один вход, один выход, и параметры с двумя состояниями, синтаксис для predict
для глазка слоем LSTM является [Z,hiddenState,cellState] = predict(layer,X)
.
По умолчанию слой использует predict
как прямая функция в учебное время. Использовать различную прямую функцию в учебное время или сохранить значение потребовали для пользовательской обратной функции, необходимо также создать функцию с именем forward
.
Поскольку слой наследовался nnet.layer.Formattable
, входными параметрами слоя является отформатированный dlarray
объекты и predict
функция должна также выходные данные как отформатированный dlarray
объекты.
Скрытым состоянием на временном шаге t дают
где обозначает продукт Адамара (поэлементное умножение векторов).
Состоянием ячейки на временном шаге t дают
Следующие формулы описывают компоненты на временном шаге t.
Компонент | Формула |
---|---|
Введите логический элемент | |
Забудьте логический элемент | |
Кандидат ячейки | |
Выведите логический элемент |
Обратите внимание на то, что выходное вычисление логического элемента требует обновленного состояния ячейки .
В этих вычислениях, и обозначьте логический элемент и утвердите функции активации. Для слоев LSTM глазка используйте сигмоидальные и гиперболические функции тангенса в качестве логического элемента и утвердите функции активации, соответственно.
Реализуйте эту операцию в predict
функция. Поскольку слой не требует различной прямой функции для обучения и значения памяти для пользовательской обратной функции, можно удалить forward
функция из файла класса. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксисы функции.
Совет
Если вы предварительно выделяете массивы с помощью функций такой как zeros
, затем необходимо гарантировать, что типы данных этих массивов сопоставимы с входными параметрами функции слоя. Чтобы создать массив нулей совпадающего типа данных как другой массив, используйте "like"
опция zeros
. Например, чтобы инициализировать массив нулей размера sz
с совпадающим типом данных как массив X
, используйте Z = zeros(sz,"like",X)
.
function [Z,cellState,hiddenState] = predict(layer,X)
%PREDICT Peephole LSTM predict function
% [Z,hiddenState,cellState] = predict(layer,X) forward
% propagates the data X through the layer and returns the
% layer output Z and the updated hidden and cell states. X
% is a dlarray with format "CBT" and Z is a dlarray with
% format "CB" or "CBT", depending on the layer OutputMode
% property.
% Initialize sequence output.
numHiddenUnits = layer.NumHiddenUnits;
miniBatchSize = size(X,finddim(X,"B"));
numTimeSteps = size(X,finddim(X,"T"));
if layer.OutputMode == "sequence"
Z = zeros(numHiddenUnits,miniBatchSize,numTimeSteps,"like",X);
Z = dlarray(Z,"CBT");
end
% Calculate WX + b.
X = stripdims(X);
WX = pagemtimes(layer.InputWeights,X) + layer.Bias;
% Indices of concatenated weight arrays.
idx1 = 1:numHiddenUnits;
idx2 = 1+numHiddenUnits:2*numHiddenUnits;
idx3 = 1+2*numHiddenUnits:3*numHiddenUnits;
idx4 = 1+3*numHiddenUnits:4*numHiddenUnits;
% Initial states.
hiddenState = layer.HiddenState;
cellState = layer.CellState;
% Loop over time steps.
for t = 1:numTimeSteps
% Calculate R*h_{t-1}.
Rht = layer.RecurrentWeights * hiddenState;
% Calculate p*c_{t-1}.
pict = layer.PeepholeWeights(idx1) .* cellState;
pfct = layer.PeepholeWeights(idx2) .* cellState;
% Gate calculations.
it = sigmoid(WX(idx1,:,t) + Rht(idx1,:) + pict);
ft = sigmoid(WX(idx2,:,t) + Rht(idx2,:) + pfct);
gt = tanh(WX(idx3,:,t) + Rht(idx3,:));
% Calculate ot using updated cell state.
cellState = gt .* it + cellState .* ft;
poct = layer.PeepholeWeights(idx3) .* cellState;
ot = sigmoid(WX(idx4,:,t) + Rht(idx4,:) + poct);
% Update hidden state.
hiddenState = tanh(cellState) .* ot;
% Update sequence output.
if layer.OutputMode == "sequence"
Z(:,:,t) = hiddenState;
end
end
% Last time step output.
if layer.OutputMode == "last"
Z = dlarray(hiddenState,"CB");
end
end
Поскольку predict
функционируйте только использует функции та поддержка dlarray
объекты, задавая backward
функция является дополнительной. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray.
Когда DAGNetwork
или SeriesNetwork
объекты содержат слои с параметрами состояния, можно сделать предсказания и обновить состояния слоя с помощью predictAndUpdateState
и classifyAndUpdateState
функции. Можно сбросить сетевое состояние с помощью resetState
функция.
resetState
функция для DAGNetwork
, SeriesNetwork
, и dlnetwork
объекты, по умолчанию, не оказывают влияния на пользовательские слои с параметрами состояния. Задавать поведение слоя для resetState
функция для сетевых объектов, задайте дополнительный слой resetState
функция в определении слоя, которое сбрасывает параметры состояния.
resetState
функция должна иметь синтаксис layer = resetState(layer)
, где возвращенному слою сбрасывали свойства состояний.
Создайте функцию с именем resetState
это сбрасывает параметры состояния слоя к нулевым векторам.
function layer = resetState(layer)
%RESETSTATE Reset layer state
% layer = resetState(layer) resets the state properties of the
% layer.
numHiddenUnits = layer.NumHiddenUnits;
layer.HiddenState = zeros(numHiddenUnits,1);
layer.CellState = zeros(numHiddenUnits,1);
end
Просмотрите завершенный файл класса слоя.
classdef peepholeLSTMLayer < nnet.layer.Layer & nnet.layer.Formattable %PEEPHOLELSTMLAYER Peephole LSTM Layer properties % Layer properties. NumHiddenUnits OutputMode end properties (Learnable) % Layer learnable parameters. InputWeights RecurrentWeights PeepholeWeights Bias end properties (State) % Layer state parameters. HiddenState CellState end methods function layer = peepholeLSTMLayer(numHiddenUnits,inputSize,args) %PEEPHOLELSTMLAYER Peephole LSTM Layer % layer = peepholeLSTMLayer(numHiddenUnits,inputSize) % creates a peephole LSTM layer with the specified number of % hidden units and input channels. % % layer = peepholeLSTMLayer(numHiddenUnits,inputSize,Name=Value) % creates a peephole LSTM layer and specifies additional % options using one or more name-value arguments: % % Name - Name for the layer, specified as a string. % The default is "". % % OutputMode - Output mode, specified as one of the % following: % "sequence" - Output the entire sequence % of data. % % "last" - Output the last time step % of the data. % The default is "sequence". % Parse input arguments. arguments numHiddenUnits inputSize args.Name = ""; args.OutputMode = "sequence"; end layer.NumHiddenUnits = numHiddenUnits; layer.Name = args.Name; layer.OutputMode = args.OutputMode; % Set layer description. layer.Description = "Peephole LSTM with " + numHiddenUnits + " hidden units"; % Initialize weights and bias. sz = [4*numHiddenUnits inputSize]; numOut = 4*numHiddenUnits; numIn = inputSize; layer.InputWeights = initializeGlorot(sz,numOut,numIn); sz = [4*numHiddenUnits numHiddenUnits]; layer.RecurrentWeights = initializeOrthogonal(sz); sz = [3*numHiddenUnits 1]; numOut = 3*numHiddenUnits; numIn = 1; layer.PeepholeWeights = initializeGlorot(sz,numOut,numIn); layer.Bias = initializeUnitForgetGate(numHiddenUnits); % Initialize layer states. layer = resetState(layer); end function [Z,cellState,hiddenState] = predict(layer,X) %PREDICT Peephole LSTM predict function % [Z,hiddenState,cellState] = predict(layer,X) forward % propagates the data X through the layer and returns the % layer output Z and the updated hidden and cell states. X % is a dlarray with format "CBT" and Z is a dlarray with % format "CB" or "CBT", depending on the layer OutputMode % property. % Initialize sequence output. numHiddenUnits = layer.NumHiddenUnits; miniBatchSize = size(X,finddim(X,"B")); numTimeSteps = size(X,finddim(X,"T")); if layer.OutputMode == "sequence" Z = zeros(numHiddenUnits,miniBatchSize,numTimeSteps,"like",X); Z = dlarray(Z,"CBT"); end % Calculate WX + b. X = stripdims(X); WX = pagemtimes(layer.InputWeights,X) + layer.Bias; % Indices of concatenated weight arrays. idx1 = 1:numHiddenUnits; idx2 = 1+numHiddenUnits:2*numHiddenUnits; idx3 = 1+2*numHiddenUnits:3*numHiddenUnits; idx4 = 1+3*numHiddenUnits:4*numHiddenUnits; % Initial states. hiddenState = layer.HiddenState; cellState = layer.CellState; % Loop over time steps. for t = 1:numTimeSteps % Calculate R*h_{t-1}. Rht = layer.RecurrentWeights * hiddenState; % Calculate p*c_{t-1}. pict = layer.PeepholeWeights(idx1) .* cellState; pfct = layer.PeepholeWeights(idx2) .* cellState; % Gate calculations. it = sigmoid(WX(idx1,:,t) + Rht(idx1,:) + pict); ft = sigmoid(WX(idx2,:,t) + Rht(idx2,:) + pfct); gt = tanh(WX(idx3,:,t) + Rht(idx3,:)); % Calculate ot using updated cell state. cellState = gt .* it + cellState .* ft; poct = layer.PeepholeWeights(idx3) .* cellState; ot = sigmoid(WX(idx4,:,t) + Rht(idx4,:) + poct); % Update hidden state. hiddenState = tanh(cellState) .* ot; % Update sequence output. if layer.OutputMode == "sequence" Z(:,:,t) = hiddenState; end end % Last time step output. if layer.OutputMode == "last" Z = dlarray(hiddenState,"CB"); end end function layer = resetState(layer) %RESETSTATE Reset layer state % layer = resetState(layer) resets the state properties of the % layer. numHiddenUnits = layer.NumHiddenUnits; layer.HiddenState = zeros(numHiddenUnits,1); layer.CellState = zeros(numHiddenUnits,1); 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).
В этом примере функции MATLAB используются в predict
вся поддержка dlarray
объекты, таким образом, слоем является совместимый графический процессор.
Можно использовать пользовательский слой таким же образом в качестве любого другого слоя в Deep Learning Toolbox. Этот раздел показывает, как создать и обучить сеть для классификации последовательностей с помощью слоя LSTM глазка, который вы создали ранее.
Загрузите обучающие данные в качестве примера.
[XTrain,TTrain] = japaneseVowelsTrainData;
Определить сетевую архитектуру. Создайте массив слоя, содержащий слой LSTM глазка.
inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [
sequenceInputLayer(inputSize)
peepholeLSTMLayer(numHiddenUnits,inputSize,OutputMode="last")
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer];
Задайте опции обучения и обучите сеть. Обучайтесь с мини-пакетным размером 27 и лево-заполните данные.
options = trainingOptions("adam",MiniBatchSize=27,SequencePaddingDirection="left"); net = trainNetwork(XTrain,TTrain,layers,options);
Training on single CPU. |========================================================================================| | Epoch | Iteration | Time Elapsed | Mini-batch | Mini-batch | Base Learning | | | | (hh:mm:ss) | Accuracy | Loss | Rate | |========================================================================================| | 1 | 1 | 00:00:01 | 3.70% | 2.2060 | 0.0010 | | 5 | 50 | 00:00:12 | 92.59% | 0.5917 | 0.0010 | | 10 | 100 | 00:00:24 | 92.59% | 0.2182 | 0.0010 | | 15 | 150 | 00:00:37 | 100.00% | 0.0588 | 0.0010 | | 20 | 200 | 00:00:53 | 96.30% | 0.0843 | 0.0010 | | 25 | 250 | 00:01:09 | 100.00% | 0.0331 | 0.0010 | | 30 | 300 | 00:01:24 | 100.00% | 0.0130 | 0.0010 | |========================================================================================| Training finished: Max epochs completed.
Оцените производительность сети путем предсказания на новых данных и вычисления точности.
[XTest,TTest] = japaneseVowelsTestData; YTest = classify(net,XTest,MiniBatchSize=27); accuracy = mean(YTest==TTest)
accuracy = 0.8757
[1] Грев, Клаус, Рупеш К. Сривэстэва, Ян Кутник, Бас Р. Стеунебринк и Юрген Шмидхубер. "LSTM: одиссея пространства поиска". Транзакции IEEE на нейронных сетях и изучении систем 28, № 10 (2016): 2222–2232.
functionLayer
| checkLayer
| setLearnRateFactor
| setL2Factor
| getLearnRateFactor
| getL2Factor
| findPlaceholderLayers
| replaceLayer
| assembleNetwork
| PlaceholderLayer