Совет
Чтобы создать слой выхода классификации с потерей перекрестной энтропии для k взаимоисключающих классов, используйте classificationLayer
. Если необходимо использовать другую функцию потерь для задач классификации, можно задать пользовательский выходной слой классификации, используя этот пример в качестве руководства.
В этом примере показано, как задать пользовательский выходной слой классификации с суммой потерь при ошибке квадратов (SSE) и использовать его в сверточной нейронной сети.
Чтобы определить пользовательский выходной слой классификации, можно использовать шаблон, представленный в этом примере, который выполняет следующие шаги:
Назовите слой - Дайте слою имя, чтобы он мог использоваться в MATLAB®.
Объявить свойства слоя - Задать свойства слоя.
Создайте функцию конструктора (необязательно) - задайте, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то программное обеспечение инициализирует свойства с ''
при создании.
Создайте функцию потерь вперед - Задайте потерю между предсказаниями и целями обучения.
Создайте функцию обратных потерь (необязательно) - задайте производную от потерь относительно предсказаний. Если вы не задаете функцию обратных потерь, то функция прямых потерь должна поддерживать dlarray
объекты.
Классификационный слой SSE вычисляет сумму квадратов потерь ошибки для задач классификации. SSE является мерой ошибки между двумя непрерывными случайными переменными. Для предсказаний Y и обучающих T целей, потеря SSE между Y и T задается как
где N - количество наблюдений, а K - количество классов.
Скопируйте шаблон выходного слоя классификации в новый файл в 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
с sseClassificationLayer
.
classdef sseClassificationLayer < nnet.layer.ClassificationLayer ... end
Далее переименуйте myClassificationLayer
функция конструктора (первая функция в methods
section) так, чтобы оно имело то же имя что и слой.
methods function layer = sseClassificationLayer() ... end ... end
Сохраните файл класса слоя в новом файле с именем sseClassificationLayer.m
. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке на пути MATLAB.
Объявление свойств слоя в properties
раздел.
По умолчанию пользовательские выходные слои имеют следующие свойства:
Name
- Имя слоя, заданное как вектор символов или строковый скаляр. Чтобы включить слой в график слоев, необходимо задать непустое уникальное имя слоя. Если вы обучаете последовательную сеть с слоем и Name
установлено в ''
затем программа автоматически присваивает слою имя во время обучения.
Description
- Однострочное описание слоя, заданное как вектор символов или строковый скаляр. Это описание появляется, когда слой отображается в Layer
массив. Если вы не задаете описание слоя, то отобразится программное обеспечение "Classification Output"
или "Regression Output"
.
Type
- Тип слоя, заданный как вектор символов или строковый скаляр. Значение Type
появляется, когда слой отображается в Layer
массив. Если тип слоя не задан, программа отображает имя класса слоя.
Пользовательские слои классификации также имеют следующее свойство:
Classes
- Классы выходного слоя, заданные как категориальный вектор, строковые массивы, массив ячеек из векторов символов или 'auto'
. Если Classes
является 'auto'
, затем программное обеспечение автоматически устанавливает классы во время обучения. Если вы задаете строковые массивы или массив ячеек векторов символов str
, затем программное обеспечение устанавливает классы выходного слоя на categorical(str,str)
.
Пользовательские слои регрессии также имеют следующее свойство:
ResponseNames
- Имена ответов, заданные массив ячеек из векторов символов или строковые массивы. Во время обучения программное обеспечение автоматически устанавливает имена ответов согласно обучающим данным. Значение по умолчанию является {}
.
Если слой не имеет других свойств, можно опустить properties
раздел.
В этом примере слой не требует никаких дополнительных свойств, поэтому можно удалить properties
раздел.
Создайте функцию, которая создает слой и инициализирует свойства слоя. Задайте любые переменные, необходимые для создания слоя в качестве входов для функции конструктора.
Задайте входной параметр name
для назначения Name
свойство при создании. Добавьте комментарий к верхней части функции, которая объясняет синтаксис функции.
function layer = sseClassificationLayer(name) % layer = sseClassificationLayer(name) creates a sum of squares % error classification layer and specifies the layer name. ... end
Замените комментарий % Layer constructor function goes here
с кодом, который инициализирует свойства слоя.
Дайте слою однострочного описания путем установки Description
свойство слоя. Установите Name
свойство для входного параметра name
.
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
Создайте функцию с именем forwardLoss
это возвращает потерю SSE между предсказаниями, сделанными сетью, и целями обучения. Синтаксис для forwardLoss
является loss = forwardLoss(layer, Y, T)
, где Y
- выход предыдущего слоя и T
представляет цели обучения.
Для задач классификации, размерности 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 перед слоем выхода.
Классификационный слой SSE вычисляет сумму квадратов потерь ошибки для задач классификации. SSE является мерой ошибки между двумя непрерывными случайными переменными. Для предсказаний Y и обучающих T целей, потеря SSE между Y и T задается как
где N - количество наблюдений, а K - количество классов.
Входы Y
и T
соответствуют Y и T в уравнении, соответственно. Область выхода loss
соответствует L. Добавьте комментарий к верхней части функции, которая объясняет синтаксисы функции.
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
Потому что forwardLoss
функция использует только функции, которые поддержка dlarray
объекты, определяющие backwardLoss
функция опциональна. Список функций, поддерживающих dlarray
объекты, см. Список функций с поддержкой dlarray.
Просмотрите завершенный файл выхода слоя классификации.
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
Если функции слоя 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).
Функции MATLAB, используемые в forwardLoss
все dlarray поддержки
объекты, поэтому слой совместим с графическим процессором.
Проверьте валидность слоя пользовательского выходного слоя классификации sseClassificationLayer
.
Задайте пользовательский слой классификации ошибок суммы квадратов. Чтобы создать этот слой, сохраните файл sseClassificationLayer.m
в текущей папке. Создайте образец слоя.
layer = sseClassificationLayer('sse');
Проверьте допустимость слоя с помощью checkLayer
. Задайте допустимый размер входного сигнала, чтобы быть размером одного наблюдения типового входа для слоя. Слой ожидает входных параметров 1-by-1-by-K-by-N массива, где K - количество классов, а N - количество наблюдений в мини-пакете.
validInputSize = [1 1 10];
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.TestOutputLayerWithoutBackward ........ Done nnet.checklayer.TestOutputLayerWithoutBackward __________ Test Summary: 8 Passed, 0 Failed, 0 Incomplete, 2 Skipped. Time elapsed: 0.34606 seconds.
В сводных данных тестов указывается количество пройденных, неудачных, неполных и пропущенных тестов.
Можно использовать пользовательский выходной слой так же, как и любой другой выходной слой в Deep Learning Toolbox. В этом разделе показано, как создать и обучить сеть для классификации с помощью пользовательского выходного слоя классификации, созданного ранее.
Загрузите пример обучающих данных.
[XTrain,YTrain] = digitTrain4DArrayData;
Задайте пользовательский слой классификации ошибок суммы квадратов. Чтобы создать этот слой, сохраните файл sseClassificationLayer.m
в текущей папке. Создайте образец слоя. Создайте массив слоев, включая пользовательский выходной слой классификации sseClassificationLayer
.
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5,20)
batchNormalizationLayer
reluLayer
fullyConnectedLayer(10)
softmaxLayer
sseClassificationLayer('sse')]
layers = 7x1 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 10 fully connected layer 6 '' Softmax softmax 7 'sse' Classification Output Sum of squares error
Установите опции обучения и обучите сеть.
options = trainingOptions('sgdm');
net = trainNetwork(XTrain,YTrain,layers,options);
Training on single CPU. Initializing input data normalization. |========================================================================================| | Epoch | Iteration | Time Elapsed | Mini-batch | Mini-batch | Base Learning | | | | (hh:mm:ss) | Accuracy | Loss | Rate | |========================================================================================| | 1 | 1 | 00:00:00 | 9.38% | 0.9944 | 0.0100 | | 2 | 50 | 00:00:05 | 75.00% | 0.3560 | 0.0100 | | 3 | 100 | 00:00:09 | 92.97% | 0.1293 | 0.0100 | | 4 | 150 | 00:00:13 | 96.88% | 0.0926 | 0.0100 | | 6 | 200 | 00:00:17 | 95.31% | 0.0726 | 0.0100 | | 7 | 250 | 00:00:21 | 97.66% | 0.0479 | 0.0100 | | 8 | 300 | 00:00:26 | 99.22% | 0.0204 | 0.0100 | | 9 | 350 | 00:00:30 | 99.22% | 0.0264 | 0.0100 | | 11 | 400 | 00:00:34 | 100.00% | 0.0066 | 0.0100 | | 12 | 450 | 00:00:38 | 100.00% | 0.0041 | 0.0100 | | 13 | 500 | 00:00:43 | 100.00% | 0.0073 | 0.0100 | | 15 | 550 | 00:00:47 | 100.00% | 0.0059 | 0.0100 | | 16 | 600 | 00:00:51 | 100.00% | 0.0021 | 0.0100 | | 17 | 650 | 00:00:55 | 100.00% | 0.0040 | 0.0100 | | 18 | 700 | 00:01:00 | 100.00% | 0.0024 | 0.0100 | | 20 | 750 | 00:01:04 | 100.00% | 0.0032 | 0.0100 | | 21 | 800 | 00:01:09 | 100.00% | 0.0020 | 0.0100 | | 22 | 850 | 00:01:13 | 100.00% | 0.0017 | 0.0100 | | 24 | 900 | 00:01:16 | 100.00% | 0.0020 | 0.0100 | | 25 | 950 | 00:01:19 | 100.00% | 0.0013 | 0.0100 | | 26 | 1000 | 00:01:22 | 100.00% | 0.0012 | 0.0100 | | 27 | 1050 | 00:01:25 | 99.22% | 0.0105 | 0.0100 | | 29 | 1100 | 00:01:28 | 100.00% | 0.0014 | 0.0100 | | 30 | 1150 | 00:01:31 | 100.00% | 0.0011 | 0.0100 | | 30 | 1170 | 00:01:32 | 99.22% | 0.0093 | 0.0100 | |========================================================================================|
Оцените эффективность сети, делая предсказания по новым данным и вычисляя точность.
[XTest,YTest] = digitTest4DArrayData; YPred = classify(net, XTest); accuracy = mean(YTest == YPred)
accuracy = 0.9840
assembleNetwork
| checkLayer
| classificationLayer