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