Delen via


Convolutie

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() berekent de convolutie van een gewichtsmatrix met een afbeelding of tensor. Deze bewerking wordt gebruikt in toepassingen en taalverwerking van afbeeldingen. Het ondersteunt alle dimensies, stride, delen of opvulling.

Deze functie werkt op invoert tensoren van het formulier [M1 x M2 x ... x Mn x inChannels]. Dit kan worden begrepen als een rangschikkingsobjectn , waarbij elke vermelding bestaat uit een inChannels-dimensionale vector. Een RGB-afbeelding zou bijvoorbeeld dimensies hebben, d.w.w.v [W x H x 3]. een [W x H]structuur van -grootte, waarbij elke vermelding (pixel) bestaat uit een 3-tuple (let op: de indeling voor geheugenopslag is echter de samenvoeging van 3 vlakken van grootte [W x H]).

Convolution() voegt de invoer samen met n+1-dimensionale filters, waarbij de eerste n dimensies de ruimtelijke omvang van het filter zijn en de laatste moet gelijk zijn aan inChannels. Er zijn outChannels filters. Voor elke uitvoerpositie wordt een dimensievector outChannels berekend. Daarom is (M1*M2*...*Mn) * inChannels * outChannelshet totale aantal filterparameters.

Convolution() heeft de volgende parameters:

  • w - convolutiefiltergewichten, opgeslagen als matrix van dimensies [outChannels, (M1*M2*...*Mn)], waarbij (M1*M2*...*Mn) het product van de kerneldimensies moet zijn, bijvoorbeeld 75 voor een [5 x 5]filter van grootte op drie invoerkanalen.
  • input - invoer voor convolution. Een tensor met dimensies [M1 x M2 x ... x Mn x inChannels].
  • kernel dimensions - dimensies van de filters , inclusief het aantal invoerkanalen, gegeven als een BrainScript-vector. De laatste dimensie moet gelijk zijn aan het aantal invoerkanalen. (5:5:3) Bijvoorbeeld voor een [5 x 5] filter op een invoer van 3 kanalen.
  • mapDims - [benoemd, optioneel, standaard is 0] aantal uitvoerkanalen (=genoemd outChannels hierboven; hetzelfde als de diepte van de resulterende functiekaart). 0 betekent dat de rijdimensie van w
  • stride - [benoemd, optioneel, standaardwaarde is 1] stride dimensies. Een stride > 1 betekent dat alleen pixelposities die veelvouden van de stride-waarde zijn, worden berekend. Een stride van 2 leidt bijvoorbeeld tot een halvering van de afmetingen. De laatste regeldimensie die overeenkomt met het aantal invoerkanalen moet gelijk zijn aan het aantal invoerkanalen.
  • sharing - [benoemd, optioneel, standaardwaarde is waar] deelvlagmen voor elke invoerdimensie
  • autoPadding - [benoemd, optioneel, standaardwaarde is waar] vlaggen voor elke invoerdimensie, ongeacht of deze automatisch moet worden opgevuld (dat wil gezegd symmetrisch) of helemaal niet worden opgevuld. Opvulling betekent dat de convolutiekernel wordt toegepast op alle pixelposities, waarbij alle pixels buiten het gebied worden uitgegaan van nul ('opgevuld met nullen'). Zonder opvulling worden de kernels alleen over posities verplaatst waar alle invoer naar de kernel nog steeds binnen het gebied valt. In dit geval is de uitvoerdimensie kleiner dan de invoerdimensie. De laatste waarde die wordt opgelijnd met het aantal invoerkanalen moet zijn false.
  • lowerPad - [benoemd, optioneel, standaardwaarde is 0] nauwkeurige lagere opvulling voor elke invoerdimensie.
  • upperPad - [benoemd, optioneel, standaardwaarde is 0] nauwkeurige bovenste opvulling voor elke invoerdimensie.
  • maxTempMemSizeInSamples - [benoemd optioneel] maximale hoeveelheid hulpgeheugen (in steekproeven) die moet worden gereserveerd voor het uitvoeren van convolutiebewerkingen. Sommige convolutie-engines (bijvoorbeeld cuDNN- en GEMM-engines) kunnen profiteren van het gebruik van werkruimte, omdat deze de prestaties kan verbeteren. Soms kan dit echter leiden tot een hoger geheugengebruik. De standaardwaarde is 0, wat hetzelfde betekent als de invoervoorbeelden.

Alle waarden van het formulier {...} moeten daadwerkelijk worden opgegeven als een door dubbele punt gescheiden reeks waarden, bijvoorbeeld (5:5) voor de kerneldimensies. (Als u de afgeschafte NDLNetworkBuilderwaarden gebruikt, moeten deze in plaats daarvan door komma's worden gescheiden en ingesloten { } .)

Voorbeeld:

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

Opmerking: Als u de afgeschafte NDLNetworkBuildergebruikt, moet het voorbeeld niet worden gevolgd .y .

Vereenvoudigde 2D-convolutie (alleen afgeschafte NDL)

De nu afgeschafte NDL-taal heeft een vereenvoudigde 2D-variant van Convolution():

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

Hierbij

  • w - convolution gewichtsmatrix, het heeft de afmetingen van [mapDims, kernelWidth * kernelHeight * inputChannels].
  • image - de invoerafbeelding.
  • kernelWidth - breedte van de kernel
  • kernelHeight - hoogte van de kernel
  • mapDims - diepte van de toewijzing van uitvoerfuncties (aantal uitvoerkanalen)
  • horizontalStride - stride in horizontale richting
  • verticalStride - stride in verticale richting
  • zeroPadding - [benoemd optioneel] geeft aan of de zijkanten van de afbeelding moeten worden opgevuld met nullen. De standaardinstelling is onwaar.
  • maxTempMemSizeInSamples - [benoemd optioneel] maximale hoeveelheid hulpgeheugen (in steekproeven) die moet worden gereserveerd voor het uitvoeren van convolutiebewerkingen. Sommige convolutie-engines (bijvoorbeeld cuDNN- en GEMM-engines) kunnen profiteren van het gebruik van werkruimte, omdat deze de prestaties kan verbeteren. Soms kan dit echter leiden tot een hoger geheugengebruik. De standaardwaarde is 0, wat hetzelfde betekent als de invoervoorbeelden.
  • imageLayout - [benoemd optioneel] de opslagindeling van elke afbeelding. Dit is een verouderde optie. Standaard is HWCdit, wat betekent dat elke afbeelding wordt opgeslagen als [channel, width, height] in kolom major. Als u cuDNN gebruikt om de training te versnellen, moet u deze instellen op cudnn, wat betekent dat elke afbeelding wordt opgeslagen als [width, height, channel]. Houd er rekening mee dat cudnn de indeling zowel op GPU als cpu werkt, zodat het wordt aanbevolen om deze standaard te gebruiken.