Задайте пользовательские слои глубокого обучения

Совет

Эта тема объясняет, как задать пользовательские слои глубокого обучения для ваших проблем. Для списка встроенных слоев в Deep Learning Toolbox™ смотрите Список слоев глубокого обучения.

Эта тема объясняет архитектуру слоев глубокого обучения и как задать пользовательские слои, чтобы использовать для ваших проблем.

ВводОписание
Слой

Задайте пользовательский слой глубокого обучения и задайте дополнительные learnable параметры, передайте функции и обратную функцию.

Для примера, показывающего, как задать пользовательский слой с learnable параметрами, смотрите, Задают Пользовательский Слой Глубокого обучения с Параметрами Learnable. Для примера, показывающего, как задать пользовательский слой с несколькими входными параметрами, смотрите, Задают Пользовательский Слой Глубокого обучения с Несколькими Входными параметрами.

Классификация Выходной слой

Задайте пользовательскую классификацию выходной слой и задайте функцию потерь.

Для примера, показывающего, как задать пользовательскую классификацию выходной слой и задать функцию потерь, смотрите, Задают Пользовательскую Классификацию Выходной Слой.

Регрессия Выходной слой

Задайте пользовательскую регрессию выходной слой и задайте функцию потерь.

Для примера, показывающего, как задать пользовательскую регрессию выходной слой и задать функцию потерь, смотрите, Задают Пользовательскую Регрессию Выходной Слой.

Шаблоны слоя

Можно использовать следующие шаблоны, чтобы задать новые слои.

 Промежуточный шаблон слоя

 Классификация Выходной шаблон слоя

 Регрессия Выходной шаблон слоя

Промежуточная архитектура слоя

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

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

Слои могут иметь несколько вводов или выводов. Например, слой может взять X1, …, Xn от нескольких предыдущих слоев и вперед распространить выходные параметры Z1, …, Z m к следующим слоям.

В конце прямой передачи сети выходной слой вычисляет потерю L между прогнозами Y и истинные цели T.

Во время обратного прохода сети каждый слой берет производные потери относительно выходных параметров слоя, вычисляет производные потери L относительно входных параметров, и затем назад распространяет результаты. Если слой имеет learnable параметры, то слой также вычисляет производные весов слоя (learnable параметры). Слой использует производные весов, чтобы обновить learnable параметры.

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

Промежуточные свойства слоя

Объявите свойства слоя в разделе properties определения класса.

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

СвойствоОписание
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 в конструкторе слоя. Для примера смотрите, Задают Пользовательский Слой Глубокого обучения с Несколькими Входными параметрами.

Параметры Learnable

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

Опционально, можно задать фактор темпа обучения и фактор L2 learnable параметров. По умолчанию каждый learnable параметр имеет свой фактор темпа обучения и факторный набор L2 к 1.

И для встроенных и для пользовательских слоев, можно установить и получить изучить факторы уровня и факторы регуляризации L2 с помощью следующих функций.

ФункцияОписание
setLearnRateFactorУстановите изучить фактор уровня learnable параметра.
setL2FactorУстановите фактор регуляризации L2 learnable параметра.
getLearnRateFactorПолучите изучить фактор уровня learnable параметра.
getL2FactorПолучите фактор регуляризации L2 learnable параметра.

Чтобы задать фактор темпа обучения и фактор L2 learnable параметра, используйте синтаксисы layer = setLearnRateFactor(layer,'MyParameterName',value) и layer = setL2Factor(layer,'MyParameterName',value), соответственно.

Чтобы получить значение фактора темпа обучения и фактора L2 learnable параметра, используйте синтаксисы getLearnRateFactor(layer,'MyParameterName') и getL2Factor(layer,'MyParameterName') соответственно.

Например, этот синтаксис устанавливает изучить фактор уровня learnable параметра с именем 'Alpha' к 0.1.

layer = setLearnRateFactor(layer,'Alpha',0.1);

Передайте функции

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

Если вы не требуете двух различных функций в течение времени прогноза и учебного времени, то можно не использовать функцию forward. В этом случае слой использует 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.

Синтаксис для forward

[Z1,…,Zm,memory] = forward(layer,X1,…,Xn)
где X1,…,Xn является входными параметрами слоя n, Z1,…,Zm слой m выходные параметры, и memory является памятью о слое.

Совет

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

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

Вход слояВведите размерРазмерность наблюдения
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

Обратная функция

Слой использует одну функцию для обратного прохода: backward. Функция backward вычисляет производные потери относительно входных данных, и затем выходные параметры (назад распространяет), результаты к предыдущему слою. Если слой имеет learnable параметры, то backward также вычисляет производные весов слоя (learnable параметры). Во время обратного прохода слой автоматически обновляет learnable параметры с помощью этих производных.

