encoderDecoderNetwork

Создайте сеть энкодер-декодер

Описание

пример

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

Эта функция требует Deep Learning 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)

Создайте сеть энкодера с четырьмя операциями понижающей дискретизации от предварительно обученной сети 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] задает размер входа 28 на 28 пикселей для трехканального изображения.

Сеть энкодера, заданная как dlnetwork (Deep Learning Toolbox) объект.

Сеть декодера, заданная как dlnetwork (Deep Learning Toolbox) объект. Сеть должна иметь один вход и один выход.

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

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

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

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

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

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

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

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

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

Когда вы задаете 'SkipConnections'аргумент как "none", encoderDecoderNetwork функция игнорирует значение 'SkipConnectionNames'.

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

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

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

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

свернуть все

Сеть энкодера/декодера, возвращается как dlnetwork (Deep Learning Toolbox) объект.

Введенный в R2021a