Udostępnij za pośrednictwem


Konwolucja

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() oblicza konwolucję macierzy wagi z obrazem lub tensorem. Ta operacja jest używana w aplikacjach przetwarzania obrazów i przetwarzaniu języka. Obsługuje on wszelkie wymiary, krok, udostępnianie lub dopełnianie.

Ta funkcja działa na wejściowych tensorach formularza [M1 x M2 x ... x Mn x inChannels]. Można to zrozumieć jako obiekt rangin , w którym każdy wpis składa się z -wymiarowego inChannelswektora. Na przykład obraz RGB będzie miał wymiary [W x H x 3], tj. [W x H]strukturę wielkości, w której każdy wpis (piksel) składa się z 3 krotki (należy jednak pamiętać, że format magazynu pamięci jest łączeniem 3 płaszczyzn rozmiaru [W x H]).

Convolution() Wartość wejściowa z filtrami n+1wymiarowymi, gdzie pierwsze n wymiary są zakresem przestrzennym filtru, a ostatni musi być równy inChannels. outChannels Istnieją filtry. Tj. dla każdej pozycji wyjściowej obliczany jest wektor wymiaru outChannels . W związku z tym całkowita liczba parametrów filtru to (M1*M2*...*Mn) * inChannels * outChannels.

Convolution() ma następujące parametry:

  • w - wagi filtrów konwolucji przechowywane jako macierz wymiarów [outChannels, (M1*M2*...*Mn)], gdzie (M1*M2*...*Mn) muszą być produktem wymiarów jądra, np. 75 dla [5 x 5]filtru o rozmiarze -size w 3 kanałach wejściowych.
  • input - wejście konwolucyjne. Tensor z wymiarami [M1 x M2 x ... x Mn x inChannels].
  • kernel dimensions - wymiary filtrów , w tym liczbę kanałów wejściowych, podane jako wektor BrainScript. Ostatni wymiar musi być równy liczbie kanałów wejściowych. Na przykład (5:5:3) w przypadku filtru na wejściu [5 x 5] 3-kanałowym.
  • mapDims - [nazwane, opcjonalne, wartość domyślna to 0] liczba kanałów wyjściowych (=wywoływana outChannels powyżej; taka sama jak głębokość wynikowej mapy funkcji). 0 oznacza użycie wymiaru wiersza w
  • stride - [nazwane, opcjonalne, domyślne to 1] wymiary krokowe. Krok > 1 oznacza, że obliczane są tylko pozycje pikseli, które są wielokrotnościami wartości kroków. Na przykład krok 2 doprowadzi do o połowę wymiarów. Ostatni wymiar, który jest zgodny z liczbą kanałów wejściowych, musi być równy liczbie kanałów wejściowych.
  • sharing - [nazwane, opcjonalne, domyślne jest prawdziwe] flagi udostępniania dla każdego wymiaru wejściowego
  • autoPadding - [nazwane, opcjonalne, domyślne] flagi dla każdego wymiaru wejściowego, czy powinny być dopełniane automatycznie (czyli symetrycznie) czy w ogóle nie są dopełnione. Wypełnienie oznacza, że jądro konwolucji jest stosowane do wszystkich pozycji pikseli, gdzie wszystkie piksele poza obszarem są zakładane zero ("dopełnione zerami"). Bez dopełniania jądra są przesuwane tylko nad pozycjami, w których wszystkie dane wejściowe do jądra nadal znajdują się wewnątrz obszaru. W takim przypadku wymiar wyjściowy będzie mniejszy niż wymiar wejściowy. Ostatnia wartość, która jest zgodna z liczbą kanałów wejściowych, musi być false.
  • lowerPad - [nazwane, opcjonalne, wartość domyślna to 0] dokładne dopełnienie dolne dla każdego wymiaru wejściowego.
  • upperPad - [nazwane, opcjonalne, domyślne jest 0] dokładne górne wypełnienie dla każdego wymiaru wejściowego.
  • maxTempMemSizeInSamples - [nazwany opcjonalnie] maksymalna ilość pamięci pomocniczej (w próbkach), która powinna być zarezerwowana do wykonywania operacji konwolucji. Niektóre silniki konwolucji (np. cuDNN i aparaty oparte na gemm) mogą korzystać z obszaru roboczego, ponieważ może poprawić wydajność. Jednak czasami może to prowadzić do wyższego wykorzystania pamięci. Wartość domyślna to 0, co oznacza to, że próbki wejściowe są takie same.

Wszystkie wartości formularza {...} muszą być rzeczywiście podane jako sekwencja rozdzielana dwukropkiem wartości, np. (5:5) dla wymiarów jądra. (Jeśli używasz przestarzałego NDLNetworkBuilderelementu , należy je rozdzielać przecinkami i zamiast nich ujęć { } ).

Przykład:

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

Uwaga: jeśli używasz przestarzałego NDLNetworkBuilderelementu , w przykładzie nie powinno być żadnych końcowych .y informacji.

Uproszczona konwolucja 2D (tylko przestarzałe NDL)

Teraz przestarzały język NDL zapewnia uproszczony wariant 2D :Convolution()

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

gdzie:

  • w - macierz wagi konwolucji, ma wymiary [mapDims, kernelWidth * kernelHeight * inputChannels].
  • image — obraz wejściowy.
  • kernelWidth - szerokość jądra
  • kernelHeight - wysokość jądra
  • mapDims — głębokość mapy funkcji wyjściowych (liczba kanałów wyjściowych)
  • horizontalStride - krok w kierunku poziomym
  • verticalStride - krok w kierunku pionowym
  • zeroPadding - [nazwane opcjonalnie] określa, czy boki obrazu powinny być dopełniane zerami. Wartość domyślna to false.
  • maxTempMemSizeInSamples - [nazwany opcjonalnie] maksymalna ilość pamięci pomocniczej (w próbkach), która powinna być zarezerwowana do wykonywania operacji konwolucji. Niektóre silniki konwolucji (np. cuDNN i aparaty oparte na gemm) mogą korzystać z obszaru roboczego, ponieważ może poprawić wydajność. Jednak czasami może to prowadzić do wyższego wykorzystania pamięci. Wartość domyślna to 0, co oznacza to, że próbki wejściowe są takie same.
  • imageLayout - [nazwany opcjonalnie] format przechowywania każdego obrazu. Jest to starsza opcja. Domyślnie jest to HWCwartość , co oznacza, że każdy obraz jest przechowywany jako [channel, width, height] główny kolumny. Jeśli używasz cuDNN do przyspieszenia trenowania, należy ustawić go na cudnn, co oznacza, że każdy obraz jest przechowywany jako [width, height, channel]. Należy pamiętać, że cudnn układ będzie działać zarówno na procesorze GPU, jak i na procesorze CPU, dlatego zaleca się użycie go domyślnie.