Sdílet prostřednictvím


Konvoluce

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() vypočítá konvoluci matice hmotnosti s obrázkem nebo tensorem. Tato operace se používá v aplikacích pro zpracování obrázků a zpracování jazyka. Podporuje všechny rozměry, krokování, sdílení nebo odsazení.

Tato funkce pracuje se vstupními tensory formuláře [M1 x M2 x ... x Mn x inChannels]. To lze pochopit jako pořadí -n objekt, kde každá položka se skládá z inChannels-dimenzionální vektor. Například obrázek RGB by měl rozměry [W x H x 3], tj. [W x H]strukturu velikosti, kde každá položka (pixel) se skládá ze 3 řazené kolekce členů (všimněte si však, že formát úložiště paměti je zřetězení 3 rovin velikosti [W x H]).

Convolution() konvoluje vstup s n+1-dimenzionální filtry, kde první n dimenze jsou prostorový rozsah filtru a poslední musí být rovno inChannels. outChannels Existují filtry. Tj. pro každou výstupní pozici se vypočítá vektor dimenze outChannels . Celkový počet parametrů filtru je (M1*M2*...*Mn) * inChannels * outChannelstedy .

Convolution() má následující parametry:

  • w - konvoluční filtr váhy uložené jako matice dimenzí [outChannels, (M1*M2*...*Mn)], kde (M1*M2*...*Mn) musí být produktem dimenzí jádra, například 75 pro [5 x 5]filtr velikosti na 3 vstupní kanály.
  • input - konvoluční vstup. Tensor s rozměry [M1 x M2 x ... x Mn x inChannels].
  • kernel dimensions - rozměry filtrů včetně počtu vstupních kanálů, které jsou uvedeny jako vektor BrainScriptu. Poslední dimenze musí být rovna počtu vstupních kanálů. Například (5:5:3) pro [5 x 5] filtr na 3kanálovém vstupu.
  • mapDims - [pojmenované, volitelné, výchozí hodnota je 0] počet výstupních kanálů (=označovaných outChannels výše; stejně jako hloubka výsledné mapy funkcí). 0 znamená použití rozměru řádku w
  • stride - [pojmenované, volitelné, výchozí hodnota je 1] rozměry krokování. > Krok 1 znamená, že se vypočítávají pouze pixelové pozice, které jsou násobky hodnoty stridu. Například krok 2 povede k halvingu dimenzí. Poslední rozměr kroku, který se zarovná s počtem vstupních kanálů, musí být roven počtu vstupních kanálů.
  • sharing – [pojmenované, volitelné, výchozí hodnota je true] příznaky sdílení pro každou vstupní dimenzi
  • autoPadding - [pojmenované, volitelné, výchozí hodnota je true] příznaky pro každou vstupní dimenzi, ať už by se měla automaticky vkládat (to znamená symetricky) nebo vůbec ne. Odsazení znamená, že se konvoluční jádro použije na všechny pozice pixelů, kde se všechny pixely mimo oblast předpokládají nula ("padded with zeroes"). Bez odsazení se jádra posunou jenom na pozice, kde všechny vstupy do jádra stále spadají do oblasti. V tomto případě bude výstupní dimenze menší než vstupní dimenze. Poslední hodnota, která se zařadí s počtem vstupních kanálů, musí být false.
  • lowerPad - [pojmenované, volitelné, výchozí hodnota je 0] přesné dolní odsazení pro každou vstupní dimenzi.
  • upperPad - [pojmenované, volitelné, výchozí hodnota je 0] přesné horní odsazení pro každou vstupní dimenzi.
  • maxTempMemSizeInSamples - [pojmenované volitelné] maximální množství pomocné paměti (v vzorcích), která by měla být vyhrazena k provádění konvolučních operací. Některé konvoluční moduly (např. moduly založené na cuDNN a GEMM) můžou využívat pracovní prostor, protože může zlepšit výkon. Někdy to ale může vést k vyššímu využití paměti. Výchozí hodnota je 0, což znamená totéž jako vstupní vzorky.

Všechny hodnoty formuláře {...} musí být ve skutečnosti zadány jako dvojtečka oddělené sekvence hodnot, například (5:5) pro dimenze jádra. (Pokud používáte zastaralé NDLNetworkBuilder, musí být oddělené čárkami a uzavřeny { } místo toho.)

Příklad:

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

Poznámka: Pokud používáte zastaralé NDLNetworkBuilder, nemělo by v příkladu být žádné koncové .y .

Zjednodušená konvoluce 2D (pouze zastaralé NDL)

Nyní zastaralý jazyk NDL poskytuje zjednodušenou 2D variantu Convolution():

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

kde:

  • w - matice konvoluce hmotnosti, má rozměry [mapDims, kernelWidth * kernelHeight * inputChannels].
  • image - vstupní obrázek.
  • kernelWidth - šířka jádra
  • kernelHeight - výška jádra
  • mapDims - hloubka mapování výstupních funkcí (počet výstupních kanálů)
  • horizontalStride - krok ve vodorovném směru
  • verticalStride - strid ve svislém směru
  • zeroPadding - [pojmenované volitelné] určuje, zda mají být strany obrázku vycpané s nulami. Výchozí hodnota je false.
  • maxTempMemSizeInSamples - [pojmenované volitelné] maximální množství pomocné paměti (v vzorcích), která by měla být vyhrazena k provádění konvolučních operací. Některé konvoluční moduly (např. moduly založené na cuDNN a GEMM) můžou využívat pracovní prostor, protože může zlepšit výkon. Někdy to ale může vést k vyššímu využití paměti. Výchozí hodnota je 0, což znamená totéž jako vstupní vzorky.
  • imageLayout - [pojmenované volitelné] formát úložiště každého obrázku. Toto je starší možnost. Ve výchozím nastavení je HWCto , což znamená, že každý obrázek je uložený jako [channel, width, height] ve sloupci hlavní. Pokud k urychlení trénování použijete cuDNN, měli byste ho nastavit na cudnn, což znamená, že každý obrázek je uložený jako [width, height, channel]. Všimněte si, že cudnn rozložení bude fungovat jak na GPU, tak na procesoru, takže se doporučuje ho používat ve výchozím nastavení.