Tensorflow Strides-argument

Ik probeer het argument stappenin tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d te begrijpen.

De documentatiezegt herhaaldelijk

stappen: een lijst met ints met lengte >= 4. De stap van het schuifvenster voor elke dimensie van de invoertensor.

Mijn vragen zijn:

  1. Wat stellen elk van de 4+ gehele getallen voor?
  2. Waarom moeten ze strides[0] = strides[3] = 1 hebben voor convnets?
  3. In dit voorbeeld we zien tf.reshape(_X,shape=[-1, 28, 28, 1]). Waarom -1?

Helaas vertalen de voorbeelden in de documenten voor het omvormen met -1 zich niet zo goed naar dit scenario.


Antwoord 1, autoriteit 100%

De pooling en convolutionele operaties schuiven een “venster” over de invoertensor. Gebruik tf.nn.conv2dals voorbeeld : Als de invoertensor 4 dimensies heeft: [batch, height, width, channels], dan werkt de convolutie op een 2D-venster op de dimensies height, width.

stridesbepaalt hoeveel het venster verschuift in elk van de dimensies. Het typische gebruik stelt de eerste (de batch) en laatste (de diepte) stap in op 1.

Laten we een heel concreet voorbeeld gebruiken: een 2-d convolutie uitvoeren over een 32×32 grijswaardeninvoerafbeelding. Ik zeg grijswaarden omdat de invoerafbeelding dan diepte=1 heeft, wat helpt om het simpel te houden. Laat die afbeelding er als volgt uitzien:

00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...

Laten we een 2×2 convolutievenster uitvoeren over een enkel voorbeeld (batchgrootte = 1). We geven de convolutie een uitgangskanaaldiepte van 8.

De invoer voor de convolutie heeft shape=[1, 32, 32, 1].

Als u strides=[1,1,1,1]opgeeft met padding=SAME, dan is de uitvoer van het filter [1, 32, 32 , 8].

Het filter maakt eerst een uitvoer voor:

F(00 01
  10 11)

En dan voor:

F(01 02
  11 12)

en ga zo maar door. Daarna gaat het naar de tweede rij en berekent:

F(10, 11
  20, 21)

dan

F(11, 12
  21, 22)

Als je een stap van [1, 2, 2, 1] opgeeft, worden er geen overlappende vensters gemaakt. Het berekent:

F(00, 01
  10, 11)

en dan

F(02, 03
  12, 13)

De stride werkt op dezelfde manier voor de pooling-operators.

Vraag 2: Waarom stappen [1, x, y, 1] voor convnets

De eerste 1 is de batch: u wilt meestal geen voorbeelden in uw batch overslaan, of u had ze in de eerste plaats niet moeten opnemen. 🙂

De laatste 1 is de diepte van de convolutie: om dezelfde reden wil je meestal geen invoer overslaan.

De conv2d-operator is algemener, dus u zouconvoluties kunnen maken die het venster langs andere dimensies schuiven, maar dat is geen typisch gebruik in convnets. Het typische gebruik is om ze ruimtelijk te gebruiken.

Waarom de vorm omvormen naar -1-1 is een tijdelijke aanduiding die zegt: “pas zo nodig aan om overeen te komen met de grootte die nodig is voor de volledige tensor.” Het is een manier om de code onafhankelijk te maken van de ingevoerde batchgrootte, zodat u uw pijplijn kunt wijzigen en niet overal in de code de batchgrootte hoeft aan te passen.


Antwoord 2, autoriteit 8%

De invoer is 4-dimensionaal en heeft de volgende vorm: [batch_size, image_rows, image_cols, number_of_colors]

Strides definiëren in het algemeen een overlap tussen het toepassen van bewerkingen. In het geval van conv2d specificeert het wat de afstand is tussen opeenvolgende toepassingen van convolutionele filters. De waarde van 1 in een specifieke dimensie betekent dat we de operator toepassen op elke rij/kolom, de waarde van 2 betekent elke seconde, enzovoort.

Ad 1)De waarden die van belang zijn voor windingen zijn 2e en 3e en ze vertegenwoordigen de overlap in de toepassing van de convolutiefilters langs rijen en kolommen. De waarde van [1, 2, 2, 1] zegt dat we de filters op elke tweede rij en kolom willen toepassen.

Ad 2)Ik ken de technische beperkingen niet (misschien een CuDNN-vereiste), maar mensen gebruiken meestal stappen langs de rij- of kolomdimensies. Het heeft niet per se zin om het over batchgrootte te doen. Niet zeker van de
laatste dimensie.

Ad 3)Instelling -1 voor een van de dimensies betekent: “stel de waarde voor de eerste dimensie zo in dat het totale aantal elementen in de tensor ongewijzigd blijft”. In ons geval is de -1 gelijk aan de batch_size.


Antwoord 3, autoriteit 5%

Laten we beginnen met wat stride doet in 1-dim geval.

