Создание сети кодировщика-декодера
модифицирует аспекты сети кодер-декодер с использованием аргументов «имя-значение».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] задает размер ввода для 3-канального изображения 28 на 28 пикселей.
encoder - Сеть кодировщикаdlnetwork объектСеть кодировщика, указанная как dlnetwork(Панель инструментов глубокого обучения).
decoder - Сеть декодеровdlnetwork объектСеть декодера, указанная как dlnetwork(Панель инструментов глубокого обучения). Сеть должна иметь один вход и один выход.
Укажите дополнительные пары, разделенные запятыми 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-by-2 string array - первый столбец является именем уровня кодера, а второй столбец является именем соответствующего уровня декодера.
При указании 'SkipConnectionsаргумент «» как "none", encoderDecoderNetwork функция игнорирует значение 'SkipConnectionNames'.
Типы данных: char | string
'SkipConnections' - Тип пропуска соединения"none" (по умолчанию) | "auto" | "concatenate"Тип пропуска соединения между сетями кодера и декодера, указанный как "none", "auto", или "concatenate".
Типы данных: char | string
net - Сеть кодера/декодераdlnetwork объектСеть кодера/декодера, возвращаемая как dlnetwork(Панель инструментов глубокого обучения).
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.