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

Совет

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

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

НапечататьОписание
Слой

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

Для примера, показывающего, как задать пользовательский слой с настраиваемыми параметрами, смотрите Define Custom Deep Learning Layer with Настраиваемые Параметры. Для примера, показывающего, как задать пользовательский слой с несколькими входами, смотрите Define Custom Deep Learning Layer with Multiple Inputs.

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

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

Для примера, показывающего, как задать пользовательский выходной слой классификации и задать функцию потерь, смотрите Define Custom Classification Output Layer.

Слой Выхода регрессии

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

Для примера, показывающего, как задать пользовательский выходной слой регрессии и задать функцию потерь, смотрите Define Custom Regression Output Layer.

Шаблоны слоев

Для определения новых слоев можно использовать следующие шаблоны.

 Шаблон промежуточного слоя

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

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

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

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

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

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

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

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

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

Настраиваемые параметры

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

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

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

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

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

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

Для примера этот синтаксис устанавливает коэффициент скорости обучения настраиваемого параметра с именем '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.

Совет

Если у пользовательского слоя есть dlnetwork объект для настраиваемого параметра, затем в predict функция пользовательского слоя, используйте predict функция для dlnetwork. Использование dlnetwork predict объекта функция гарантирует, что программное обеспечение использует правильные операции слоя для предсказания.

Синтаксис для 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.

Совет

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

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

Вход слояВход сигналаРазмерность наблюдения
2-D изображенияh -by- w -by- c -by- N, где h, w и c соответствуют высоте, ширине и количеству каналов изображений, соответственно, а N - количеству наблюдений.4
3-D изображения<reservedrangesplaceholder9>-by-<reservedrangesplaceholder8>-by-<reservedrangesplaceholder7>-by-<reservedrangesplaceholder6>-by-<reservedrangesplaceholder5>, где h, w, d, и c соответствуют высоте, ширине, глубине, и количество каналов 3D изображений, соответственно, и N - количество наблюдений.5
Векторные последовательностиc -by- N -by- S, где c - количество функций последовательностей, N - количество наблюдений, а S - длина последовательности.2
2-D последовательности изображений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

Для слоев, которые выводят последовательности, слои могут выводить последовательности любой длины или выводить данные без временной размерности. Обратите внимание, что при обучении сети, которая выводит последовательности, используя trainNetwork function, длины входа и выхода последовательностей должны совпадать.

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

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

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

  • Используйте определенный алгоритм, чтобы вычислить производные.

  • Используйте операции в передних функциях, которые не поддерживают dlarray объекты.

Пользовательские слои с обучаемыми dlnetwork объекты не поддерживают пользовательские обратные функции.

Чтобы задать пользовательскую обратную функцию, создайте функцию с именем backward.

Синтаксис для backward является [dLdX1,…,dLdXn,dLdW1,…,dLdWk] = backward(layer,X1,…,Xn,Z1,…,Zm,dLdZ1,…,dLdZm,memory), где:

  • X1,…,Xn являются ли n входы слоя

  • Z1,…,Zm являются ли m выходы передних функций слоя

  • dLdZ1,…,dLdZm являются ли градиенты назад распространены от следующего слоя

  • memory - выход памяти forward если forward определяется, в противном случае memory является [].

Для выходов dLdX1,…,dLdXn являются производными от потерь относительно входов слоя и dLdW1,…,dLdWk являются производными от потерь по отношению к k настраиваемые параметры. Чтобы уменьшить использование памяти путем предотвращения сохранения неиспользованных переменных между прямым и обратным проходом, замените соответствующие входные параметры на ~.

Совет

Если количество входов в 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 количество настраиваемых параметров.

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

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

Для вычисления производных от потерь можно использовать правило цепи:

LX(i)=jLzjzjX(i)

LWi=jLZjZjWi

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

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

Совместимость с GPU

Если функции слоя forward полностью поддерживают dlarray объекты, тогда слой совместим с графическим процессором. В противном случае, чтобы быть совместимым с графический процессор, функции слоя должны поддерживать входы и выходные выходы возврата типа gpuArray (Parallel Computing Toolbox).

Многие MATLAB® поддержка встроенных функций gpuArray (Parallel Computing Toolbox) и dlarray входные параметры. Список функций, поддерживающих dlarray объекты, см. Список функций с поддержкой dlarray. Список функций, которые выполняются на графическом процессоре, см. в разделе Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox). Для использования графический процессор для глубокого обучения необходимо иметь также поддерживаемое графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Для получения дополнительной информации о работе с графическими процессорами в MATLAB, смотрите GPU Computing в MATLAB (Parallel Computing Toolbox).

Совместимость генерации кода

Чтобы создать пользовательский слой, поддерживающий генерацию кода:

  • Слой должен задать прагму %#codegen в определении слоя.

  • Входные входы predict должны быть:

    • Последовательный по размерности. Каждый вход должен иметь одинаковое количество размерностей.

    • Согласованность в размере пакета. Каждый вход должен иметь одинаковый размер пакета.

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

  • Нескалярные свойства должны иметь одинарный, двойной или символьный массив.

  • Скалярные свойства должны иметь числовой, логический или строковый тип.

Генерация кода поддерживает промежуточные слои только с 2-D входом изображения.

Для примера, показывающего, как создать пользовательский слой, поддерживающий генерацию кода, смотрите Define Custom Deep Learning Layer for Code Generation.

Состав сети

Чтобы создать пользовательский слой, который сам определяет график слоев, можно задать dlnetwork объект как настраиваемый параметр. Этот способ известен как состав сети. Можно использовать сетевую композицию для:

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

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

  • Создайте сеть с циклами, например, сеть с секциями, которые подают выход назад в себя.

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

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

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.
 
Skipping code generation compatibility tests. To check validity of the layer for code generation, specify the 'CheckCodegenCompatibility' and 'ObservationDimension' options.
 
Running nnet.checklayer.TestLayerWithoutBackward
.......... ...
Done nnet.checklayer.TestLayerWithoutBackward
__________

Test Summary:
	 13 Passed, 0 Failed, 0 Incomplete, 9 Skipped.
	 Time elapsed: 0.15907 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).

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

  • 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 зависят от типа задачи.

Задача классификацииВход сигналаРазмерность наблюдения
2-D классификации изображений1 на 1-by - K -by - 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 также зависят от типа задачи.

Регрессионная задачаВход сигналаРазмерность наблюдения
2-D регрессию изображения1 на 1-by - R -by - N, где R - количество откликов, а N - количество наблюдений.4
2-D регрессию «изображение-изображение»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
Регрессия от последовательности к единице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 перед слоем выхода.

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

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

The backwardLoss должен выводить dLdY с размером, ожидаемым предыдущим слоем и dLdY быть того же размера, что и Y.

Совместимость с GPU

Если функции слоя forward полностью поддерживают dlarray объекты, тогда слой совместим с графическим процессором. В противном случае, чтобы быть совместимым с графический процессор, функции слоя должны поддерживать входы и выходные выходы возврата типа gpuArray (Parallel Computing Toolbox).

Многие встроенные функции MATLAB поддерживают gpuArray (Parallel Computing Toolbox) и dlarray входные параметры. Список функций, поддерживающих dlarray объекты, см. Список функций с поддержкой dlarray. Список функций, которые выполняются на графическом процессоре, см. в разделе Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox). Для использования графический процессор для глубокого обучения необходимо иметь также поддерживаемое графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Для получения дополнительной информации о работе с графическими процессорами в MATLAB, смотрите GPU Computing в 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.7524

См. также

| | | | |

Похожие темы