Если Deep Learning Toolbox™ не предоставляет слой, требуемый для вашей задачи, то можно задать свой собственный пользовательский слой, используя этот пример в качестве руководства. Список встроенных слоев см. в Списке слоев глубокого обучения.
Чтобы определить пользовательский слой глубокого обучения, можно использовать шаблон, представленный в этом примере, который проходит через следующие шаги:
Назовите слой - Дайте слою имя, чтобы вы могли использовать его в MATLAB®.
Объявить свойства слоя - Задать свойства слоя и какие параметры узнаются во время обучения.
Создайте функцию конструктора (необязательно) - задайте, как создать слой и инициализировать его свойства. Если вы не задаете функцию конструктора, то при создании программное обеспечение инициализирует Name
, Description
, и Type
свойства с []
и устанавливает количество входов и выходов слоя равным 1.
Создайте прямые функции - Задайте, как данные проходят вперед через слой (прямое распространение) во время предсказания и во время обучения.
Создайте обратную функцию (необязательно) - Задайте производные потерь относительно входных данных и настраиваемых параметров (обратное распространение). Если вы не задаете обратную функцию, то передние функции должны поддерживать dlarray
объекты.
Определение обратной функции опционально, когда передние функции поддерживают dlarray
объекты как вход. Использование dlarray
облегчает работу с данными высоких размерностей, позволяя пометить размеры. Для примера можно пометить, какие размерности соответствуют пространственным, временным, канальным и пакетным размерностям, используя 'S'
, 'T'
, 'C'
, и 'B'
метки, соответственно. Для неопределенных и других размерностей используйте 'U'
метка. Для dlarray
функции объекта, которые работают над конкретными размерностями, можно задать метки размера путем форматирования dlarray
объект непосредственно, или при помощи 'DataFormat'
опция.
Использование форматированных dlarray
объекты в пользовательских слоях также позволяют вам задавать слои, где входы и выходы имеют различные форматы, такие как слои, которые перестраивают, добавляют или удаляют размерности. Например, можно задать слой, который принимает за вход мини-пакет изображений с форматом 'SSCB'
(пространственный, пространственный, канальный, пакетный) и выхода мини-пакета последовательностей с форматом 'CBT'
(канал, пакет, время).
Включение поддержки использования форматированных dlarray
объекты в пользовательских слоях прямых функциях, также наследуются от nnet.layer.Formattable
класс при определении пользовательского слоя.
В этом примере показано, как создать слой проекта и изменения формы, который является слоем, обычно используемым в генеративных состязательных сетях (GANs), который принимает массив шума с форматом 'CB'
(канал, пакет) и проецирует и изменяет его на мини-пакет изображений с форматом 'SSCB'
(пространственный, пространственный, канальный, пакетный) с использованием полносвязных, перестроенных и релейных операций.
Для примера, показывающего, как обучить GAN с слоем проекта и изменения формы, смотрите Обучить Генеративную Состязательную Сеть (GAN).
Скопируйте слой с настраиваемых параметров шаблоном в новый файл в 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
с projectAndReshapeLayer
. Затем задайте, чтобы наследовать от обоих nnet.layer.Layer
и nnet.layer.Formattable
суперклассы.
classdef projectAndRehapeLayer < nnet.layer.Layer & nnet.layer.Formattable ... end
Далее переименуйте myLayer
функция конструктора (первая функция в methods
section) так, чтобы оно имело то же имя что и слой.
methods function layer = projectAndReshapeLayer() ... end ... end
Сохраните файл класса слоя в новом файле с именем projectAndReshapeLayer.m
. Имя файла должно совпадать с именем слоя. Чтобы использовать слой, необходимо сохранить файл в текущей папке или в папке на пути MATLAB.
Объявление свойств слоя в properties
и объявить настраиваемые параметры путем их перечисления в properties (Learnable)
раздел.
По умолчанию пользовательские промежуточные слои имеют эти свойства.
Свойство | Описание |
---|---|
Name | Имя слоя, заданное как вектор символов или строковый скаляр. Чтобы включить слой в график слоев, необходимо задать непустое уникальное имя слоя. Если вы обучаете последовательную сеть с слоем и Name установлено в '' затем программа автоматически присваивает слою имя во время обучения. |
Description | Однострочное описание слоя, заданное как вектор символов или строковый скаляр. Это описание появляется, когда слой отображается в |
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
свойства в конструкторе слоев. Для получения примера смотрите Задать Пользовательский Слой Глубокого Обучения с Несколькими Входами.
Для проецирования и изменения формы слоя требуется дополнительное свойство, которое сохраняет размер выхода слоя. Задайте одно свойство с именем OutputSize
в properties
раздел.
properties
% Output size
OutputSize
end
Слой project и reshape имеют два настраиваемых параметры: веса и смещения операции полного соединения. Объявите эти настраиваемые параметры в properties (Learnable)
раскройте и вызовите параметры Weights
и Bias
, соответственно.
properties (Learnable)
% Layer learnable parameters
% Fully connect weights Weights % Fully
connect biases Bias end
Создайте функцию, которая создает слой и инициализирует свойства слоя. Задайте любые переменные, необходимые для создания слоя в качестве входов для функции конструктора.
Функция конструктора проекта и изменения формы слоя требует двух входных параметров:
Размер вывода слоя
Количество каналов
Имя слоя (необязательно, с именем по умолчанию ''
)
В функции конструктора projectAndReshapeLayer
, задайте два необходимых входных параметров с именем outputSize
и numChannels
и необязательные аргументы в виде пар "имя-значение" с именем NameValueArgs
. Добавьте комментарий к верхней части функции, которая объясняет синтаксис функции.
function layer = projectAndReshapeLayer(outputSize,numChannels,NameValueArgs) % layer = projectAndReshapeLayer(outputSize,numChannels) % creates a projectAndReshapeLayer object that projects and % reshapes the input to the specified output size using and % specifies the number of input channels. % % layer = projectAndReshapeLayer(outputSize,numChannels,'Name',name) % also specifies the layer name. ... end
Проанализируйте входные параметры с помощью arguments
блок. Перечислите аргументы в том же порядке, что и синтаксис функции, и задайте значения по умолчанию. Затем извлеките значения из NameValueArgs
вход.
% Parse input arguments. arguments outputSize numChannels NameValueArgs.Name = '' end name = NameValueArgs.Name;
Инициализируйте свойства слоя, включая настраиваемые параметры в функции конструктора. Замените комментарий % Layer constructor function goes here
с кодом, который инициализирует свойства слоя.
Установите Name
свойство для входного параметра name
.
% Set layer name.
layer.Name = name;
Дайте слою однострочного описания путем установки Description
свойство слоя. Установите описание, чтобы описать тип слоя и его размер.
% Set layer description. layer.Description = "Project and reshape layer with output size " + join(string(outputSize));
Укажите тип слоя путем установки Type
свойство. Значение Type
появляется, когда слой отображается в Layer
массив.
% Set layer type. layer.Type = "Project and Reshape";
Установите свойство слоя OutputSize
к заданному входному значению.
% Set output size.
layer.OutputSize = outputSize;
Слой проекта и изменения формы применяет операцию полного соединения, чтобы проецировать вход на пакет изображений. Инициализируйте веса с помощью инициализатора Glorot и инициализируйте смещение с массивом нулей. Функции initializeGlorot
и initializeZeros
присоединены к примеру Train Generative Adversarial Network (GAN) как вспомогательные файлы. Чтобы получить доступ к этим функциям, откройте этот пример как live скрипт. Для получения дополнительной информации об инициализации настраиваемых параметров для операций глубокого обучения, смотрите Initialize Learnable Parameters for Model Function.
% Initialize fully connect weights and bias.
sz = [prod(outputSize) numChannels];
numOut = prod(outputSize);
numIn = numChannels;
layer.Weights = initializeGlorot(sz,numOut,numIn);
layer.Bias = initializeZeros([prod(outputSize) 1]);
Просмотрите завершенную функцию конструктора.
function layer = projectAndReshapeLayer(outputSize,numChannels,NameValueArgs)
% layer = projectAndReshapeLayer(outputSize,numChannels)
% creates a projectAndReshapeLayer object that projects and
% reshapes the input to the specified output size using and
% specifies the number of input channels.
%
% layer = projectAndReshapeLayer(outputSize,numChannels,'Name',name)
% also specifies the layer name.
% Parse input arguments.
arguments
outputSize
numChannels
NameValueArgs.Name = '';
end
name = NameValueArgs.Name;
% Set layer name.
layer.Name = name;
% Set layer description.
layer.Description = "Project and reshape layer with output size " + join(string(outputSize));
% Set layer type.
layer.Type = "Project and Reshape";
% Set output size.
layer.OutputSize = outputSize;
% Initialize fully connect weights and bias.
sz = [prod(outputSize) numChannels];
numOut = prod(outputSize);
numIn = numChannels;
layer.Weights = initializeGlorot(sz,numOut,numIn);
layer.Bias = initializeZeros([prod(outputSize) 1]);
end
С помощью этой функции конструктора команда projectAndReshapeLayer([4 4 512],100,'Name','proj');
создает слой проекта и изменения формы с именем 'proj'
который проецирует входные массивы с размером 100 на пакет 512 изображений 4 на 4.
Создайте передовые функции слоя для использования во времени предсказания и времени обучения.
Создайте функцию с именем 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,X)
.
По умолчанию слой использует predict
как прямая функция во время обучения. Чтобы использовать другую прямую функцию во время обучения или сохранить значение, необходимое для пользовательской обратной функции, необходимо также создать функцию с именем forward
.
Размерности входов зависят от типа данных и выхода связанных слоев:
Вход слоя | Вход сигнала | Размерность наблюдения |
---|---|---|
2-D изображения | h -by- w -by- c -by- N, где h, w и c соответствуют высоте, ширине и количеству каналов изображений, соответственно, а N - количеству наблюдений. | 4 |
3-D изображения | <reservedrangesplaceholder9>-by-<reservedrangesplaceholder8>-by-<reservedrangesplaceholder7>-by-<reservedrangesplaceholder6>-by-<reservedrangesplaceholder5>, где h, w, d, и c соответствуют высоте, ширине, глубине, и количество каналов 3D изображений, соответственно, и N - количество наблюдений. | 5 |
Векторные последовательности | c -by- N -by- S, где c - количество функций последовательностей, N - количество наблюдений, а S - длина последовательности. | 2 |
2-D последовательности изображений | h -by- w -by- c -by- N -by- S, где h, w и c соответствуют высоте, ширине и количеству каналов изображений, соответственно, N является количеством наблюдений, а S - длиной последовательности. | 4 |
3-D последовательности изображений | h -by- w -by- d -by- c -by- N -by- S, где h, w, d и c соответствуют высоте, ширине, глубине и количеству каналов 3-D изображений, соответственно, N количество наблюдений, а S - длина последовательности. | 5 |
Для слоев, которые выводят последовательности, слои могут выводить последовательности любой длины или выводить данные без временной размерности. Обратите внимание, что при обучении сети, которая выводит последовательности, используя trainNetwork
function, длины входа и выхода последовательностей должны совпадать.
Потому что пользовательский слой наследует от nnet.layer.Formattable
класс, слой получает форматированный dlarray
объекты с метками, соответствующими выходам предыдущего слоя.
The 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 объекта
функция гарантирует, что программное обеспечение использует правильные операции слоя для обучения.
Проект и операция изменения формы состоят из трех операций:
Примените операции полного соединения с усвояемыми весами и смещениями.
Измените форму выхода на заданный размер выхода.
Перемаркируйте размерности так, чтобы выход имел формат 'SSCB'
(пространственный, пространственный, канальный, пакетный)
Реализуйте эту операцию в predict
функция. Слой project и reshape не требует памяти или другой прямой функции для обучения, поэтому можно удалить forward
функция из файла класса. Добавьте комментарий к верхней части функции, которая объясняет синтаксисы функции.
function Z = predict(layer, X)
% Forward input data through the layer at prediction time and
% output the result.
%
% Inputs:
% layer - Layer to forward propagate through
% X - Input data, specified as a formatted dlarray
% with a 'C' and optionally a 'B' dimension.
% Outputs:
% Z - Output of layer forward function returned as
% a formatted dlarray with format 'SSCB'.
% Fully connect.
weights = layer.Weights;
bias = layer.Bias;
X = fullyconnect(X,weights,bias);
% Reshape.
outputSize = layer.OutputSize;
Z = reshape(X, outputSize(1), outputSize(2), outputSize(3), []);
% Relabel.
Z = dlarray(Z,'SSCB');
end
Совет
Если вы предварительно распределяете массивы, используя такие функции, как zeros
Затем необходимо убедиться, что типы данных этих массивов соответствуют входам функции слоя. Чтобы создать массив нулей того совпадающий тип данных, что и другой массив, используйте 'like'
опция zeros
. Для примера инициализировать массив нулей размера sz
с тем совпадающим типом данных, что и массив X
, использовать Z = zeros(sz,'like',X)
.
Потому что predict
функция использует только функции, которые поддержка dlarray
объекты, определяющие backward
функция опциональна. Список функций, поддерживающих dlarray
объекты, см. Список функций с поддержкой dlarray.
Просмотрите заполненный файл класса слоя.
classdef projectAndReshapeLayer < nnet.layer.Layer & nnet.layer.Formattable % Example project and reshape layer. properties % Output size OutputSize end properties (Learnable) % Layer learnable parameters % Fully connect weights Weights % Fully connect biases Bias end methods function layer = projectAndReshapeLayer(outputSize,numChannels,NameValueArgs) % layer = projectAndReshapeLayer(outputSize,numChannels) % creates a projectAndReshapeLayer object that projects and % reshapes the input to the specified output size using and % specifies the number of input channels. % % layer = projectAndReshapeLayer(outputSize,numChannels,'Name',name) % also specifies the layer name. % Parse input arguments. arguments outputSize numChannels NameValueArgs.Name = ''; end name = NameValueArgs.Name; % Set layer name. layer.Name = name; % Set layer description. layer.Description = "Project and reshape layer with output size " + join(string(outputSize)); % Set layer type. layer.Type = "Project and Reshape"; % Set output size. layer.OutputSize = outputSize; % Initialize fully connect weights and bias. sz = [prod(outputSize) numChannels]; numOut = prod(outputSize); numIn = numChannels; layer.Weights = initializeGlorot(sz,numOut,numIn); layer.Bias = initializeZeros([prod(outputSize) 1]); end function Z = predict(layer, X) % Forward input data through the layer at prediction time and % output the result. % % Inputs: % layer - Layer to forward propagate through % X - Input data, specified as a formatted dlarray % with a 'C' and optionally a 'B' dimension. % Outputs: % Z - Output of layer forward function returned as % a formatted dlarray with format 'SSCB'. % Fully connect. weights = layer.Weights; bias = layer.Bias; X = fullyconnect(X,weights,bias); % Reshape. outputSize = layer.OutputSize; Z = reshape(X, outputSize(1), outputSize(2), outputSize(3), []); % Relabel. Z = dlarray(Z,'SSCB'); 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, используемые в predict
все dlarray поддержки
объекты, поэтому слой совместим с графическим процессором.
Определите следующую архитектуру сети генератора для GAN, который производит изображения от массивов случайных значений 1 на 1 на 100:
Эта сеть:
Преобразовывает случайные векторы размера 100 к массивам 7 на 7 на 128, используя проект, и измените слой.
Upscales получающиеся массивы к массивам 64 на 64 на 3, используя серию перемещенных слоев скручивания и слоев ReLU.
Определите эту сетевую архитектуру как график слоев и задайте следующие свойства сети.
Для транспонированных слоев свертки задайте фильтры 5 на 5 с уменьшающимся количеством фильтров для каждого слоя, полосой 2 и обрезкой выхода на каждом ребре.
Для последнего транспонированного слоя свертки задайте три фильтра 5 на 5, соответствующих трем каналам RGB сгенерированных изображений, и выходной размер предыдущего слоя.
В конце сети включают слой танха.
Чтобы проецировать и изменить форму входного сигнала шума, используйте пользовательский слой projectAndReshapeLayer.
filterSize = 5; numFilters = 64; numLatentInputs = 100; projectionSize = [4 4 512]; layersG = [ featureInputLayer(numLatentInputs,'Normalization','none','Name','in') projectAndReshapeLayer(projectionSize,numLatentInputs,'Name','proj'); transposedConv2dLayer(filterSize,4*numFilters,'Name','tconv1') reluLayer('Name','relu1') transposedConv2dLayer(filterSize,2*numFilters,'Stride',2,'Cropping','same','Name','tconv2') reluLayer('Name','relu2') transposedConv2dLayer(filterSize,numFilters,'Stride',2,'Cropping','same','Name','tconv3') reluLayer('Name','relu3') transposedConv2dLayer(filterSize,3,'Stride',2,'Cropping','same','Name','tconv4') tanhLayer('Name','tanh')]; lgraphG = layerGraph(layersG);
Чтобы обучить сеть с помощью пользовательского цикла обучения и включить автоматическую дифференциацию, преобразуйте график слоев в dlnetwork
объект.
dlnetG = dlnetwork(lgraphG);