exponenta event banner

Определение пользовательского уровня глубокого обучения с несколькими входами

Если Deep Learning Toolbox™ не предоставляет слой, необходимый для классификации или регрессии, можно определить собственный пользовательский слой, используя этот пример в качестве руководства. Список встроенных слоев см. в разделе Список слоев глубокого обучения.

Для определения пользовательского уровня глубокого обучения можно использовать шаблон, приведенный в этом примере, который выполняет следующие шаги:

  1. Имя слоя - присвойте слою имя, чтобы его можно было использовать в MATLAB ®.

  2. Объявить свойства слоя (Declare the layer properties) - укажите свойства слоя и параметры, которые будут изучены во время обучения.

  3. Создать функцию конструктора (необязательно) - укажите способ построения слоя и инициализации его свойств. Если функция конструктора не указана, то при создании программа инициализирует Name, Description, и Type свойства с [] и устанавливает количество входов и выходов слоя равным 1.

  4. Создать функции прямой передачи - укажите способ передачи данных через уровень (прямое распространение) во время прогнозирования и во время обучения.

  5. Создать обратную функцию (необязательно) - укажите производные потери относительно входных данных и обучаемых параметров (обратное распространение). Если функция обратного направления не указана, то функции прямого направления должны поддерживать dlarray объекты.

В этом примере показано, как создать взвешенный слой сложения, который является слоем с несколькими входами и обучаемым параметром, и использовать его в сверточной нейронной сети. Взвешенный уровень сложения масштабирует и добавляет входные данные от нескольких нейронных сетевых уровней по элементам.

Слой с шаблоном обучаемых параметров

Скопируйте слой с шаблоном обучаемых параметров в новый файл в MATLAB. Этот шаблон описывает структуру слоя с обучаемыми параметрами и включает функции, определяющие поведение слоя.

classdef myLayer < nnet.layer.Layer % & nnet.layer.Formattable (Optional) 

    properties
        % (Optional) Layer properties.

        % Layer properties go here.
    end

    properties (Learnable)
        % (Optional) Layer learnable parameters.

        % Layer learnable parameters go here.
    end
    
    methods
        function layer = myLayer()
            % (Optional) Create a myLayer.
            % This function must have the same name as the class.

            % Layer constructor function goes here.
        end
        
        function [Z1, …, Zm] = predict(layer, X1, …, Xn)
            % Forward input data through the layer at prediction time and
            % output the result.
            %
            % Inputs:
            %         layer       - Layer to forward propagate through
            %         X1, ..., Xn - Input data
            % Outputs:
            %         Z1, ..., Zm - Outputs of layer forward function
            
            % Layer forward function for prediction goes here.
        end

        function [Z1, …, Zm, memory] = forward(layer, X1, …, Xn)
            % (Optional) Forward input data through the layer at training
            % time and output the result and a memory value.
            %
            % Inputs:
            %         layer       - Layer to forward propagate through
            %         X1, ..., Xn - Input data
            % Outputs:
            %         Z1, ..., Zm - Outputs of layer forward function
            %         memory      - Memory value for custom backward propagation

            % Layer forward function for training goes here.
        end

        function [dLdX1, …, dLdXn, dLdW1, …, dLdWk] = ...
                backward(layer, X1, …, Xn, Z1, …, Zm, dLdZ1, …, dLdZm, memory)
            % (Optional) Backward propagate the derivative of the loss  
            % function through the layer.
            %
            % Inputs:
            %         layer             - Layer to backward propagate through
            %         X1, ..., Xn       - Input data
            %         Z1, ..., Zm       - Outputs of layer forward function            
            %         dLdZ1, ..., dLdZm - Gradients propagated from the next layers
            %         memory            - Memory value from forward function
            % Outputs:
            %         dLdX1, ..., dLdXn - Derivatives of the loss with respect to the
            %                             inputs
            %         dLdW1, ..., dLdWk - Derivatives of the loss with respect to each
            %                             learnable parameter
            
            % Layer backward function goes here.
        end
    end
end

Назовите слой

Сначала присвойте слою имя. В первой строке файла класса замените существующее имя myLayer с weightedAdditionLayer.

classdef weightedAdditionLayer < nnet.layer.Layer
    ...
end

