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