メインコンテンツ

resnetLayers

(非推奨) 2 次元残差ネットワークの作成

R2021b 以降

    resnetLayers は推奨されません。代わりに関数 resnetNetwork を使用してください。詳細については、バージョン履歴を参照してください。

    説明

    lgraph = resnetLayers(inputSize,numClasses) は、inputSize で指定されたイメージ入力サイズおよび numClasses で指定されたクラス数をもつ 2 次元残差ネットワークを作成します。

    lgraph = resnetLayers(___,Name=Value) は、前述の構文に含まれるいずれかの入力引数を指定する 1 つ以上の名前と値の引数を使用して、残差ネットワークを作成します。たとえば、InitialNumFilters=32 は、最初の畳み込み層で 32 個のフィルターを指定します。

    ヒント

    事前学習済みの ResNet ニューラル ネットワークを読み込むには、関数 imagePretrainedNetwork を使用します。

    すべて折りたたむ

    残差ネットワークを作成します。

    ボトルネック アーキテクチャをもつ残差ネットワークを作成します。

    imageSize = [224 224 3];
    numClasses = 10;
    
    lgraph = resnetLayers(imageSize,numClasses)
    lgraph = 
      LayerGraph with properties:
    
         InputNames: {'input'}
        OutputNames: {'output'}
             Layers: [177x1 nnet.cnn.layer.Layer]
        Connections: [192x2 table]
    
    

    このネットワークは、ResNet-50 残差ネットワークと等価です。

    入力引数

    すべて折りたたむ

    ネットワークの入力イメージのサイズ。次のいずれかとして指定します。

    • [height, width] の形式の 2 要素ベクトル。

    • [height, width, depth] の形式の 3 要素ベクトル。ここで、depth はチャネル数です。RGB イメージの場合は depth3 に設定し、グレースケール イメージの場合は 1 を設定します。マルチスペクトル イメージおよびハイパースペクトル イメージの場合、depth をチャネル数に設定します。

    height および width の値は initialStride * poolingStride * 2D 以上でなければなりません。ここで、D はダウンサンプリング ブロックの数です。引数 InitialStride を使用して、初期ストライドを設定します。InitialPoolingLayer"none" に設定されている場合、プーリング ストライドは 1 になり、そうでない場合は 2 になります。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    イメージ分類ネットワークのクラス数。1 より大きい整数として指定します。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    名前と値の引数

    すべて展開する

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

    例: InitialFilterSize=[5,5],InitialNumFilters=32,BottleneckType="none" は、初期フィルター サイズを 5×5 ピクセルに指定し、32 個の初期フィルターと、ボトルネック コンポーネントをもたないネットワーク アーキテクチャを指定します。

    最初の層

    すべて展開する

    最初の畳み込み層のフィルター サイズ。次のいずれかとして指定します。

    • 正の整数。フィルターの高さと幅は同じになります。たとえば、5 を指定すると、高さが 5、幅が 5 のフィルターが生成されます。

    • [height, width] の形式の 2 要素ベクトル。たとえば、初期フィルター サイズとして [1 5] を指定すると、高さが 1、幅が 5 のフィルターが生成されます。

    例: InitialFilterSize=[5,5]

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    最初の畳み込み層のフィルター数。正の整数として指定します。初期フィルター数は、残差ネットワークに含まれる最初の畳み込み層の出力におけるチャネル (特徴マップ) の数を決定します。

    例: InitialNumFilters=32

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    最初の畳み込み層のストライド。次として指定します。

    • 正の整数。ストライドの高さと幅は同じになります。たとえば、3 を指定すると、高さが 3、幅が 3 のストライドが生成されます。

    • [height, width] の形式の 2 要素ベクトル。たとえば、初期ストライドとして [1 2] を指定すると、高さが 1、幅が 2 のストライドが生成されます。

    ストライドは、入力を垂直方向および水平方向に走査するステップ サイズを定義します。

    例: InitialStride=[3,3]

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    最初の残差ブロックの前に使用する最初のプーリング層。次のいずれかとして指定します。

    • "max" — 最初の残差ブロックの前に最大プーリング層を使用します。詳細については、maxPooling2dLayer を参照してください。

    • "average" — 最初の残差ブロックの前に平均プーリング層を使用します。詳細については、averagePooling2dLayer を参照してください。

    • "none" — 最初の残差ブロックの前にプーリング層を使用しません。

    例: InitialPoolingLayer="average"

    データ型: char | string

    ネットワーク アーキテクチャ

    すべて展開する

    残差ブロックのタイプ。次のいずれかとして指定します。

    • "batchnorm-before-add" — 残差ブロックの加算層の前にバッチ正規化層を追加します[1]

    • "batchnorm-after-add" — 残差ブロックの加算層の後にバッチ正規化層を追加します[2]

    引数 ResidualBlockType は、標準残差ブロックおよびダウンサンプリング残差ブロックにおけるバッチ正規化層の位置を指定します。詳細については、詳細を参照してください。

    例: ResidualBlockType="batchnorm-after-add"

    データ型: char | string

    ブロックのボトルネックのタイプ。次のいずれかとして指定します。

    • "downsample-first-conv" — ダウンサンプリング残差ブロックの最初の畳み込み層でダウンサンプリングを実行するボトルネック残差ブロックを使用します。ストライドは 2 を使用します。ボトルネック残差ブロックは、チャネルの次元をダウンサンプリングするための 1 行 1 列の層、3 行 3 列の畳み込み層、およびチャネルの次元をアップサンプリングするための 1 行 1 列の層の 3 つの畳み込み層で構成されています。

      最後の畳み込み層におけるフィルター数は、最初の 2 つの畳み込み層におけるフィルター数の 4 倍になります。詳細については、NumFilters を参照してください。

    • "none" — ボトルネック残差ブロックを使用しません。残差ブロックは、2 つの 3 行 3 列の畳み込み層で構成されています。

    ボトルネック残差ブロックは、3 行 3 列の畳み込みの前に 1 行 1 列の畳み込みを実行し、チャネル数を 4 分の 1 に減らします。ボトルネック ブロックがあるネットワークとボトルネック ブロックがないネットワークの計算量は同程度ですが、残差結合で伝播される特徴の合計数は、ボトルネック ユニットを使用する場合の方が 4 倍多くなります。そのため、ボトルネックを使用するとネットワークの効率が向上します[1]。各残差ブロックの層の詳細については、詳細を参照してください。

    例: BottleneckType="none"

    データ型: char | string

    各スタックに含まれる残差ブロックの数。正の整数のベクトルとして指定します。たとえば、スタックの深さが [3 4 6 3] の場合、ネットワークには、それぞれ 3 つのブロック、4 つのブロック、6 つのブロック、3 つのブロックから成る 4 つのスタックが含まれます。

    引数 NumFilters を使用して、各スタックの畳み込み層のフィルターの数を指定します。StackDepth の値には、NumFilters の値と同じ数の要素が含まれていなければなりません。

    例: StackDepth=[9 12 69 9]

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    各スタックに含まれる畳み込み層のフィルターの数。正の整数のベクトルとして指定します。

    • BottleneckType"downsample-first-conv" に設定した場合、各スタックの各ブロックに含まれる最初の 2 つの畳み込み層には、いずれも NumFilters の値で設定された数のフィルターが含まれています。最後の畳み込み層は、最初の 2 つの畳み込み層の 4 倍の数のフィルターをもちます。

      たとえば、NumFilters[4 5] に設定し、BottleneckType"downsample-first-conv" に設定したとします。最初のスタックでは、各ブロックに含まれる最初の 2 つの畳み込み層は 4 つのフィルターをもち、各ブロックに含まれる最後の畳み込み層は 16 個のフィルターをもちます。2 番目のスタックでは、各ブロックに含まれる最初の 2 つの畳み込み層は 5 つのフィルターをもち、最後の畳み込み層は 20 個のフィルターをもちます。

    • BottleneckType"none" に設定した場合、各スタックに含まれる畳み込み層には、NumFilters の値で設定された数のフィルターが含まれています。

    NumFilters の値には、StackDepth の値と同じ数の要素が含まれていなければなりません。

    NumFilters の値は、最初の残差ブロックに含まれる残差結合上の層を決定します。次のいずれかの条件が満たされた場合、残差結合上に畳み込み層が存在します。

    • BottleneckType="downsample-first-conv" (既定) および InitialNumFilters が、NumFilters に含まれる最初の要素数の 4 倍に等しくない。

    • BottleneckType="none" および InitialNumFilters が、NumFilters に含まれる最初の要素に等しくない。

    各残差ブロックの層の詳細については、詳細を参照してください。

    例: NumFilters=[32 64 126 256]

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    データが入力層を通じて順伝播されるたびに適用するデータ正規化。次のいずれかとして指定します。

    • "zerocenter" — 平均を減算します。この平均は学習時に計算されます。

    • "zscore" — 平均値を減算し、標準偏差で除算します。この平均と標準偏差は学習時に計算されます。

    例: Normalization="zscore"

    データ型: char | string

    出力引数

    すべて折りたたむ

    残差ネットワーク。layerGraph オブジェクトとして返されます。

    詳細

    すべて折りたたむ

    ヒント

    • 小さなイメージを扱うには、InitialPoolingLayer オプションを "none" に設定し、初期プーリング層を削除してダウンサンプリングの量を減らします。

    • 残差ネットワークには、通常、ResNet-"X" という名前が付けられています。ここで、"X" はネットワークの "深さ" です。ネットワークの深さは、入力層から出力層までのパスにある逐次畳み込み層または全結合層の最大数として定義されます。ネットワークの深さを計算するには、次の式を使用します。

      depth = {1+2i=1Nsi+1       If no bottleneck1+3i=1Nsi+1            If bottleneck     ,

      ここで、si はスタック i の深さです。

      深さが同じネットワークに異なるネットワーク アーキテクチャを使用できます。たとえば、ボトルネックをもつ (またはもたない) ResNet-14 アーキテクチャを作成できます。

      resnet14Bottleneck = resnetLayers([224 224 3],10, ...
      StackDepth=[2 2], ...
      NumFilters=[64 128]);
      
      resnet14NoBottleneck = resnetLayers([224 224 3],10, ...
      BottleneckType="none", ...
      StackDepth=[2 2 2], ...
      NumFilters=[64 128 256]);
      ボトルネック アーキテクチャと非ボトルネック アーキテクチャの間の関係は、ボトルネックをもつネットワークとボトルネックをもたないネットワークの深さの違いにも現れています。
      resnet50Bottleneck = resnetLayers([224 224 3],10);
      
      resnet34NoBottleneck = resnetLayers([224 224 3],10, ... 
      BottleneckType="none");
      

    参照

    [1] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. “Deep Residual Learning for Image Recognition.” Preprint, submitted December 10, 2015. https://arxiv.org/abs/1512.03385.

    [2] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. “Identity Mappings in Deep Residual Networks.” Preprint, submitted July 25, 2016. https://arxiv.org/abs/1603.05027.

    [3] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." In Proceedings of the 2015 IEEE International Conference on Computer Vision, 1026–1034. Washington, DC: IEEE Computer Vision Society, 2015.

    拡張機能

    すべて展開する

    バージョン履歴

    R2021b で導入

    すべて折りたたむ