Чтобы вычислить производные потери, можно использовать цепочечное правило:

LX(i)=jLzjzjX(i)

LWi=jLZjZjWi

Синтаксис для backward

[dLdX1,…,dLdXn,dLdW1,…,dLdWk] = backward(layer,X1,…,Xn,Z1,…,Zm,dLdZ1,…,dLdZm,memory)
где X1,…,Xn является входными параметрами слоя n, Z1,…,Zm m выходные параметры forward, dLdZ1,…,dLdZm является градиентами, назад распространенными от следующего слоя, и memory является вывод memory forward. Для выходных параметров dLdX1,…,dLdXn является производными потери относительно входных параметров слоя, и dLdW1,…,dLdWk производные потери относительно k learnable параметры. Чтобы уменьшать использование памяти путем предотвращения неиспользуемых переменных, являющихся сохраненным между прямым и обратным проходом, замените соответствующие входные параметры на ~.

Совет

Если количество входных параметров к backward может отличаться, то используйте varargin вместо входных параметров после layer. В этом случае varargin является массивом ячеек входных параметров, где varargin{i} соответствует Xi для i =1, …, NumInputs, varargin{NumInputs+j} и varargin{NumInputs+NumOutputs+j} соответствуют Zj и dLdZj, соответственно, для j =1, …, NumOutputs, и varargin{end} соответствует memory.

Если количество выходных параметров может отличаться, то используйте varargout вместо выходных аргументов. В этом случае varargout является массивом ячеек выходных параметров, где varargout{i} соответствует dLdXi для i =1, …, NumInputs и varargout{NumInputs+t} соответствуют dLdWt для t =1, …, k, где k является количеством learnable параметров.

Значения X1,…,Xn и Z1,…,Zm эквивалентны в прямых функциях. Размерности dLdZ1,…,dLdZm совпадают с размерностями Z1,…,Zm, соответственно.

Размерности и тип данных dLdX1,…,dLdxn совпадают с размерностями и типом данных X1,…,Xn, соответственно. Размерности и типы данных dLdW1, …, dLdWk совпадает с размерностями и типами данных W1, …, Wk, соответственно.

Во время обратного прохода слой автоматически обновляет learnable параметры с помощью производных dLdW1, …, dLdWk.

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

Для совместимости графического процессора функции уровня должны поддержать входные параметры и возвратить выходные параметры типа gpuArray. Любые другие функции использование слоя должны сделать то же самое. Много встроенных функций MATLAB® поддерживают входные параметры gpuArray. Если вы вызываете какую-либо из этих функций по крайней мере с одним входом gpuArray, то функция выполняется на графическом процессоре и возвращает gpuArray вывод. Для списка функций, которые выполняются на графическом процессоре, смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox). Чтобы использовать графический процессор для глубокого обучения, у вас должен также быть CUDA®, включенный NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Для получения дополнительной информации о работе с графическими процессорами в MATLAB смотрите, что графический процессор Вычисляет в MATLAB (Parallel Computing Toolbox).

Проверяйте валидность слоя

Если вы создаете пользовательский слой глубокого обучения, то можно использовать функцию checkLayer, чтобы проверять, что слой допустим. Функция проверяет слои на валидность, совместимость графического процессора и правильно заданные градиенты. Чтобы проверять, что слой допустим, запустите следующую команду:

checkLayer(layer,validInputSize,'ObservationDimension',dim)
где layer является экземпляром слоя, validInputSize является векторным массивом или массивом ячеек, задающим допустимые входные размеры к слою, и dim задает размерность наблюдений во входных данных слоя. Для больших входных размеров проверки градиента занимают больше времени, чтобы запуститься. Чтобы ускорить тесты, задайте меньший допустимый входной размер.

Для получения дополнительной информации смотрите Проверку Пользовательская Валидность Слоя.

Проверяйте валидность слоя Используя checkLayer

Проверяйте валидность слоя пользовательского слоя preluLayer.

Задайте пользовательский слой PReLU. Чтобы создать этот слой, сохраните файл preluLayer.m в текущей папке.

Создайте экземпляр слоя и проверяйте его валидность с помощью checkLayer. Задайте допустимый входной размер, чтобы быть размером одного наблюдения за типичным входом к слою. Слой ожидает 4-D входные параметры массивов, где первые три измерения соответствуют высоте, ширине и количеству каналов предыдущего слоя вывод, и четвертая размерность соответствует наблюдениям.

Задайте типичный размер входа наблюдения и установите 'ObservationDimension' на 4.

