Чтобы создать классификацию выходной слой с перекрестной энтропийной потерей для k взаимоисключающие классы, используйте classificationLayer
. Если вы хотите использовать различную функцию потерь для своих проблем классификации, то можно задать пользовательскую классификацию выходной слой с помощью этого примера в качестве руководства.
Этот пример показывает, как задать пользовательскую классификацию выходной слой с ошибкой суммы квадратов (SSE) потеря и использовать его в сверточной нейронной сети.
Чтобы задать пользовательскую классификацию выходной слой, можно использовать шаблон, обеспеченный в этом примере, который берет вас через следующие шаги:
Назовите слой – Дают слою имя, таким образом, это может использоваться в MATLAB®.
Объявите, что свойства слоя – Задают свойства слоя.
Создайте функцию конструктора – Задают, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то программное обеспечение инициализирует свойства с ''
при создании.
Создайте прямую функцию потерь – Задают потерю между прогнозами и учебными целями.
Создайте обратную функцию потерь – Задают производную потери относительно прогнозов.
Слой 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) % 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
) так, чтобы это имело то же имя как слой.
methods function layer = sseClassificationLayer() ... end ... end
Сохраните файл класса слоя в новом файле с именем sseClassificationLayer.m
. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке на пути MATLAB.
Объявите свойства слоя в разделе properties
.
По умолчанию пользовательские выходные слои имеют следующие свойства:
Имя
Имя слоя, заданное как вектор символов или скаляр строки. Чтобы включать слой в график слоя, необходимо задать непустое уникальное имя слоя. Если вы обучаете серийную сеть со слоем, и Name
установлен в ''
, то программное обеспечение автоматически присваивает имя к слою в учебное время.
Описание
Короткое описание слоя, заданного как вектор символов или скаляр строки. Это описание появляется, когда слой отображен в массиве Layer
. Если вы не задаете описание слоя, то программное обеспечение отображает "Classification Output"
или "Regression Output"
.
Ввод
Тип слоя, заданного как вектор символов или скаляр строки. Значение Type
появляется, когда слой отображен в массиве Layer
. Если вы не задаете тип слоя, то программное обеспечение отображает имя класса слоя.
Пользовательские слои классификации также имеют следующее свойство:
Классы
Классы выходного слоя, заданного как категориальный вектор, массив строк, массив ячеек из символьных векторов или 'auto'
. Если Classes
является 'auto'
, то программное обеспечение автоматически устанавливает классы в учебное время. Если вы задаете массив строк или массив ячеек из символьных векторов str
, то программное обеспечение устанавливает классы выходного слоя к categorical(str,str)
. Значением по умолчанию является 'auto'
.
Пользовательские слои регрессии также имеют следующее свойство:
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
зависят от типа проблемы.
Задача классификации | Введите размер | Размерность наблюдения |
---|---|---|
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 слоем перед выходным слоем.
Слой 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
Создайте обратную функцию потерь.
Создайте функцию с именем backwardLoss
, который возвращает производные потери SSE относительно прогнозов Y
. Синтаксисом для backwardLoss
является loss = backwardLoss(layer, Y, T)
, где Y
является вывод предыдущего слоя, и T
представляет учебные цели.
Размерности 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
Для совместимости графического процессора функции уровня должны поддержать входные параметры и возвратить выходные параметры типа gpuArray
. Любые другие функции использование слоя должны сделать то же самое. Много встроенных функций MATLAB поддерживают входные параметры gpuArray
. Если вы вызываете какую-либо из этих функций по крайней мере с одним входом gpuArray
, то функция выполняется на графическом процессоре и возвращает gpuArray
вывод. Для списка функций, которые выполняются на графическом процессоре, смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox). Чтобы использовать графический процессор для глубокого обучения, у вас должен также быть CUDA®, включенный NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Для получения дополнительной информации о работе с графическими процессорами в MATLAB смотрите, что графический процессор Вычисляет в MATLAB (Parallel Computing Toolbox).
Функции MATLAB использовали в forwardLoss
и backwardLoss
вся поддержка входные параметры gpuArray
, таким образом, слоем является совместимый графический процессор.
Проверяйте валидность слоя пользовательской классификации выходной слой sseClassificationLayer
.
Задайте пользовательский слой классификации ошибок суммы квадратов. Чтобы создать этот слой, сохраните файл sseClassificationLayer.m
в текущей папке. Создайте экземпляр слоя.
layer = sseClassificationLayer('sse');
Проверяйте, что слой является допустимым использованием checkLayer
. Задайте допустимый входной размер, чтобы быть размером одного наблюдения за типичным входом к слою. Слой ожидает 1 1 K N входными параметрами массивов, где K является количеством классов, и N является количеством наблюдений в мини-пакете.
validInputSize = [1 1 10];
checkLayer(layer,validInputSize,'ObservationDimension',4);
Skipping GPU tests. No compatible GPU device found. Running nnet.checklayer.OutputLayerTestCase .......... ... Done nnet.checklayer.OutputLayerTestCase __________ Test Summary: 13 Passed, 0 Failed, 0 Incomplete, 4 Skipped. Time elapsed: 0.41537 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 | 14.84% | 0.9414 | 0.0100 | | 2 | 50 | 00:00:08 | 77.34% | 0.3519 | 0.0100 | | 3 | 100 | 00:00:13 | 90.62% | 0.1375 | 0.0100 | | 4 | 150 | 00:00:20 | 97.66% | 0.0495 | 0.0100 | | 6 | 200 | 00:00:21 | 96.09% | 0.0660 | 0.0100 | | 7 | 250 | 00:00:23 | 96.88% | 0.0489 | 0.0100 | | 8 | 300 | 00:00:25 | 99.22% | 0.0172 | 0.0100 | | 9 | 350 | 00:00:26 | 98.44% | 0.0284 | 0.0100 | | 11 | 400 | 00:00:28 | 100.00% | 0.0064 | 0.0100 | | 12 | 450 | 00:00:30 | 100.00% | 0.0050 | 0.0100 | | 13 | 500 | 00:00:31 | 100.00% | 0.0064 | 0.0100 | | 15 | 550 | 00:00:33 | 100.00% | 0.0063 | 0.0100 | | 16 | 600 | 00:00:35 | 100.00% | 0.0018 | 0.0100 | | 17 | 650 | 00:00:37 | 100.00% | 0.0031 | 0.0100 | | 18 | 700 | 00:00:39 | 100.00% | 0.0021 | 0.0100 | | 20 | 750 | 00:00:41 | 100.00% | 0.0023 | 0.0100 | | 21 | 800 | 00:00:43 | 100.00% | 0.0017 | 0.0100 | | 22 | 850 | 00:00:45 | 100.00% | 0.0014 | 0.0100 | | 24 | 900 | 00:00:46 | 100.00% | 0.0016 | 0.0100 | | 25 | 950 | 00:00:48 | 100.00% | 0.0010 | 0.0100 | | 26 | 1000 | 00:00:50 | 100.00% | 0.0011 | 0.0100 | | 27 | 1050 | 00:00:52 | 100.00% | 0.0051 | 0.0100 | | 29 | 1100 | 00:00:53 | 100.00% | 0.0014 | 0.0100 | | 30 | 1150 | 00:00:55 | 100.00% | 0.0012 | 0.0100 | | 30 | 1170 | 00:00:56 | 100.00% | 0.0014 | 0.0100 | |========================================================================================|
Оцените производительность сети путем создания прогнозов на новых данных и вычисления точности.
[XTest,YTest] = digitTest4DArrayData; YPred = classify(net, XTest); accuracy = mean(YTest == YPred)
accuracy = 0.9878
assembleNetwork
| checkLayer
| classificationLayer