Если Deep Learning Toolbox™ не предоставляет слой, необходимый для задачи классификации или регрессии, то можно задать свой собственный пользовательский слой. Список встроенных слоев см. в Списке слоев глубокого обучения.
Пример Define Custom Classification Output Layer показывает, как определить и создать пользовательский выходной слой классификации с суммой потерь при ошибке квадратов (SSE), и проходит следующие шаги:
Назовите слой - Дайте слою имя, чтобы он мог использоваться в MATLAB®.
Объявить свойства слоя - Задать свойства слоя.
Создайте функцию конструктора (необязательно) - задайте, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то программное обеспечение инициализирует свойства с ''
при создании.
Создайте функцию потерь вперед - Задайте потерю между предсказаниями и целями обучения.
Создайте функцию обратных потерь (необязательно) - задайте производную от потерь относительно предсказаний. Если вы не задаете функцию обратных потерь, то функция прямых потерь должна поддерживать dlarray
объекты.
Создание функции обратных потерь опционально. Если функция прямых потерь использует только функции, которые поддержка dlarray
затем программное обеспечение автоматически определяет производные с помощью автоматической дифференциации. Список функций, поддерживающих dlarray
объекты, см. Список функций с поддержкой dlarray. Если вы хотите использовать функции, которые не поддерживают dlarray
объекты, или хотят использовать определенный алгоритм для функции обратных потерь, тогда можно задать пользовательскую функцию обратных потерь, используя этот пример в качестве руководства.
В примере Define Custom Classification Output Layer показано, как создать слой классификации SSE.
Классификационный слой SSE вычисляет сумму квадратов потерь ошибки для задач классификации. SSE является мерой ошибки между двумя непрерывными случайными переменными. Для предсказаний Y и обучающих T целей, потеря SSE между Y и T задается как
где N - количество наблюдений, а K - количество классов.
Просмотрите слой, созданный в примере Задать пользовательский выходной слой классификации. Этот слой не имеет backwardLoss
функция.
classdef sseClassificationLayer < nnet.layer.ClassificationLayer % Example custom classification layer with sum of squares error loss. methods function layer = sseClassificationLayer(name) % layer = sseClassificationLayer(name) creates a sum of squares % error classification layer and specifies the layer name. % Set layer name. layer.Name = name; % Set layer description. layer.Description = 'Sum of squares error'; end function loss = forwardLoss(layer, Y, T) % loss = forwardLoss(layer, Y, T) returns the SSE loss between % the predictions Y and the training targets T. % Calculate sum of squares. sumSquares = sum((Y-T).^2); % Take mean over mini-batch. N = size(Y,4); loss = sum(sumSquares)/N; end end end
Реализуйте backwardLoss
функция, которая возвращает производные потерь относительно входных данных и настраиваемых параметров.
Синтаксис для backwardLoss
является dLdY = backwardLoss(layer, Y, T)
. Область входа Y
содержит предсказания, сделанные сетью и T
содержит цели обучения. Область выхода dLdY
является производной от потерь относительно предсказаний Y
. Область выхода dLdY
должен быть такого же размера, как и входной параметр слоя Y
.
Размерности Y
и T
совпадают с входами в forwardLoss
.
Производная от потерь SSE относительно Y предсказаний задается как
где N - количество наблюдений во входе.
Создайте функцию обратных потерь, которая возвращает эти производные.
function dLdY = backwardLoss(layer, Y, T)
% dLdY = backwardLoss(layer, Y, T) returns the derivatives of
% the SSE loss with respect to the predictions Y.
N = size(Y,4);
dLdY = 2*(Y-T)/N;
end
Просмотрите заполненный файл класса слоя.
classdef sseClassificationLayer < nnet.layer.ClassificationLayer % Example custom classification layer with sum of squares error loss. methods function layer = sseClassificationLayer(name) % layer = sseClassificationLayer(name) creates a sum of squares % error classification layer and specifies the layer name. % Set layer name. layer.Name = name; % Set layer description. layer.Description = 'Sum of squares error'; end function loss = forwardLoss(layer, Y, T) % loss = forwardLoss(layer, Y, T) returns the SSE loss between % the predictions Y and the training targets T. % Calculate sum of squares. sumSquares = sum((Y-T).^2); % Take mean over mini-batch. N = size(Y,4); loss = sum(sumSquares)/N; end function dLdY = backwardLoss(layer, Y, T) % dLdY = backwardLoss(layer, Y, T) returns the derivatives of % the SSE loss with respect to the predictions Y. N = size(Y,4); dLdY = 2*(Y-T)/N; end end end
Если функции слоя 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).