Эта тема объясняет, как задать пользовательские слои глубокого обучения для ваших проблем. Для списка встроенных слоев в 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 | Короткое описание слоя, заданного как вектор символов или скаляр строки. Это описание появляется, когда слой отображен в |
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 параметры в 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
функция. В этом случае слой использует predict
в учебное время.
Если вы задаете функциональный forward
и пользовательская обратная функция, затем необходимо присвоить значение аргументу memory
, который можно использовать во время обратного распространения.
Синтаксис для 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 |
Обратная функция слоя вычисляет производные потери относительно входных данных, и затем выходные параметры (назад распространяет), результаты к предыдущему слою. Если слой имеет learnable параметры (например, веса слоя), то backward
также вычисляет производные learnable параметров. При использовании trainNetwork
функция, слой автоматически обновляет learnable параметры с помощью этих производных во время обратного прохода.
Определение обратной функции является дополнительным. Если вы не задаете обратную функцию и слой вперед, функции поддерживают dlarray
объекты, затем программное обеспечение автоматически определяет обратную функцию с помощью автоматического дифференцирования. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray. Задайте пользовательскую обратную функцию, когда это необходимо, к:
Используйте определенный алгоритм, чтобы вычислить производные.
Используйте операции в прямых функциях, которые не поддерживают dlarray
объекты.
Чтобы задать пользовательскую обратную функцию, создайте функцию с именем backward
.
Синтаксис для 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
, соответственно.
Чтобы вычислить производные потери, можно использовать цепочечное правило:
При использовании trainNetwork
функция, слой автоматически обновляет learnable параметры с помощью производных dLdW1
, …, dLdWk
во время обратного прохода.
Если слой вперед функции полностью поддерживает dlarray
объекты, затем слоем является совместимый графический процессор. В противном случае, чтобы быть совместимым графическим процессором, функции уровня должны поддержать входные параметры и возвратить выходные параметры типа gpuArray
.
Много встроенных функций MATLAB® поддерживают gpuArray
и dlarray
входные параметры. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray. Для списка функций, которые выполняются на графическом процессоре, смотрите функции 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)
Running nnet.checklayer.TestLayerWithoutBackward .......... ....... Done nnet.checklayer.TestLayerWithoutBackward __________ Test Summary: 17 Passed, 0 Failed, 0 Incomplete, 0 Skipped. Time elapsed: 0.68621 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
– Имя слоя, заданное как вектор символов или скаляр строки. Чтобы включать слой в график слоя, необходимо задать непустое уникальное имя слоя. Если вы обучаете серийную сеть со слоем и Name
установлен в ''
, затем программное обеспечение автоматически присваивает имя к слою в учебное время.
Description
– Короткое описание слоя, заданного как вектор символов или скаляр строки. Это описание появляется, когда слой отображен в Layer
массив. Если вы не задаете описание слоя, то программное обеспечение отображает "Classification Output"
или "Regression Output"
.
Type
– Тип слоя, заданного как вектор символов или скаляр строки. Значение Type
появляется, когда слой отображен в Layer
массив. Если вы не задаете тип слоя, то программное обеспечение отображает имя класса слоя.
Пользовательские слои классификации также имеют следующее свойство:
Classes
– Классы выходного слоя, заданного как категориальный вектор, массив строк, массив ячеек из символьных векторов или 'auto'
. Если Classes
'auto'
, затем программное обеспечение автоматически устанавливает классы в учебное время. Если вы задаете массив строк или массив ячеек из символьных векторов str
, затем программное обеспечение устанавливает классы выходного слоя к categorical(str,str)
. Значением по умолчанию является 'auto'
.
Пользовательские слои регрессии также имеют следующее свойство:
ResponseNames
– Имена ответов, заданных массив ячеек из символьных векторов или массив строк. В учебное время программное обеспечение автоматически определяет имена ответа согласно обучающим данным. Значением по умолчанию является {}
.
Если слой не имеет никаких других свойств, то можно не использовать properties
раздел.
Выходной слой вычисляет потерю L
между прогнозами и целями с помощью прямой функции потерь и вычисляет производные потери относительно прогнозов с помощью обратной функции потерь.
Синтаксис для forwardLoss
loss = forwardLoss(layer, Y, T)
. Вход Y
соответствует прогнозам, сделанным сетью. Этими прогнозами является выход предыдущего слоя. Вход T
соответствует учебным целям. Выход loss
потеря между Y
и T
согласно заданной функции потерь. Выход loss
должен быть скаляр.
Если слой прямая функция потерь поддерживает dlarray
объекты, затем программное обеспечение автоматически определяет обратную функцию потерь. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray. В качестве альтернативы, чтобы задать пользовательскую обратную функцию потерь, создайте функцию с именем backwardLoss
.
Синтаксис для 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-one | R-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
функции имеют следующие выходные аргументы.
Функция | Выходной аргумент | Описание |
---|---|---|
forwardLoss | loss | Расчетная потеря между прогнозами Y и истинный целевой T . |
backwardLoss | dLdY | Производная потери относительно прогнозов Y . |
backwardLoss
должен вывести dLdY
с размером, ожидаемым предыдущим слоем и dLdY
быть одного размера с Y
.
Если слой вперед функции полностью поддерживает dlarray
объекты, затем слоем является совместимый графический процессор. В противном случае, чтобы быть совместимым графическим процессором, функции уровня должны поддержать входные параметры и возвратить выходные параметры типа gpuArray
.
Много встроенных функций MATLAB поддерживают gpuArray
и dlarray
входные параметры. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray. Для списка функций, которые выполняются на графическом процессоре, смотрите функции 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.6902
assembleNetwork
| checkLayer
| getL2Factor
| getLearnRateFactor
| setL2Factor
| setLearnRateFactor