Далее переименуйте myLayer функция конструктора (первая функция в methods section), чтобы он имел то же имя, что и слой.

    methods
        function layer = weightedAdditionLayer()           
            ...
        end

        ...
     end

Сохранить слой

Сохранение файла класса слоев в новом файле с именем weightedAdditionLayer.m. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке по пути MATLAB.

Объявление свойств и обучаемых параметров

Объявление свойств слоя в properties и объявить обучаемые параметры, перечислив их в properties (Learnable) раздел.

По умолчанию эти свойства имеют пользовательские промежуточные слои.

СобственностьОписание
NameИмя слоя, указанное как символьный вектор или строковый скаляр. Чтобы включить слой в график слоев, необходимо указать непустое уникальное имя слоя. Если вы обучаете последовательную сеть с уровнем и Name имеет значение ''затем программа автоматически присваивает имя слою во время обучения.
Description

Однострочное описание слоя, определяемое как символьный вектор или строковый скаляр. Это описание появляется, когда слой отображается в Layer массив. Если описание слоя не указано, программа отображает имя класса слоев.

TypeТип слоя, заданный как символьный вектор или строковый скаляр. Значение Type появляется, когда слой отображается в Layer массив. Если тип слоя не указан, программа отображает имя класса слоев.
NumInputsЧисло входов слоя, указанное как положительное целое число. Если это значение не указано, программа автоматически устанавливает NumInputs до числа имен в InputNames. Значение по умолчанию - 1.
InputNamesВходные имена слоя, заданные как массив ячеек символьных векторов. Если это значение не указано, и NumInputs больше 1, то программное обеспечение устанавливается автоматически InputNames кому {'in1',...,'inN'}, где N равно NumInputs. Значение по умолчанию: {'in'}.
NumOutputsКоличество выходов слоя, указанное как положительное целое число. Если это значение не указано, программа автоматически устанавливает NumOutputs до числа имен в OutputNames. Значение по умолчанию - 1.
OutputNamesВыходные имена слоя, заданные как массив ячеек символьных векторов. Если это значение не указано, и NumOutputs больше 1, то программное обеспечение устанавливается автоматически OutputNames кому {'out1',...,'outM'}, где M равно NumOutputs. Значение по умолчанию: {'out'}.

Если у слоя нет других свойств, можно опустить properties раздел.

Совет

При создании слоя с несколькими входами необходимо задать либо NumInputs или InputNames свойства в конструкторе слоев. При создании слоя с несколькими выходами необходимо установить либо NumOutputs или OutputNames свойства в конструкторе слоев.

Слой взвешенного сложения не требует каких-либо дополнительных свойств, поэтому можно удалить properties раздел.

Взвешенный слой сложения имеет только один обучаемый параметр, весы. Объявить этот обучаемый параметр в properties (Learnable) раздел и вызовите параметр Weights.

    properties (Learnable)
        % Layer learnable parameters
            
        % Scaling coefficients
        Weights
    end

Создать функцию конструктора

Создайте функцию, которая создает слой и инициализирует свойства слоя. Укажите все переменные, необходимые для создания слоя в качестве входных данных функции конструктора.

Функция конструктора взвешенного слоя сложения требует два входа: количество входов в слой и имя слоя. Это количество входов в слой определяет размер обучаемого параметра Weights. Укажите два входных аргумента с именем numInputs и name в weightedAdditionLayer функция. Добавьте комментарий в верхней части функции, объясняющий синтаксис функции.

        function layer = weightedAdditionLayer(numInputs,name)
            % layer = weightedAdditionLayer(numInputs,name) creates a
            % weighted addition layer and specifies the number of inputs
            % and the layer name.
            
            ...
        end

Инициализация свойств слоя

Инициализируйте свойства слоя, включая обучаемые параметры, в функции конструктора. Заменить комментарий % Layer constructor function goes here с кодом, инициализирующим свойства слоя.

Установите NumInputs свойство для входного аргумента numInputs.

            % Set number of inputs.
            layer.NumInputs = numInputs;

Установите Name свойство для входного аргумента name.

            % Set layer name.
            layer.Name = name;

Присвойте слою однострочное описание, установив значение Description свойство слоя. Задайте описание для описания типа слоя и его размера.

            % Set layer description.
            layer.Description = "Weighted addition of " + numInputs + ...
                " inputs";