Laten we aannemen dat uw input = [1, 0, 2, 3, 0, 1, 1]en kernel = [2, 1, 3]het resultaat van de convolutie is [8, 11, 7, 9, 4], die wordt berekend door je kernel over de invoer te schuiven, elementgewijze vermenigvuldiging uit te voeren en alles op te tellen. Zoals dit:

  • 8 = 1 * 2 + 0 * 1 + 2 * 3
  • 11 = 0 * 2 + 2 * 1 + 3 * 3
  • 7 = 2 * 2 + 3 * 1 + 0 * 3
  • 9 = 3 * 2 + 0 * 1 + 1 * 3
  • 4 = 0 * 2 + 1 * 1 + 1 * 3

Hier schuiven we één element naar voren, maar niets houdt u tegen om een ​​ander nummer te gebruiken. Dit nummer is uw pas. Je kunt het zien als een downsampling van het resultaat van de 1-staps convolutie door gewoon elk s-de resultaat te nemen.

Als je de invoergrootte i, kernelgrootte k, stride sen padding pkent, kun je gemakkelijk berekenen de uitvoergrootte van de convolutie als:

voer hier de afbeeldingsbeschrijving in

Hier || operator betekent plafondbediening. Voor een poollaag s = 1.


N-gedimde behuizing.

Als je de wiskunde kent voor een 1-dim case, is n-dim case gemakkelijk als je eenmaal ziet dat elke dim onafhankelijk is. Je schuift dus gewoon elke dimensie apart. Hier is een voorbeeld voor 2- d. Merk op dat u niet bij alle afmetingen dezelfde pas hoeft te hebben. Dus voor een N-dim input/kernel moet je N passen geven.


Dus nu is het gemakkelijk om al je vragen te beantwoorden:

  1. Wat stellen elk van de 4+ gehele getallen voor?. conv2d, poolvertelt je dat deze lijst de stappen tussen elke dimensie vertegenwoordigt. Merk op dat de lengte van de stappenlijst hetzelfde is als de rangorde van de kerneltensor.
  2. Waarom moeten ze passen[0] = passen3= 1 voor convnets?. De eerste dimensie is batchgrootte, de laatste is kanalen. Het heeft geen zin om batch of kanaal over te slaan. Dus je maakt ze 1. Voor breedte/hoogte kun je iets overslaan en daarom is het misschien niet 1.
  3. tf.reshape(_X,shape=[-1, 28, 28, 1]). Waarom -1?tf.reshapeheeft het voor je:

    Als een vormcomponent de speciale waarde -1 is, wordt de grootte van die dimensie berekend zodat de totale grootte constant blijft. In het bijzonder wordt een vorm van [-1] afgevlakt tot 1-D. Maximaal één vormcomponent kan -1 zijn.


Antwoord 4

@dga heeft fantastisch werk geleverd door uit te leggen en ik kan niet dankbaar genoeg zijn hoe nuttig het is geweest. Op dezelfde manier wil ik mijn bevindingen delen over hoe stridewerkt in 3D-convolutie.

Volgens de TensorFlow-documentatieop conv3d, is de vorm van de invoer moet in deze volgorde zijn:

[batch, in_depth, in_height, in_width, in_channels]

Laten we de variabelen van uiterst rechts naar links uitleggen aan de hand van een voorbeeld. Ervan uitgaande dat de invoervorm is
input_shape = [1000,16,112,112,3]

input_shape[4] is the number of colour channels (RGB or whichever format it is extracted in)
input_shape[3] is the width of the image
input_shape[2] is the height of the image
input_shape[1] is the number of frames that have been lumped into 1 complete data
input_shape[0] is the number of lumped frames of images we have.

Hieronder vindt u een beknopte documentatie over hoe stride wordt gebruikt.

stappen: een lijst met ints met lengte >= 5. 1-D tensor van lengte 5.
De stap van het schuifvenster voor elke invoerdimensie. Moeten
hebben strides[0] = strides[4] = 1

Zoals in veel werken wordt aangegeven, betekenen stappen eenvoudig hoeveel stappen een venster of kernel verwijderd is van het dichtstbijzijnde element, of het nu een dataframe of een pixel is (dit wordt overigens geparafraseerd).

In de bovenstaande documentatie ziet een stap in 3D er als volgt uit: strides = (1,X,Y,Z,1) .

De documentatie benadrukt dat strides[0] = strides[4] = 1.

strides[0]=1 means that we do not want to skip any data in the batch 
strides[4]=1 means that we do not want to skip in the channel 

stappen[X] betekent hoeveel sprongen we moeten maken in de samengevoegde frames. Dus als we bijvoorbeeld 16 frames hebben, betekent X=1 elk frame gebruiken. X=2 betekent gebruik elk tweede frame en het gaat maar door

strides[y] en strides[z] volg de uitleg van @dgadus ik zal dat deel niet opnieuw doen.

In keras hoeft u echter alleen een tupel/lijst van 3 gehele getallen op te geven, waarbij u de stappen van de convolutie langs elke ruimtelijke dimensie specificeert, waarbij ruimtelijke dimensie stride[x], strides[y] en strides[z] is. strides[0] en strides[4] is al standaard ingesteld op 1.

Ik hoop dat iemand dit nuttig vindt!

Other episodes