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

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

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

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

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

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

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

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

layer = preluLayer(20,'prelu');
validInputSize = [5 5 20];
checkLayer(layer,validInputSize)
Skipping multi-observation tests. To enable tests with multiple observations, specify the 'ObservationDimension' option in checkLayer.
For 2-D image data, set 'ObservationDimension' to 4.
For 3-D image data, set 'ObservationDimension' to 5.
For sequence data, set 'ObservationDimension' to 2.
 
Skipping GPU tests. No compatible GPU device found.
 
Running nnet.checklayer.TestCase
.......... ...
Done nnet.checklayer.TestCase
__________

Test Summary:
	 13 Passed, 0 Failed, 0 Incomplete, 11 Skipped.
	 Time elapsed: 1.532 seconds.

Результаты показывают количество переданных, проваленных, и пропущенных тестов. Если вы не задаете опцию 'ObservationsDimension' или не имеете графического процессора, то функция пропускает соответствующие тесты.

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

Для входа мультинаблюдения слой ожидает массив наблюдений за размером h w c N, где h, w, и c являются высотой, шириной и количеством каналов, соответственно, и N является количеством наблюдений.

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

layer = preluLayer(20,'prelu');
validInputSize = [5 5 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: 2.196 seconds.

В этом случае функция не обнаруживает проблем со слоем.

Список тестов

Функция checkLayer проверяет валидность пользовательского слоя путем выполнения серии тестов.

Промежуточные слои

Функция checkLayer использует эти тесты, чтобы проверять валидность пользовательских промежуточных слоев (слои типа nnet.layer.Layer).

ТестОписание
methodSignaturesAreCorrectСинтаксисы функций уровня правильно заданы.
predictDoesNotErrorpredict не делает ошибки.
forwardDoesNotError

forward не делает ошибки.

forwardPredictAreConsistentInSize

forward и выходные значения predict, одного размера.

backwardDoesNotErrorbackward не делает ошибки.
backwardIsConsistentInSize

Выходные параметры backward сопоставимы в размере:

  • Производные относительно каждого входа одного размера как соответствующий вход.

  • Производные относительно каждого learnable параметра одного размера как соответствующий learnable параметр.

predictIsConsistentInType

Выходные параметры predict сопоставимы в типе с входными параметрами.

forwardIsConsistentInType

Выходные параметры forward сопоставимы в типе с входными параметрами.

backwardIsConsistentInType

Выходные параметры backward сопоставимы в типе с входными параметрами.

gradientsAreNumericallyCorrectГрадиенты, вычисленные в backward, сопоставимы с числовыми градиентами.

Тесты predictIsConsistentInType, forwardIsConsistentInType и backwardIsConsistentInType также проверяют на совместимость графического процессора. Чтобы выполнить функции уровня на графическом процессоре, функции должны поддержать вводы и выводы типа gpuArray с базовым типом данных single.

Если вы не реализовали forward, то checkLayer не запускает forwardDoesNotError, forwardPredictAreConsistentInSize и тесты forwardIsConsistentInType.

Выходной слой

Функция checkLayer использует эти тесты, чтобы проверять валидность пользовательских выходных слоев (слои типа nnet.layer.ClassificationLayer или nnet.layer.RegressionLayer).

ТестОписание
forwardLossDoesNotErrorforwardLoss не делает ошибки.
backwardLossDoesNotErrorbackwardLoss не делает ошибки.
forwardLossIsScalarВывод forwardLoss является скаляром.
backwardLossIsConsistentInSizeВывод backwardLoss сопоставим в размере: dLdY одного размера как прогнозы Y.
forwardLossIsConsistentInType

Вывод forwardLoss сопоставим в типе: loss является тем же типом как прогнозы Y.

backwardLossIsConsistentInType

Вывод backwardLoss сопоставим в типе: dLdY должен быть тем же типом как прогнозы Y.

gradientsAreNumericallyCorrectГрадиенты, вычисленные в backwardLoss, численно правильны.

forwardLossIsConsistentInType и тесты backwardLossIsConsistentInType также проверяют на совместимость графического процессора. Чтобы выполнить функции уровня на графическом процессоре, функции должны поддержать вводы и выводы типа gpuArray с базовым типом данных single.

Сгенерированные данные

Чтобы проверять валидность слоя, функция checkLayer генерирует данные в зависимости от типа слоя:

Тип слояОписание сгенерированных данных
Промежуточное звеноЗначения в области значений [-1,1]
Regression выводПрогнозы и цели со значениями в области значений [-1,1]
Classification вывод

Прогнозы со значениями в области значений [0,1].

Если вы задаете опцию 'ObservationDimension', то цели являются одногорячими закодированными векторами (векторы, содержащие один 1, и 0 в другом месте).

Если вы не задаете опцию 'ObservationDimension', то цели являются значениями в области значений [0,1].

Чтобы проверять на несколько наблюдений, задайте размерность наблюдения с помощью пары "имя-значение" 'ObservationDimension'. Если вы задаете размерность наблюдения, то функция checkLayer проверяет, что функции уровня являются сгенерированными данными допустимого использования с мини-пакетами размера 1 и 2. Если вы не задаете эту пару "имя-значение", то функция пропускает тесты, которые проверяют, что функции уровня допустимы для нескольких наблюдений.

Диагностика

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

Синтаксисы функций

Тестовый methodSignaturesAreCorrect проверяет, что функции уровня правильно задали синтаксисы.

Тестовая диагностикаОписаниеВозможное решение
Incorrect number of input arguments for 'predict' in Layer.Синтаксис для predict не сопоставим с количеством входных параметров слоя.

Задайте правильное количество аргументов ввода и вывода в 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.

Incorrect number of output arguments for 'predict' in LayerСинтаксис для predict не сопоставим с количеством слоя выходные параметры.
Incorrect number of input arguments for 'forward' in LayerСинтаксис для forward не сопоставим с количеством входных параметров слоя.

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

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

Incorrect number of output arguments for 'forward' in LayerСинтаксис для forward не сопоставим с количеством слоя выходные параметры.
Incorrect number of input arguments for 'backward' in LayerСинтаксис для backward не сопоставим с количеством вводов и выводов слоя.

Задайте правильное количество аргументов ввода и вывода в 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 параметров.

Incorrect number of output arguments for 'backward' in LayerСинтаксис для backward не сопоставим с количеством слоя выходные параметры.

Для слоев с несколькими вводами или выводами необходимо установить значения свойств слоя NumInputs (или альтернативно, InputNames) и NumOutputs (или альтернативно, OutputNames) в функции конструктора слоя, соответственно.

Несколько наблюдений

Функция checkLayer проверяет, что функции уровня допустимы для сингла и нескольких наблюдений. Чтобы проверять на несколько наблюдений, задайте размерность наблюдения с помощью пары "имя-значение" 'ObservationDimension'. Если вы задаете размерность наблюдения, то функция checkLayer проверяет, что функции уровня являются сгенерированными данными допустимого использования с мини-пакетами размера 1 и 2. Если вы не задаете эту пару "имя-значение", то функция пропускает тесты, которые проверяют, что функции уровня допустимы для нескольких наблюдений.

Тестовая диагностикаОписаниеВозможное решение
Skipping multi-observation tests. To enable checks with multiple observations, specify the 'ObservationDimension' parameter in checkLayer.Если вы не задаете параметр 'ObservationDimension' в checkLayer, то функция пропускает тесты, которые проверяют данные с несколькими наблюдениями.

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

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

Функции не делают ошибки

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

Промежуточные Слои.  Тестовый predictDoesNotError, forwardDoesNotError и backwardDoesNotError проверяют, что функции уровня не делают ошибки когда переданные входные параметры допустимого размера. Если вы задаете размерность наблюдения, то функция проверяет слой и на одно наблюдение и на несколько наблюдений.

Тестовая диагностикаОписаниеВозможное решение
The function 'predict' threw an error:Ошибки функции predict, когда переданные данные размера validInputSize.Исправьте ошибку, описанную в разделе Framework Diagnostic.
The function 'forward' threw an error:Ошибки функции forward, когда переданные данные размера validInputSize.
The function 'backward' threw an error:Ошибки функции backward, когда передано вывод predict.

Выходной слой.  Тестовый forwardLossDoesNotError и backwardLossDoesNotError проверяют, что функции уровня не делают ошибки когда переданные входные параметры допустимого размера. Если вы задаете размерность наблюдения, то функция проверяет слой и на одно наблюдение и на несколько наблюдений.

Тестовая диагностикаОписаниеВозможное решение
The function 'forwardLoss' threw an error:Ошибки функции forwardLoss, когда переданные данные размера validInputSize.Исправьте ошибку, описанную в разделе Framework Diagnostic.
The function 'backwardLoss' threw an error:Ошибки функции backwardLoss, когда переданные данные размера validInputSize.

Выходные параметры сопоставимы в размере

Эти тесты проверяют, что функция уровня выходные параметры сопоставима в размере.

Промежуточные Слои.  Тестовый backwardIsConsistentInSize проверяет, что 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 параметров.

Производные dLdX1, …, dLdXn должен быть одного размера, когда соответствующий слой вводит, и dLdW1,…,dLdWk должен быть одного размера как соответствующие learnable параметры. Размеры должны быть сопоставимы для входных данных с синглом и несколькими наблюдениями.

Тестовая диагностикаОписаниеВозможное решение
Incorrect size of 'dLdX' for 'backward'.Производные потери относительно входных параметров слоя должны быть одного размера как соответствующий вход слоя.

Возвратите производные dLdX1,…,dLdXn с тем же размером, как соответствующий слой вводит X1,…,Xn.

Incorrect size of the derivative of the loss with respect to the input 'in1' for 'backward'
The size of 'Z' returned from 'forward' must be the same as for 'predict'.Выходные параметры predict должны быть одного размера как соответствующие выходные параметры forward.

Возвратите выходные параметры Z1,…,Zm predict с тем же размером как соответствующие выходные параметры Z1,…,Zm forward.

Incorrect size of the derivative of the loss with respect to 'W' for 'backward'.Производные потери относительно learnable параметров должны быть одного размера как соответствующие learnable параметры.

Возвратите производные dLdW1,…,dLdWk с тем же размером как соответствующие learnable параметры W1,…,Wk.

Выходной слой.  Тестовый forwardLossIsScalar и backwardLossIsConsistentInSize проверяют, что выходные параметры forwardLoss и 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 слоя.

Тестовая диагностикаОписаниеВозможное решение
Incorrect size of 'loss' for 'forwardLoss'.Вывод loss forwardLoss должен быть скаляром.

Возвратите вывод loss как скаляр. Например, если у вас есть несколько значений потери, затем можно использовать mean или sum.

Incorrect size of the derivative of loss 'dLdY' for 'backwardLoss'.Производные потери относительно входа слоя должны быть одного размера как вход слоя.Возвратите производный dLdY с тем же размером как вход Y слоя.

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

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

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

Промежуточные Слои.  Тесты predictIsConsistentInType, forwardIsConsistentInType и backwardIsConsistentInType проверяют что выходные переменные функций уровня правильного типа данных. Тесты проверяют, что функции уровня возвращают сопоставимые типы данных когда данный входные параметры типов данных single, double и gpuArray с базовыми типами single или double.

Совет

Если вы предварительно выделяете массивы с помощью функций как zeros, то необходимо гарантировать, что типы данных этих массивов сопоставимы с входными параметрами функции уровня. Чтобы создать массив нулей совпадающего типа данных другого массива, используйте опцию 'like' zeros. Например, чтобы инициализировать массив нулей размера sz с совпадающим типом данных как массив X, используйте Z = zeros(sz,'like',X).

Тестовая диагностикаОписаниеВозможное решение
Incorrect type of 'Z' for 'predict'.Типы выходных параметров Z1,…,Zm predict должны быть сопоставимы с входными параметрами X1,…,Xn.

Возвратите выходные параметры Z1,…,Zm с тем же типом как входные параметры X1,…,Xn.

Incorrect type of output 'out1' for 'predict'.
Incorrect type of 'Z' for 'forward'.Типы выходных параметров Z1,…,Zm forward должны быть сопоставимы с входными параметрами X1,…,Xn.
Incorrect type of output 'out1' for 'forward'.
Incorrect type of 'dLdX' for 'backward'.Типы производных dLdX1,…,dLdXn backward должны быть сопоставимы с входными параметрами X1,…,Xn.

Возвратите производные dLdX1,…,dLdXn с тем же типом как входные параметры X1,…,Xn.

Incorrect type of the derivative of the loss with respect to the input 'in1' for 'backward'.
Incorrect type of the derivative of loss with respect to 'W' for 'backward'.Тип производной потери learnable параметров должен быть сопоставим с соответствующими learnable параметрами.

Для каждого learnable параметра возвратите производную с тем же типом как соответствующий learnable параметр.

Выходной слой.  Тесты forwardLossIsConsistentInType и backwardLossIsConsistentInType проверяют что выходные переменные функций уровня правильного типа данных. Тесты проверяют, что слои возвращают сопоставимые типы данных когда данный входные параметры типов данных single, double и gpuArray с базовыми типами single или double.

Тестовая диагностикаОписаниеВозможное решение
Incorrect type of 'loss' for 'forwardLoss'.Тип вывода loss forwardLoss должен быть сопоставим с входом Y.

Возвратите loss с тем же типом как вход Y.

Incorrect type of the derivative of loss 'dLdY' for 'backwardLoss'.Тип вывода dLdY backwardLoss должен быть сопоставим с входом Y.

Возвратите dLdY с тем же типом как вход Y.

Градиенты численно правильны

Тестовый gradientsAreNumericallyCorrect проверяет, что градиенты, вычисленные функциями уровня, численно правильны.

Промежуточные Слои.  Тестовые тесты gradientsAreNumericallyCorrect, что градиенты, вычисленные в backward, численно правильны.

Тестовая диагностикаОписаниеВозможное решение
The derivative 'dLdX' for 'backward' is inconsistent with the numerical gradient.

Один или несколько из следующего:

  • Заданная производная неправильно вычисляется

  • Функция недифференцируема в некоторых точках ввода

  • Ошибочный допуск является слишком маленьким

Проверяйте, что производные в backward правильно вычисляются.

Если производные правильно вычисляются, то в разделе Framework Diagnostic, вручную проверяйте абсолютную и относительную погрешность между фактическими и ожидаемыми значениями производной.

Если абсолютные и относительные погрешности в приемлемом поле допуска, то можно проигнорировать эту тестовую диагностику.

The derivative of the loss with respect to the input 'in1' for 'backward' is inconsistent with the numerical gradient.
The derivative of loss with respect to 'W' for 'backward' is inconsistent with the numerical gradient.

Выходной слой.  Тестовый gradientsAreNumericallyCorrect проверяет, что градиенты, вычисленные в backwardLoss, численно правильны.

Тестовая диагностикаОписаниеВозможное решение
The derivative 'dLdY' for 'backwardLoss' is inconsistent with the numerical gradient.

Один или несколько из следующего:

  • Производная относительно прогнозов Y неправильно вычисляется

  • Функция недифференцируема в некоторых точках ввода

  • Ошибочный допуск является слишком маленьким

Проверяйте, что производные в backwardLoss правильно вычисляются.

Если производные правильно вычисляются, то в разделе Framework Diagnostic, вручную проверяйте абсолютную и относительную погрешность между фактическими и ожидаемыми значениями производной.

Если абсолютные и относительные погрешности в приемлемом поле допуска, то можно проигнорировать эту тестовую диагностику.

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

|

Похожие темы