Взвешенный слой сложения умножает каждый слой, введенный на соответствующий коэффициент в Weights и добавляет результирующие значения вместе. Инициализация обучаемого параметра Weights быть случайным вектором размера 1-by-numInputs. Weights является свойством объекта слоя, поэтому необходимо назначить вектор layer.Weights.

            % Initialize layer weights
            layer.Weights = rand(1,numInputs);

Просмотр завершенной функции конструктора.

        function layer = weightedAdditionLayer(numInputs,name) 
            % layer = weightedAdditionLayer(numInputs,name) creates a
            % weighted addition layer and specifies the number of inputs
            % and the layer name.

            % Set number of inputs.
            layer.NumInputs = numInputs;

            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = "Weighted addition of " + numInputs +  ... 
                " inputs";
        
            % Initialize layer weights.
            layer.Weights = rand(1,numInputs); 
        end

С помощью этой функции конструктора команда weightedAdditionLayer(3,'add') создает слой взвешенного сложения с тремя входами и именем 'add'.

Создание функций пересылки

Создайте функции уровня вперед для использования во время прогнозирования и во время обучения.

Создание функции с именем predict который распространяет данные вперед через уровень во время прогнозирования и выводит результат.

Синтаксис для predict является [Z1,…,Zm] = predict(layer,X1,…,Xn), где X1,…,Xn являются n входные данные слоев и Z1,…,Zm являются m выходы слоев. Ценности n и m должны соответствовать NumInputs и NumOutputs свойства слоя.

Совет

Если количество входов в predict может варьироваться, а затем использовать varargin вместо X1,…,Xn. В этом случае varargin - массив ячеек входов, где varargin{i} соответствует Xi. Если количество выходов может варьироваться, используйте varargout вместо Z1,…,Zm. В этом случае varargout - массив ячеек выходных сигналов, где varargout{j} соответствует Zj.

Совет

Если пользовательский слой имеет dlnetwork для обучаемого параметра, затем в predict функции пользовательского слоя, используйте predict для функции dlnetwork. Использование dlnetwork объект predict функция гарантирует, что программное обеспечение использует правильные операции уровня для прогнозирования.

Поскольку взвешенный уровень сложения имеет только один выход и переменное количество входов, синтаксис для predict для взвешенного слоя сложения Z = predict(layer,varargin), где varargin{i} соответствует Xi для положительных целых чисел i меньше или равно NumInputs.

По умолчанию слой использует predict в качестве прямой функции во время обучения. Чтобы использовать другую прямую функцию во время обучения или сохранить значение, необходимое для обратной функции, необходимо также создать функцию с именем forward.

Размеры входов зависят от типа данных и выхода соединенных слоев:

Ввод слоевРазмер вводаИзмерение наблюдения
2-D изображенияh-by-w-c-by-N, где h, w и c соответствуют высоте, ширине и количеству каналов изображений соответственно, а N - количество наблюдений.4
3-D изображенияh-by-w-d-by-c-by-N, где h, w, d и c соответствуют высоте, ширине, глубине и количеству каналов 3-D изображений соответственно, а N - количество наблюдений.5
Векторные последовательностиc-by-N-by-S, где c - число признаков последовательностей, N - число наблюдений, а S - длина последовательности.2
2-D последовательности изображенийh-by-w-c-by-N-by-S, где h, w и c соответствуют высоте, ширине и количеству каналов изображений, соответственно, N - количество наблюдений, а S - длина последовательности.4
3-D последовательности изображенийh-by-w-d-by-c-by-N-by-S, где h, w, d и c соответствуют высоте, ширине, глубине и количеству каналов 3-D изображений, соответственно, N - количество наблюдений, а S - длина последовательности.5

Для слоев, выводящих последовательности, слои могут выводить последовательности любой длины или выходные данные без измерения времени. Обратите внимание, что при обучении сеть, которая выводит последовательности с использованием trainNetwork , длины входных и выходных последовательностей должны совпадать.

forward функция распространяет данные вперед через уровень во время тренировки, а также выводит значение памяти.

Синтаксис для forward является [Z1,…,Zm,memory] = forward(layer,X1,…,Xn), где X1,…,Xn являются n вводы слоев, Z1,…,Zm являются m выходы уровня, и memory - память слоя.

