exponenta event banner

encoderDecoderNetwork

Создание сети кодировщика-декодера

Описание

пример

net = encoderDecoderNetwork(inputSize,encoder,decoder) соединяет сеть кодера и сеть декодера для создания сети кодера-декодера, net.

Для выполнения этой функции требуется Toolbox™ глубокого обучения.

net = encoderDecoderNetwork(inputSize,encoder,decoder,Name,Value) модифицирует аспекты сети кодер-декодер с использованием аргументов «имя-значение».

Примеры

свернуть все

Создайте модуль кодера, состоящий из четырех блоков кодера.

encoderBlock = @(block) [
    convolution2dLayer(3,2^(5+block),"Padding",'same')
    reluLayer
    convolution2dLayer(3,2^(5+block),"Padding",'same')
    reluLayer
    maxPooling2dLayer(2,"Stride",2)];
encoder = blockedNetwork(encoderBlock,4,"NamePrefix","encoder_");

Создайте модуль декодера, состоящий из четырех блоков декодера.

decoderBlock = @(block) [
    transposedConv2dLayer(2,2^(10-block),'Stride',2)
    convolution2dLayer(3,2^(10-block),"Padding",'same')
    reluLayer
    convolution2dLayer(3,2^(10-block),"Padding",'same')
    reluLayer];
decoder = blockedNetwork(decoderBlock,4,"NamePrefix","decoder_");

Создайте слои моста.

bridge = [
    convolution2dLayer(3,1024,"Padding",'same')
    reluLayer
    convolution2dLayer(3,1024,"Padding",'same')
    reluLayer
    dropoutLayer(0.5)];            

Укажите размер сетевого входа.

inputSize = [224 224 3];

Создайте сеть U-Net путем подключения модуля кодера, моста и модуля декодера и добавления соединений пропуска.

unet = encoderDecoderNetwork(inputSize,encoder,decoder, ...
    "OutputChannels",3, ...
    "SkipConnections","concatenate", ...
    "LatentNetwork",bridge)
unet = 
  dlnetwork with properties:

         Layers: [55x1 nnet.cnn.layer.Layer]
    Connections: [62x2 table]
     Learnables: [46x3 table]
          State: [0x3 table]
     InputNames: {'encoderImageInputLayer'}
    OutputNames: {'encoderDecoderFinalConvLayer'}
    Initialized: 1

Отображение сети.

analyzeNetwork(unet)

Создайте сеть кодера GAN с четырьмя операциями понижающей дискретизации из предварительно обученной сети GoogLeNet.

depth = 4;
[encoder,outputNames] = pretrainedEncoderNetwork('googlenet',depth);

Определите входной размер сети кодировщика.

inputSize = encoder.Layers(1).InputSize;

Определите размер выходных данных уровней активации в сети кодировщика путем создания выборки входных данных и последующего вызова forward, которая возвращает активации.

exampleInput = dlarray(zeros(inputSize),'SSC');
exampleOutput = cell(1,length(outputNames));
[exampleOutput{:}] = forward(encoder,exampleInput,'Outputs',outputNames);

Определите количество каналов в блоках декодера как длину третьего канала в каждой активации.

numChannels = cellfun(@(x) size(extractdata(x),3),exampleOutput);
numChannels = fliplr(numChannels(1:end-1));

Определите функцию, создающую массив слоев для одного блока декодера.

decoderBlock = @(block) [
    transposedConv2dLayer(2,numChannels(block),'Stride',2)
    convolution2dLayer(3,numChannels(block),'Padding','same')
    reluLayer
    convolution2dLayer(3,numChannels(block),'Padding','same')
    reluLayer];

Создайте модуль декодера с тем же количеством блоков повышающей дискретизации, что и блоки понижающей дискретизации в модуле кодера.

decoder = blockedNetwork(decoderBlock,depth);

Создайте сеть U-Net путем подключения модуля кодера и модуля декодера и добавления соединений пропуска.

net = encoderDecoderNetwork([224 224 3],encoder,decoder, ...
   'OutputChannels',3,'SkipConnections','concatenate')
net = 
  dlnetwork with properties:

         Layers: [139x1 nnet.cnn.layer.Layer]
    Connections: [167x2 table]
     Learnables: [116x3 table]
          State: [0x3 table]
     InputNames: {'data'}
    OutputNames: {'encoderDecoderFinalConvLayer'}
    Initialized: 1

Отображение сети.

analyzeNetwork(net)

Входные аргументы

свернуть все

Размер сетевого входа, заданный как 3-элементный вектор положительных целых чисел. inputSize имеет вид [H W C], где H - высота, W - ширина, а C - количество каналов.

Пример: [28 28 3] задает размер ввода для 3-канального изображения 28 на 28 пикселей.

Сеть кодировщика, указанная как dlnetwork(Панель инструментов глубокого обучения).

Сеть декодера, указанная как dlnetwork(Панель инструментов глубокого обучения). Сеть должна иметь один вход и один выход.

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'SkipConnections',"concatenate" определяет тип пропуска соединения между сетями кодера и декодера в качестве конкатенации.

Сеть, соединяющая кодер и декодер, заданную как уровень или массив уровней.

Сеть, подключенная к выходу декодера, заданному как уровень или массив уровней. Если указать 'OutputChannels"аргумент, то конечная сеть соединяется после конечного уровня свертки 1 на 1 декодера.

Количество выходных каналов сети декодера, указанное как положительное целое число. Если задать этот аргумент, то конечный уровень декодера выполняет операцию свертки 1 на 1 с заданным количеством каналов.

Имена пар уровней кодера/декодера, активации которых объединяются соединениями пропуска, указанные как одно из этих значений.

  • "auto"- encoderDecoderNetwork функция автоматически определяет имена пар уровней кодера/декодера.

  • M-by-2 string array - первый столбец является именем уровня кодера, а второй столбец является именем соответствующего уровня декодера.

При указании 'SkipConnectionsаргумент «» как "none", encoderDecoderNetwork функция игнорирует значение 'SkipConnectionNames'.

Типы данных: char | string

Тип пропуска соединения между сетями кодера и декодера, указанный как "none", "auto", или "concatenate".

Типы данных: char | string

Выходные аргументы

свернуть все

Сеть кодера/декодера, возвращаемая как dlnetwork(Панель инструментов глубокого обучения).

Представлен в R2021a