layer = preluLayer(20,'prelu');
validInputSize = [24 24 20];
checkLayer(layer,validInputSize,'ObservationDimension',4)
Skipping GPU tests. No compatible GPU device found.
 
Running nnet.checklayer.TestCase
.......... ........
Done nnet.checklayer.TestCase
__________

Test Summary:
	 18 Passed, 0 Failed, 0 Incomplete, 6 Skipped.
	 Time elapsed: 63.9349 seconds.

Здесь, функция не обнаруживает проблем со слоем.

Включайте слой в сеть

Можно использовать пользовательский слой таким же образом в качестве любого другого слоя в Deep Learning Toolbox.

Задайте пользовательский слой PReLU. Чтобы создать этот слой, сохраните файл preluLayer.m в текущей папке.

Создайте массив слоя, который включает пользовательский слой preluLayer.

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    batchNormalizationLayer
    preluLayer(20,'prelu')
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

Выведите архитектуру слоя

В конце прямой передачи в учебное время выходной слой берет прогнозы (выходные параметры) y предыдущего слоя и вычисляет потерю L между этими прогнозами и учебными целями. Выходной слой вычисляет производные потери L относительно прогнозов y, и выходные параметры (назад распространяет), результаты к предыдущему слою.

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

Выведите свойства слоя

Объявите свойства слоя в разделе properties определения класса.

По умолчанию пользовательские выходные слои имеют следующие свойства:

  • Имя Имя слоя, заданное как вектор символов или скаляр строки. Чтобы включать слой в график слоя, необходимо задать непустое уникальное имя слоя. Если вы обучаете серийную сеть со слоем, и Name установлен в '', то программное обеспечение автоматически присваивает имя к слою в учебное время.

  • Описание Короткое описание слоя, заданного как вектор символов или скаляр строки. Это описание появляется, когда слой отображен в массиве Layer. Если вы не задаете описание слоя, то программное обеспечение отображает "Classification Output" или "Regression Output".

  • Ввод Тип слоя, заданного как вектор символов или скаляр строки. Значение Type появляется, когда слой отображен в массиве Layer. Если вы не задаете тип слоя, то программное обеспечение отображает имя класса слоя.

Пользовательские слои классификации также имеют следующее свойство:

  • Классы Классы выходного слоя, заданного как категориальный вектор, массив строк, массив ячеек из символьных векторов или 'auto'. Если Classes является 'auto', то программное обеспечение автоматически устанавливает классы в учебное время. Если вы задаете массив строк или массив ячеек из символьных векторов str, то программное обеспечение устанавливает классы выходного слоя к categorical(str,str). Значением по умолчанию является 'auto'.

Пользовательские слои регрессии также имеют следующее свойство:

  • ResponseNamesИмена ответов, заданных массив ячеек из символьных векторов или массив строк. В учебное время программное обеспечение автоматически определяет имена ответа согласно данным тренировки. Значением по умолчанию является {}.

Если слой не имеет никаких других свойств, то можно не использовать раздел properties.

Функции потерь

Выходной слой использует две функции, чтобы вычислить потерю и производные: forwardLoss и backwardLoss. Функция forwardLoss вычисляет потерю L. Функция backwardLoss вычисляет производные потери относительно прогнозов.

Синтаксисом для forwardLoss является loss = forwardLoss(layer, Y, T). Вход Y соответствует прогнозам, сделанным сетью. Этими прогнозами является вывод предыдущего слоя. Вход T соответствует учебным целям. Вывод loss является потерей между Y и T согласно заданной функции потерь. Вывод loss должен быть скаляром.

Синтаксисом для backwardLoss является dLdY = backwardLoss(layer, Y, T). Входные параметры Y являются прогнозами, сделанными сетью, и T учебные цели. Вывод dLdY является производной потери относительно прогнозов Y. Вывод dLdY должен быть одного размера как вход Y слоя.

Для проблем классификации размерности T зависят от типа проблемы.

Задача классификацииВведите размерРазмерность наблюдения
2D классификация изображений1 1 K N, где K является количеством классов и N, количество наблюдений.4
3-D классификация изображений1 1 1 K N, где K является количеством классов и N, количество наблюдений.5
Классификация последовательностей к меткеK-by-N, где K является количеством классов и N, является количеством наблюдений.2
Классификация от последовательности к последовательностиK-by-N-by-S, где K является количеством классов, N, является количеством наблюдений, и S является длиной последовательности.2

Размер Y зависит от вывода предыдущего слоя. Чтобы гарантировать, что Y одного размера как T, необходимо включать слой, который выводит правильный размер перед выходным слоем. Например, чтобы гарантировать, что Y является 4-D массивом музыки прогноза к классам K, можно включать полносвязный слой размера K, сопровождаемый softmax слоем перед выходным слоем.