Совет

Если количество входов в forward может варьироваться, а затем использовать varargin вместо X1,…,Xn. В этом случае varargin - массив ячеек входов, где varargin{i} соответствует Xi. Если количество выходов может варьироваться, используйте varargout вместо Z1,…,Zm. В этом случае varargout - массив ячеек выходных сигналов, где varargout{j} соответствует Zj для j = 1,…,NumOutputs и varargout{NumOutputs + 1} соответствует memory.

Совет

Если пользовательский слой имеет dlnetwork для обучаемого параметра, затем в forward функции пользовательского слоя, используйте forward функции dlnetwork объект. Использование dlnetwork объект forward функция гарантирует, что программное обеспечение использует правильные операции уровня для обучения.

Прямой функцией взвешенного уровня сложения является

f (X (1),..., X (n)) =∑i=1nWiX (i)

где X (1),..., X (n) соответствуют входам слоя и W1,...,Wn являются весами слоя.

Реализация функции пересылки в predict. В predict, выходные данные Z соответствует f (X (1),..., X (n)). Взвешенный уровень сложения не требует памяти или другой функции пересылки для обучения, поэтому можно удалитьforward из файла класса. Добавьте комментарий в верхнюю часть функции, который объясняет синтаксисы функции.

Совет

При предварительном назначении массивов с использованием таких функций, как zeros, то необходимо убедиться, что типы данных этих массивов согласуются с входами функции уровня. Чтобы создать массив нулей того же типа данных, что и другой массив, используйте 'like' вариант zeros. Например, для инициализации массива нулей размера sz с тем же типом данных, что и массив X, использовать Z = zeros(sz,'like',X).

        function Z = predict(layer, varargin)
            % Z = predict(layer, X1, ..., Xn) forwards the input data X1,
            % ..., Xn through the layer and outputs the result Z.
            
            X = varargin;
            W = layer.Weights;
            
            % Initialize output
            X1 = X{1};
            sz = size(X1);
            Z = zeros(sz,'like',X1);
            
            % Weighted addition
            for i = 1:layer.NumInputs
                Z = Z + W(i)*X{i};
            end
        end

Потому что predict функция использует только те функции, которые поддерживают dlarray объекты, определение backward является необязательной функцией. Список функций, поддерживающих dlarray см. Список функций с поддержкой dlarray.

Завершенный слой

Просмотр завершенного файла класса слоев.

classdef weightedAdditionLayer < nnet.layer.Layer
    % Example custom weighted addition layer.

    properties (Learnable)
        % Layer learnable parameters
            
        % Scaling coefficients
        Weights
    end
    
    methods
        function layer = weightedAdditionLayer(numInputs,name) 
            % layer = weightedAdditionLayer(numInputs,name) creates a
            % weighted addition layer and specifies the number of inputs
            % and the layer name.

            % Set number of inputs.
            layer.NumInputs = numInputs;

            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = "Weighted addition of " + numInputs +  ... 
                " inputs";
        
            % Initialize layer weights.
            layer.Weights = rand(1,numInputs); 
        end
        
        function Z = predict(layer, varargin)
            % Z = predict(layer, X1, ..., Xn) forwards the input data X1,
            % ..., Xn through the layer and outputs the result Z.
            
            X = varargin;
            W = layer.Weights;
            
            % Initialize output
            X1 = X{1};
            sz = size(X1);
            Z = zeros(sz,'like',X1);
            
            % Weighted addition
            for i = 1:layer.NumInputs
                Z = Z + W(i)*X{i};
            end
        end
    end
end

Совместимость графического процессора

Если функции прямого уровня полностью поддерживают dlarray объекты, то слой совместим с GPU. В противном случае, чтобы быть совместимым с GPU, функции уровня должны поддерживать входы и обратные выходы типа gpuArray(Панель инструментов параллельных вычислений).

Поддержка многих встроенных функций MATLAB gpuArray(Панель инструментов параллельных вычислений) и dlarray входные аргументы. Список функций, поддерживающих dlarray см. Список функций с поддержкой dlarray. Список функций, выполняемых на графическом процессоре, см. в разделе Выполнение функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений). Чтобы использовать графический процессор для глубокого обучения, необходимо также иметь поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox). Дополнительные сведения о работе с графическими процессорами в MATLAB см. в разделе Вычисления графического процессора в MATLAB (Parallel Computing Toolbox).

