Чтобы создать классификацию выходной слой с перекрестной энтропийной потерей для k взаимоисключающие классы, используйте classificationLayer
. Если вы хотите использовать различную функцию потерь в своих проблемах классификации, то можно задать пользовательскую классификацию выходной слой с помощью этого примера в качестве руководства.
В этом примере показано, как задать и создать пользовательскую взвешенную классификацию выходной слой со взвешенной перекрестной энтропийной потерей. Используйте взвешенный слой классификации в проблемах классификации с неустойчивым распределением классов. Для примера, показывающего, как использовать взвешенный слой классификации в сети, смотрите Распознание речевых команд с использованием глубокого обучения.
Чтобы задать пользовательскую классификацию выходной слой, можно использовать шаблон, обеспеченный в этом примере, который берет вас через следующие шаги:
Назовите слой – Дают слою имя, таким образом, это может использоваться в MATLAB®.
Объявите, что свойства слоя – Задают свойства слоя.
Создайте (дополнительную) функцию конструктора – Задают, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то программное обеспечение инициализирует свойства с ''
при создании.
Создайте прямую функцию потерь – Задают потерю между прогнозами и учебными целями.
Создайте обратную (дополнительную) функцию потерь – Задают производную потери относительно прогнозов. Если вы не задаете обратную функцию потерь, то прямая функция потерь должна поддержать dlarray
объекты.
Взвешенный слой классификации вычисляет взвешенную перекрестную энтропийную потерю для проблем классификации. Взвешенная перекрестная энтропия является ошибочной мерой между двумя непрерывными случайными переменными. Для баллов прогноза Y и обучение предназначаются для T, взвешенной перекрестной энтропийной потерей между Y и T дают
где N является количеством наблюдений, K является количеством классов, и w является вектором весов для каждого класса.
Скопируйте классификацию выходной шаблон слоя в новый файл в MATLAB. Этот шаблон обрисовывает в общих чертах структуру классификации выходной слой и включает функции, которые задают поведение слоя.
classdef myClassificationLayer < nnet.layer.ClassificationLayer properties % (Optional) Layer properties. % Layer properties go here. end methods function layer = myClassificationLayer() % (Optional) Create a myClassificationLayer. % Layer constructor function goes here. end function loss = forwardLoss(layer, Y, T) % Return the loss between the predictions Y and the training % targets T. % % Inputs: % layer - Output layer % Y – Predictions made by network % T – Training targets % % Output: % loss - Loss between Y and T % Layer forward loss function goes here. end function dLdY = backwardLoss(layer, Y, T) % (Optional) Backward propagate the derivative of the loss % function. % % Inputs: % layer - Output layer % Y – Predictions made by network % T – Training targets % % Output: % dLdY - Derivative of the loss with respect to the % predictions Y % Layer backward loss function goes here. end end end
Во-первых, дайте слою имя. В первой линии файла класса замените существующее имя myClassificationLayer
с weightedClassificationLayer
.
classdef weightedClassificationLayer < nnet.layer.ClassificationLayer ... end
Затем переименуйте myClassificationLayer
функция конструктора (первая функция в methods
разделите) так, чтобы это имело то же имя как слой.
methods function layer = weightedClassificationLayer() ... end ... end
Сохраните файл класса слоя в новом файле с именем weightedClassificationLayer.m
. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке на пути MATLAB.
Объявите свойства слоя в properties
раздел.
По умолчанию пользовательские выходные слои имеют следующие свойства:
Name
– Имя слоя, заданное как вектор символов или скаляр строки. Чтобы включать слой в график слоя, необходимо задать непустое уникальное имя слоя. Если вы обучаете серийную сеть со слоем и Name
установлен в ''
, затем программное обеспечение автоматически присваивает имя к слою в учебное время.
Description
– Короткое описание слоя, заданного как вектор символов или скаляр строки. Это описание появляется, когда слой отображен в Layer
массив. Если вы не задаете описание слоя, то программное обеспечение отображает "Classification Output"
или "Regression Output"
.
Type
– Тип слоя, заданного как вектор символов или скаляр строки. Значение Type
появляется, когда слой отображен в Layer
массив. Если вы не задаете тип слоя, то программное обеспечение отображает имя класса слоя.
Пользовательские слои классификации также имеют следующее свойство:
Classes
– Классы выходного слоя, заданного как категориальный вектор, массив строк, массив ячеек из символьных векторов или 'auto'
. Если Classes
'auto'
, затем программное обеспечение автоматически устанавливает классы в учебное время. Если вы задаете массив строк или массив ячеек из символьных векторов str
, затем программное обеспечение устанавливает классы выходного слоя к categorical(str,str)
. Значением по умолчанию является 'auto'
.
Пользовательские слои регрессии также имеют следующее свойство:
ResponseNames
– Имена ответов, заданных массив ячеек из символьных векторов или массив строк. В учебное время программное обеспечение автоматически определяет имена ответа согласно обучающим данным. Значением по умолчанию является {}
.
Если слой не имеет никаких других свойств, то можно не использовать properties
раздел.
В этом примере слой требует, чтобы дополнительное свойство сохранило веса класса. Задайте свойство ClassWeights
в properties
раздел.
properties
% Vector of weights corresponding to the classes in the training
% data
ClassWeights
end
Создайте функцию, которая создает слой и инициализирует свойства слоя. Задайте любые переменные, требуемые создать слой как входные параметры к функции конструктора.
Задайте входной параметр classWeights
присваивать ClassWeights
свойство. Также задайте дополнительный входной параметр name
присваивать Name
свойство при создании. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксисы функции.
function layer = weightedClassificationLayer(classWeights, name) % layer = weightedClassificationLayer(classWeights) creates a % weighted cross entropy loss layer. classWeights is a row % vector of weights corresponding to the classes in the order % that they appear in the training data. % % layer = weightedClassificationLayer(classWeights, name) % additionally specifies the layer name. ... end
Замените комментарий % Layer constructor function goes here
с кодом, который инициализирует свойства слоя.
Дайте слою короткое описание путем установки Description
свойство слоя. Установите Name
свойство к дополнительному входному параметру name
.
function layer = weightedClassificationLayer(classWeights, name)
% layer = weightedClassificationLayer(classWeights) creates a
% weighted cross entropy loss layer. classWeights is a row
% vector of weights corresponding to the classes in the order
% that they appear in the training data.
%
% layer = weightedClassificationLayer(classWeights, name)
% additionally specifies the layer name.
% Set class weights
layer.ClassWeights = classWeights;
% Set layer name
if nargin == 2
layer.Name = name;
end
% Set layer description
layer.Description = 'Weighted cross entropy';
end
Создайте функцию с именем forwardLoss
это возвращает взвешенную перекрестную энтропийную потерю между прогнозами, сделанными сетью и учебными целями. Синтаксис для forwardLoss
loss = forwardLoss(layer, Y, T)
, где Y
выход предыдущего слоя и T
представляет учебные цели.
Для проблем классификации, размерностей 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 слоем перед выходным слоем.
Взвешенный слой классификации вычисляет взвешенную перекрестную энтропийную потерю для проблем классификации. Взвешенная перекрестная энтропия является ошибочной мерой между двумя непрерывными случайными переменными. Для баллов прогноза Y и обучение предназначаются для T, взвешенной перекрестной энтропийной потерей между Y и T дают
где N является количеством наблюдений, K является количеством классов, и w является вектором весов для каждого класса.
Входные параметры Y
и T
соответствуйте Y и T в уравнении, соответственно. Выход loss
соответствует L. Добавьте комментарий в верхнюю часть функции, которая объясняет синтаксисы функции.
function loss = forwardLoss(layer, Y, T)
% loss = forwardLoss(layer, Y, T) returns the weighted cross
% entropy loss between the predictions Y and the training
% targets T.
N = size(Y,4);
Y = squeeze(Y);
T = squeeze(T);
W = layer.ClassWeights;
loss = -sum(W*(T.*log(Y)))/N;
end
Поскольку forwardLoss
функционируйте только использует функции та поддержка dlarray
объекты, задавая backwardLoss
функция является дополнительной. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray.
Просмотрите завершенную классификацию выходной файл класса слоя.
classdef weightedClassificationLayer < nnet.layer.ClassificationLayer properties % Vector of weights corresponding to the classes in the training % data ClassWeights end methods function layer = weightedClassificationLayer(classWeights, name) % layer = weightedClassificationLayer(classWeights) creates a % weighted cross entropy loss layer. classWeights is a row % vector of weights corresponding to the classes in the order % that they appear in the training data. % % layer = weightedClassificationLayer(classWeights, name) % additionally specifies the layer name. % Set class weights layer.ClassWeights = classWeights; % Set layer name if nargin == 2 layer.Name = name; end % Set layer description layer.Description = 'Weighted cross entropy'; end function loss = forwardLoss(layer, Y, T) % loss = forwardLoss(layer, Y, T) returns the weighted cross % entropy loss between the predictions Y and the training % targets T. N = size(Y,4); Y = squeeze(Y); T = squeeze(T); W = layer.ClassWeights; loss = -sum(W*(T.*log(Y)))/N; end end end
Если слой вперед функции полностью поддерживает dlarray
объекты, затем слоем является совместимый графический процессор. В противном случае, чтобы быть совместимым графическим процессором, функции уровня должны поддержать входные параметры и возвратить выходные параметры типа gpuArray
.
Много встроенных функций MATLAB поддерживают gpuArray
и dlarray
входные параметры. Для списка функций та поддержка dlarray
объекты, см. Список Функций с Поддержкой dlarray. Для списка функций, которые выполняются на графическом процессоре, смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox). Чтобы использовать графический процессор в глубоком обучении, у вас должен также быть CUDA®, включенный NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Для получения дополнительной информации о работе с графическими процессорами в MATLAB смотрите, что графический процессор Вычисляет в MATLAB (Parallel Computing Toolbox).
Функции MATLAB используются в forwardLoss
в weightedClassificationLayer
вся поддержка dlarray
объекты, таким образом, слоем является совместимый графический процессор.
Проверяйте валидность пользовательской классификации выходной слой weightedClassificationLayer
.
Задайте пользовательский взвешенный слой классификации. Чтобы создать этот слой, сохраните файл weightedClassificationLayer.m
в текущей папке.
Создайте экземпляр слоя. Задайте веса класса как вектор с тремя элементами, соответствующими трем классам.
classWeights = [0.1 0.7 0.2]; layer = weightedClassificationLayer(classWeights);
Проверяйте, что слой является допустимым использованием checkLayer
. Установите допустимый входной размер на типичный размер одного входа наблюдения к слою. Слой ожидает 1 1 K N входом массивов, где K является количеством классов, и N является количеством наблюдений в мини-пакете.
numClasses = numel(classWeights);
validInputSize = [1 1 numClasses];
checkLayer(layer,validInputSize,'ObservationDimension',4);
Running nnet.checklayer.TestOutputLayerWithoutBackward .......... Done nnet.checklayer.TestOutputLayerWithoutBackward __________ Test Summary: 10 Passed, 0 Failed, 0 Incomplete, 0 Skipped. Time elapsed: 1.3555 seconds.
Тестовые сводные отчеты количество переданных, отказавших, неполные, и пропущенные тесты.
assembleNetwork
| checkLayer
| classificationLayer