Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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říklad75pro[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ýchoutChannelsvýše; stejně jako hloubka výsledné mapy funkcí). 0 znamená použití rozměru řádkuwstride- [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í dimenziautoPadding- [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ýtfalse.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ádrakernelHeight- výška jádramapDims- hloubka mapování výstupních funkcí (počet výstupních kanálů)horizontalStride- krok ve vodorovném směruverticalStride- strid ve svislém směruzeroPadding- [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í jeHWCto , 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 nacudnn, což znamená, že každý obrázek je uložený jako[width, height, channel]. Všimněte si, žecudnnrozložení bude fungovat jak na GPU, tak na procesoru, takže se doporučuje ho používat ve výchozím nastavení.