Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

blockedNetwork

反復ブロック構造をもつネットワークの作成

説明

net = blockedNetwork(fun,numBlocks) は、逐次結合層のブロック numBlocks 個からなる未初期化ネットワーク net を作成します。複数の層からなる各ブロックは、関数 fun により作成されます。

この関数には Deep Learning Toolbox™ が必要です。

net = blockedNetwork(fun,numBlocks,'NamePrefix',namePrefix) は、ネットワーク内のすべての層の名前に接頭辞 namePrefix を追加します。

すべて折りたたむ

層の配列を作成する関数を定義します。最初のブロックは、畳み込み層に 32 個のフィルターをもちます。連続するブロックごとにフィルターの数が倍になります。

unetBlock = @(block) [
    convolution2dLayer(3,2^(5+block))
    reluLayer
    convolution2dLayer(3,2^(5+block))
    reluLayer
    maxPooling2dLayer(2,"Stride",2)];

複数の層を含む 4 つの反復するブロックからなるネットワークを作成します。ネットワーク内のすべての層の名前に接頭辞 "encoder_" を追加します。

net = blockedNetwork(unetBlock,4,"NamePrefix","encoder_")
net = 
  dlnetwork with properties:

         Layers: [20x1 nnet.cnn.layer.Layer]
    Connections: [19x2 table]
     Learnables: [16x3 table]
          State: [0x3 table]
     InputNames: {'encoder_Block1Layer1'}
    OutputNames: {'encoder_Block4Layer5'}
    Initialized: 0

サイズが [224 224 3] の入力用のネットワークの重みを初期化します。

net = initialize(net,dlarray(zeros(224,224,3),"SSC"));

ネットワークを表示します。

analyzeNetwork(net)

事前学習済みの GoogLeNet ネットワークから、4 つのダウンサンプリング操作をもつ GAN 符号化器ネットワークを作成します。

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);

復号化器ブロック内のチャネル数を、各活性化の 3 番目のチャネルの長さとして決定します。

numChannels = cellfun(@(x) size(extractdata(x),3),exampleOutput);
numChannels = fliplr(numChannels(1:end-1));

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)

入力引数

すべて折りたたむ

層のブロックを作成する関数。次のシグネチャをもつ関数として指定します。

block = fun(blockIndex)

  • fun および blockIndex への入力は、範囲 [1, numBlocks] の整数です。

  • fun および block からの出力は、層または層配列です。

ネットワーク内のブロック数。正の整数として指定します。

ネットワーク内のすべての層の接頭辞。string または文字ベクトルとして指定します。

データ型: char | string

出力引数

すべて折りたたむ

反復ブロック構造をもつネットワーク。dlnetwork (Deep Learning Toolbox) オブジェクトとして返されます。

ヒント

  • blockedNetwork によって返される dlnetwork (Deep Learning Toolbox) は初期化されていないため、学習や推定に使用できる状態ではありません。ネットワークを初期化するには、関数 initialize (Deep Learning Toolbox) を使用します。

  • 関数 encoderDecoderNetwork を使用して符号化器ネットワークを復号化器ネットワークに接続します。

R2021a で導入