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] 的輸入張量上運作。 這可以理解為 rank- n 物件,其中每個專案都包含一個 inChannels 維度向量。
例如,RGB 影像會有維度 [W x H x 3] ,亦即 [W x H] 大小為的結構,其中每個專案 (圖元) 是由 3 元組 (附注所組成,不過,記憶體儲存體格式是大小 [W x H]) 3 個平面的串連。
Convolution() 使用 n+1 維度篩選來捲動輸入,其中第一 n 個維度是篩選的空間範圍,最後一個維度必須等於 inChannels 。 有 outChannels 篩選準則。 亦即,針對每個輸出位置,會計算維度 outChannels 的向量。 因此,篩選參數的總數是 (M1*M2*...*Mn) * inChannels * outChannels 。
Convolution() 具有下列參數:
w- 卷積篩選權數,儲存為維度[outChannels, (M1*M2*...*Mn)]的矩陣,其中(M1*M2*...*Mn)必須是核心維度的乘積,例如75,針對 3 個[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 表示使用 的資料列維度wstride- [具名,選擇性,預設值為 1] 個進階維度。 十分 > 1 表示只會計算十分數值倍數的圖元位置。 例如,2 的步幅會導致維度變半。 最後一個與輸入通道數目相等的進位維度必須等於輸入通道的數目。sharing- [具名,選擇性,預設值為 true] 每個輸入維度的共用旗標autoPadding- [具名、選擇性、預設值為 true] 每個輸入維度的旗標,不論它是否應該自動填補 (,也就是對稱式) 或完全未填補。 填補表示卷積核心會套用至所有圖元位置,其中區域以外的所有圖元都假設為零 (「以零填補」) 。 若未填補,核心只會移轉至核心的所有輸入仍落在區域內的位置。 在此情況下,輸出維度會小於輸入維度。 與輸入通道數目一行的最後一個值必須是false。lowerPad- [具名,選擇性,預設值為 0] 每個輸入維度的精確下限填補。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- [具名選擇性] 指定影像側邊是否應該以零填補。 預設值為 false。maxTempMemSizeInSamples- [具名選擇性] 範例中應保留來執行卷積作業的樣本中輔助記憶體 (數量上限) 。 某些卷積引擎 (例如 cuDNN 和 GEMM 型引擎,) 可以受益于使用工作區,因為它可能會改善效能。 不過,有時候這可能會導致較高的記憶體使用率。 預設值為 0,這表示與輸入範例相同。imageLayout- [具名選擇性] 每個影像的儲存格式。 這是舊版選項。 根據預設,HWC它是 ,這表示每個影像會儲存為[channel, width, height]資料行主要。 如果您使用 cuDNN 來加速定型,您應該將其cudnn設定為 ,這表示每個影像都會儲存為[width, height, channel]。 請注意,配置cudnn會在 GPU 和 CPU 上運作,因此建議預設使用。