次の方法で共有


畳み込み

Convolution (w, input,
             {kernel dimensions}, 
             mapDims = {map dimensions}, 
             stride = {stride dimensions}, 
             sharing = {sharing flags},
             autoPadding = {padding flags (boolean)},
             lowerPad = {lower padding (int)},
             upperPad = {upper padding (int)},
             maxTempMemSizeInSamples = 0)

Convolution() は、画像またはテンソルを含む重み行列の畳み込みを計算します。 この操作は、画像処理アプリケーションと言語処理で使用されます。 任意のディメンション、ストライド、共有、またはパディングをサポートします。

この関数は、フォーム [M1 x M2 x ... x Mn x inChannels]の入力テンソルに対して動作します。 これは、各エントリが -次元ベクトルで構成される inChannelsrank-n オブジェクトとして理解できます。 たとえば、RGB イメージには次元 [W x H x 3](つまり [W x H]、サイズが大きい構造体) があり、各エントリ (ピクセル) は 3 タプルで構成されます (ただし、メモリストレージ形式は 3 つのサイズ [W x H]の平面の連結であることに注意してください)。

Convolution() 入力を -dimension フィルターで n+1結合します。最初 n の次元はフィルターの空間範囲であり、最後の次元は等しい inChannels必要があります。 フィルターがあります outChannels 。 つまり、出力位置ごとに、次元 outChannels のベクトルが計算されます。 そのため、フィルター パラメーターの合計数は (M1*M2*...*Mn) * inChannels * outChannels.

Convolution() には、次のパラメーターがあります。

  • w- 畳み込みフィルターの重み。ディメンション[outChannels, (M1*M2*...*Mn)](M1*M2*...*Mn)のマトリックスとして格納されます。3 つの入力チャネルのサイズのフィルターの場合など 75[5 x 5]、カーネルディメンションの積である必要があります。
  • input - 畳み込み入力。 寸法 [M1 x M2 x ... x Mn x inChannels]を持つテンソル。
  • kernel dimensions - BrainScript ベクターとして指定された入力チャネルの数を 含む フィルターの次元。 最後のディメンションは、入力チャネルの数と等しい必要があります。 (5:5:3)[5 x 5]たとえば、3 チャネル入力のフィルターの場合などです。
  • mapDims - [名前付き、省略可能、既定値は 0] 出力チャネルの数 (上記と呼ばれます outChannels 。結果のフィーチャ マップの深さと同じです)。 0 は、次の行ディメンションを使用します。 w
  • stride - [名前付き、省略可能、既定値は 1] ストライド ディメンション。 ストライド 1 は、ストライド > 値の倍数であるピクセル位置のみが計算されることを意味します。 たとえば、ストライドが 2 の場合、ディメンションが半分になります。 入力チャネルの数に合わせて並ぶ最後のストライド ディメンションは、入力チャネルの数と等しい必要があります。
  • sharing - [名前付き、省略可能、既定値は true] 各入力ディメンションの共有フラグ
  • autoPadding - 入力ディメンションが自動的に埋め込まれるか (対称的に) 埋め込まれる必要があるかどうかに関係なく、各入力ディメンションの [名前付き、省略可能、既定値は true] フラグ。 パディングとは、畳み込みカーネルがすべてのピクセル位置に適用されることを意味します。この場合、領域の外側のすべてのピクセルは 0 ("ゼロで埋め込まれる") と見なされます。 パディングがない場合、カーネルは、カーネルへのすべての入力がまだ領域内にある位置にのみシフトされます。 この場合、出力ディメンションは入力ディメンションより小さくなります。 入力チャネルの数に合わせて並ぶ最後の値を指定 falseする必要があります。
  • lowerPad - [named, optional, default is 0] precise lower padding for each input dimension.
  • upperPad - [名前付き、省略可能、既定値は 0] 各入力ディメンションの正確な上余白。
  • maxTempMemSizeInSamples - [名前付き省略可能] 畳み込み操作を実行するために予約する必要がある補助メモリの最大量 (サンプル)。 一部の畳み込みエンジン (cuDNN や GEMM ベースのエンジンなど) では、パフォーマンスが向上する可能性があるため、ワークスペースを使用するとメリットが得られます。 ただし、メモリ使用率が高くなる場合があります。 既定値は 0 です。これは、入力サンプルと同じであることを意味します。

フォーム {...} のすべての値は、実際には、カーネル ディメンションなど (5:5) 、コロンで区切られた値のシーケンスとして指定する必要があります。 (非推奨 NDLNetworkBuilderを使用する場合は、コンマ区切りで囲む { } 必要があります)。

例:

ConvReLULayer(inp, outMap, inMap, kW, kH, hStride, vStride, wScale, bValue) =
[
    W = Parameter (outMap, inMap * kW * kH, init="gaussian", initValueScale=wScale)
    b = Parameter (outMap, 1, init="fixedValue", value=bValue)
    c = Convolution (W, inp, (kW:kH:inMap), stride=(hStride:vStride:inMap), autoPadding=(true:true:false))
    y = RectifiedLinear (c + b)
].y

注: 非推奨 NDLNetworkBuilderを使用している場合は、この例の末尾 .y は表示されません。

簡略化された 2D 畳み込み (非推奨の NDL のみ)

非推奨になった NDL 言語では、次の簡略化された 2D バリアント Convolution()が提供されました。

Convolution (w, image, 
             kernelWidth, kernelHeight, mapDims, 
             horizontalStride, verticalStride,
             zeroPadding=false, maxTempMemSizeInSamples=0, imageLayout="cudnn" /* or "HWC"*/ )

各値の説明:

  • w - 畳み込み重み行列、それはの [mapDims, kernelWidth * kernelHeight * inputChannels]寸法を有する。
  • image - 入力イメージ。
  • kernelWidth - カーネルの幅
  • kernelHeight - カーネルの高さ
  • mapDims - 出力機能マップの深さ (出力チャネルの数)
  • horizontalStride - 水平方向のストライド
  • verticalStride - 垂直方向のストライド
  • zeroPadding - [named optional] は、イメージの側面にゼロを埋め込むかどうかを指定します。 既定値は false です。
  • maxTempMemSizeInSamples - [名前付き省略可能] 畳み込み操作を実行するために予約する必要がある補助メモリの最大量 (サンプル)。 一部の畳み込みエンジン (cuDNN や GEMM ベースのエンジンなど) では、パフォーマンスが向上する可能性があるため、ワークスペースを使用するとメリットが得られます。 ただし、メモリ使用率が高くなる場合があります。 既定値は 0 です。これは、入力サンプルと同じであることを意味します。
  • imageLayout - [名前付き省略可能] 各イメージのストレージ形式。 これは従来のオプションです。 既定では、 HWC各イメージは列メジャーとして [channel, width, height] 格納されます。 cuDNN を使用してトレーニングを高速化する場合は、設定する cudnn必要があります。つまり、各イメージは次のように [width, height, channel]格納されます。 レイアウトは cudnn GPU と CPU の両方で動作するため、既定で使用することをお勧めします。