Создайте сеть энкодер-декодер
изменяет аспекты сети энкодер-декодер с помощью аргументов имя-значение.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)
inputSize
- Размер входа сетиРазмер входа сети, заданный как 3-элементный вектор положительных целых чисел. inputSize
имеет вид [H
W C], где H
- высота, W - ширина, а C - количество каналов.
Пример: [28 28 3]
задает размер входа 28 на 28 пикселей для трехканального изображения.
encoder
- Сеть энкодераdlnetwork
объектСеть энкодера, заданная как dlnetwork
(Deep Learning Toolbox) объект.
decoder
- Сеть декодераdlnetwork
объектСеть декодера, заданная как dlnetwork
(Deep Learning Toolbox) объект. Сеть должна иметь один вход и один выход.
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
'SkipConnections',"concatenate"
задает тип пропускного соединения между сетями энкодера и декодера в качестве конкатенации.'LatentNetwork'
- Сеть, соединяющая энкодер и декодер[]
(по умолчанию) | объект слоя | массив объектов слояСеть, соединяющая энкодер и декодер, заданная как слой или массив слоев.
'FinalNetwork'
- Сеть, подключенная к выходу декодера[]
(по умолчанию) | объект слоя | массив объектов слояСеть, соединенная с выходом декодера, задается как слой или массив слоев. Если вы задаете 'OutputChannels
'аргумент, затем конечная сеть соединяется после последнего слоя свертки 1 на 1 декодера.
'OutputChannels'
- Количество выходных каналов[]
(по умолчанию) | положительное целое числоКоличество выходных каналов сети декодера, заданное в виде положительного целого числа. Если вы задаете этот аргумент, то последний слой декодера выполняет операцию свертки 1 на 1 с заданным количеством каналов.
'SkipConnectionNames'
- Имена пар слоев энкодера/декодера"auto"
(по умолчанию) | M строковый массив -by-2Имена пар слоев энкодера/декодера, активация которых объединяется пропущенными соединениями, заданными в качестве одного из следующих значений.
"auto"
- The encoderDecoderNetwork
функция автоматически определяет имена пар слоев энкодера/декодера.
M-by-2 строковые массивы - первый столбец являются именем слоя энкодера, а второй столбец - именем соответствующего слоя декодера.
Когда вы задаете 'SkipConnections
'аргумент как "none"
, encoderDecoderNetwork
функция игнорирует значение 'SkipConnectionNames
'.
Типы данных: char
| string
'SkipConnections'
- Тип пропускающего соединения"none"
(по умолчанию) | "auto"
| "concatenate"
Тип пропускного соединения между сетями энкодера и декодера, заданный как "none"
, "auto"
, или "concatenate"
.
Типы данных: char
| string
net
- Сеть энкодера/декодераdlnetwork
объектСеть энкодера/декодера, возвращается как dlnetwork
(Deep Learning Toolbox) объект.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.