Совет
Чтобы построить выходной слой классификации с перекрестными потерями энтропии для k взаимоисключающих классов, используйте classificationLayer. Если для проблем классификации требуется использовать другую функцию потерь, можно определить пользовательский выходной слой классификации, используя этот пример в качестве руководства.
В этом примере показано, как определить пользовательский выходной слой классификации с суммой потерь ошибки квадратов (SSE) и использовать его в сверточной нейронной сети.
Чтобы определить пользовательский слой вывода классификации, можно использовать шаблон, приведенный в этом примере, который выполняет следующие шаги:
Имя слоя - присвойте слою имя, чтобы он мог использоваться в MATLAB ®.
Объявить свойства слоя - укажите свойства слоя.
Создать функцию конструктора (необязательно) - укажите способ построения слоя и инициализации его свойств. Если функция конструктора не указана, то программа инициализирует свойства с помощью '' при создании.
Создать функцию прямых потерь - укажите потери между прогнозами и целями обучения.
Создать обратную функцию потерь (необязательно) - укажите производную потерь относительно прогнозов. Если функция потерь в обратном направлении не указана, то функция потерь в прямом направлении должна поддерживать dlarray объекты.
Уровень SSE классификации вычисляет сумму потерь ошибок квадратов для проблем классификации. SSE - мера ошибки между двумя непрерывными случайными переменными. Для прогнозов Y и учебных целей T потеря МРЗ между Y и T задается
) 2,
где 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-by-1-by-K-by-N, где K - число классов, а N - число наблюдений. | 4 |
| 3-D классификация изображений | 1-by-1-by-1-by-K-by-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 потеря МРЗ между Y и T задается
) 2,
где 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
Если функции прямого уровня полностью поддерживают dlarray объекты, то слой совместим с GPU. В противном случае, чтобы быть совместимым с GPU, функции уровня должны поддерживать входы и обратные выходы типа gpuArray(Панель инструментов параллельных вычислений).
Поддержка многих встроенных функций MATLAB gpuArray(Панель инструментов параллельных вычислений) и dlarray входные аргументы. Список функций, поддерживающих dlarray см. Список функций с поддержкой dlarray. Список функций, выполняемых на графическом процессоре, см. в разделе Выполнение функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений). Чтобы использовать графический процессор для глубокого обучения, необходимо также иметь поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox). Дополнительные сведения о работе с графическими процессорами в MATLAB см. в разделе Вычисления графического процессора в 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.
Сводка тестов сообщает о количестве пройденных, неудачных, неполных и пропущенных тестов.
Пользовательский выходной слой можно использовать так же, как и любой другой выходной слой в инструментарии глубокого обучения. В этом разделе показано, как создавать и обучать сеть классификации с помощью пользовательского выходного слоя классификации, созданного ранее.
Загрузите пример учебных данных.
[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