В этом примере функции MATLAB используются в predict вся поддержка dlarray объекты, поэтому слой совместим с графическим процессором.

Проверка достоверности слоя с несколькими входами

Проверка допустимости слоя для пользовательского слоя weightedAdditionLayer.

Определите пользовательский взвешенный слой добавления. Чтобы создать этот слой, сохраните файл weightedAdditionLayer.m в текущей папке.

Создание экземпляра слоя и проверка его действительности с помощью checkLayer. Укажите допустимые размеры ввода, которые должны быть типовыми размерами одного наблюдения для каждого ввода в слой. Слой ожидает 4-D входов массива, где первые три размера соответствуют высоте, ширине и количеству каналов предыдущего выхода слоя, а четвертый размер соответствует наблюдениям.

Укажите типичный размер входных данных наблюдения и набора 'ObservationDimension' до 4.

layer = weightedAdditionLayer(2,'add');
validInputSize = {[24 24 20],[24 24 20]};
checkLayer(layer,validInputSize,'ObservationDimension',4)
Running nnet.checklayer.TestLayerWithoutBackward
.......... .......
Done nnet.checklayer.TestLayerWithoutBackward
__________

Test Summary:
	 17 Passed, 0 Failed, 0 Incomplete, 0 Skipped.
	 Time elapsed: 0.55735 seconds.

Здесь функция не обнаруживает никаких проблем с уровнем.

Использование пользовательского взвешенного уровня добавления в сети

Пользовательский слой можно использовать так же, как и любой другой слой в инструментарии глубокого обучения. В этом разделе показано, как создавать и обучать сеть классификации цифр с использованием уровня взвешенного сложения, созданного ранее.

Загрузите пример учебных данных.

[XTrain,YTrain] = digitTrain4DArrayData;

Определите пользовательский взвешенный слой добавления. Чтобы создать этот слой, сохраните файл weightedAdditionLayer.m в текущей папке.

Создание графика слоев, включающего пользовательский слой weightedAdditionLayer.

layers = [
    imageInputLayer([28 28 1],'Name','in')
    convolution2dLayer(5,20,'Name','conv1')
    reluLayer('Name','relu1')
    convolution2dLayer(3,20,'Padding',1,'Name','conv2')
    reluLayer('Name','relu2')
    convolution2dLayer(3,20,'Padding',1,'Name','conv3')
    reluLayer('Name','relu3')
    weightedAdditionLayer(2,'add')
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','softmax')
    classificationLayer('Name','classoutput')];

lgraph = layerGraph(layers);
lgraph = connectLayers(lgraph, 'relu1', 'add/in2');

Установите параметры обучения и обучите сеть.

options = trainingOptions('adam','MaxEpochs',10);
net = trainNetwork(XTrain,YTrain,lgraph,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 |       12.50% |       2.2951 |          0.0010 |
|       2 |          50 |       00:00:07 |       72.66% |       0.7877 |          0.0010 |
|       3 |         100 |       00:00:12 |       89.84% |       0.2982 |          0.0010 |
|       4 |         150 |       00:00:18 |       94.53% |       0.1569 |          0.0010 |
|       6 |         200 |       00:00:24 |       99.22% |       0.0376 |          0.0010 |
|       7 |         250 |       00:00:29 |       99.22% |       0.0393 |          0.0010 |
|       8 |         300 |       00:00:35 |       99.22% |       0.0186 |          0.0010 |
|       9 |         350 |       00:00:41 |      100.00% |       0.0101 |          0.0010 |
|      10 |         390 |       00:00:45 |      100.00% |       0.0072 |          0.0010 |
|========================================================================================|

Просмотрите веса, полученные на взвешенном слое сложения.

net.Layers(8).Weights
ans = 1x2 single row vector

    1.0227    1.0001

Оцените производительность сети путем прогнозирования новых данных и вычисления точности.

[XTest,YTest] = digitTest4DArrayData;
YPred = classify(net,XTest);
accuracy = sum(YTest==YPred)/numel(YTest)
accuracy = 0.9894

См. также

| |

Связанные темы