Для проблем регрессии размерности T также зависят от типа проблемы.

Задача регрессииВведите размерРазмерность наблюдения
2D регрессия изображений1 1 R N, где R является количеством ответов и N, количество наблюдений.4
2D регрессия От изображения к изображениюh-by-w-by-c-by-N, где h, w и c являются высотой, шириной, и количеством каналов вывода соответственно и N, является количеством наблюдений.4
3-D регрессия изображений1 1 1 R N, где R является количеством ответов и N, количество наблюдений.5
3-D регрессия От изображения к изображениюh-by-w-by-d-by-c-by-N, где h, w, d и c являются высотой, шириной, глубиной, и количеством каналов вывода соответственно и N, является количеством наблюдений.5
Регрессия Sequence-oneR-by-N, где R является количеством ответов и N, является количеством наблюдений.2
Регрессия от последовательности к последовательностиR-by-N-by-S, где R является количеством ответов, N, является количеством наблюдений, и S является длиной последовательности.2

Например, если сеть задает сеть регрессии изображений с одним ответом и имеет мини-пакеты размера 50, то T является 4-D массивом размера 1 1 1 50.

Размер Y зависит от вывода предыдущего слоя. Чтобы гарантировать, что Y одного размера как T, необходимо включать слой, который выводит правильный размер перед выходным слоем. Например, для регрессии изображений с ответами R, чтобы гарантировать, что Y является 4-D массивом правильного размера, можно включать полносвязный слой размера R перед выходным слоем.

forwardLoss и функции backwardLoss имеют следующие выходные аргументы.

ФункцияВыходной аргументОписание
forwardLosslossРасчетная потеря между прогнозами Y и истинный целевой T.
backwardLossdLdYПроизводная потери относительно прогнозов Y.

Если вы хотите включать пользовательский выходной слой после встроенного слоя, то backwardLoss должен вывести dLdY с размером, ожидаемым предыдущим слоем. Встроенные слои ожидают, что dLdY будет одного размера как Y.

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

Для совместимости графического процессора функции уровня должны поддержать входные параметры и возвратить выходные параметры типа gpuArray. Любые другие функции использование слоя должны сделать то же самое. Много встроенных функций MATLAB поддерживают входные параметры gpuArray. Если вы вызываете какую-либо из этих функций по крайней мере с одним входом gpuArray, то функция выполняется на графическом процессоре и возвращает gpuArray вывод. Для списка функций, которые выполняются на графическом процессоре, смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox). Чтобы использовать графический процессор для глубокого обучения, у вас должен также быть CUDA, включенный NVIDIA, графический процессор с вычисляет возможность 3.0 или выше. Для получения дополнительной информации о работе с графическими процессорами в MATLAB смотрите, что графический процессор Вычисляет в MATLAB (Parallel Computing Toolbox).

Включайте пользовательскую регрессию Выходной слой в сеть

Можно использовать пользовательский выходной слой таким же образом в качестве любого другого выходного слоя в Deep Learning Toolbox. Этот раздел показывает, как создать и обучить сеть для регрессии с помощью пользовательского выходного слоя.

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

Задайте пользовательский средний слой регрессии абсолютной погрешности. Чтобы создать этот слой, сохраните файл maeRegressionLayer.m в текущей папке.

Загрузите данные тренировки в качестве примера.

[XTrain,~,YTrain] = digitTrain4DArrayData;

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

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(1)
    maeRegressionLayer('mae')]
layers = 
  6x1 Layer array with layers:

     1   ''      Image Input           28x28x1 images with 'zerocenter' normalization
     2   ''      Convolution           20 5x5 convolutions with stride [1  1] and padding [0  0  0  0]
     3   ''      Batch Normalization   Batch normalization
     4   ''      ReLU                  ReLU
     5   ''      Fully Connected       1 fully connected layer
     6   'mae'   Regression Output     Mean absolute error

Установите опции обучения и обучите сеть.

options = trainingOptions('sgdm','Verbose',false);
net = trainNetwork(XTrain,YTrain,layers,options);

Оцените производительность сети путем вычисления ошибки прогноза между предсказанными и фактическими углами вращения.

[XTest,~,YTest] = digitTest4DArrayData;
YPred = predict(net,XTest);
predictionError = YTest - YPred;

Вычислите количество прогнозов в приемлемом допуске на погрешность от истинных углов. Установите порог до 10 градусов и вычислите процент прогнозов в этом пороге.

thr = 10;
numCorrect = sum(abs(predictionError) < thr);
numTestImages = size(XTest,4);
accuracy = numCorrect/numTestImages
accuracy = 0.7872

Смотрите также

| | | | |

Похожие темы