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