nn.Conv2d Erklärung in Pytorch

1. Füllmodus in Pytorch nn.Con2d

Torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilatation=1, groups=1, Bias=True, padding_mode=‘zeros’, device=None, dtype=None)

1.1 Die Bedeutung von Füllparametern

Erstens ist padd = N, was bedeutet, dass N-Werte in den vier Richtungen nach oben, unten, links und rechts gefüllt werden;

Wenn beispielsweise padd = N = 1 ist, bedeutet dies, dass oben, unten, links und rechts 1 Wert ausgefüllt wird. Dann fügt die ursprüngliche Eingabematrix 2* N Zeilen und 2* N Spalten hinzu. Hier 2 Zeilen und 2 Spalten werden hinzugefügt. ;

Auf diese Weise werden wir verstehen, warum bei der Berechnung der Ausgabe einer zweidimensionalen Faltung

Ja

[ i + 2 ∗ p a d d i n g − k e r n e l s i z e ] 下取整 / s t r i d e + 1 ; [ i + 2*padding -kernel_{size} ]下取整 / stride + 1;[i+2paddingkernelmitivon]下取整/stedir+1;

1.2 padding_mode-Parameter

Dieser Parameter gibt an, wie die spezifischen Werte dieser Auffüllungen während des Auffüllens generiert werden.
Das heißt, die Methode, die zum Generieren der Auffüllungswerte verwendet wird;

Die zweidimensionale Faltungsfunktion Torch.nn.Conv2d() von PyTorch verfügt über einen „padding_mode“-Parameter und es gibt 4 Optionen: „zeros“, „reflect“,
„replizieren“. ' oder 'circular', die Standardoption ist 'zeros', also eine Auffüllung mit Nullen. Was genau sind diese vier Füllmethoden?

padding_mode (string, optional): `'zeros'`, `'reflect'`,  
        `'replicate'` or `'circular'`. Default: `'zeros'` 

Um diese vier Füllmethoden intuitiv beobachten zu können, definieren wir eine 1 * 1-Faltung und setzen das Gewicht des Faltungskerns auf 1, sodass wir nach der Durchführung von Faltungsberechnungen mit unterschiedlichen Füllmethoden die gefüllte Matrix erhalten können. In diesem Beispiel generieren wir eine 4*4-Matrix bestehend aus 1~16 und führen darauf Faltungsberechnungen mit verschiedenen Füllmethoden durch.

 In [51]: x = torch.nn.Parameter(torch.reshape(torch.range(1,16),(1,1,4,4)))

In [52]: x
Out[52]:
Parameter containing:
tensor([[[[ 1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.],
          [ 9., 10., 11., 12.],
          [13., 14., 15., 16.]]]], requires_grad=True) 
1.‘Nullen‘

„Nullen“ ist die gebräuchlichste Auffüllung mit Nullen, d. h. die Verwendung von 0 in den beiden Dimensionen der MatrixHöhe und Breite Auffüllen, das Auffüllen erfolgt auf beiden Seiten einer Bemaßung.

 In [53]: conv_zeros = torch.nn.Conv2d(1,1,1,1,padding=1,padding_mode='zeros',bias=False)

In [54]: conv_zeros
Out[54]: Conv2d(1, 1, kernel_size=(1, 1), stride=(1, 1), padding=(1, 1), bias=False)

In [55]: conv_zeros.weight = torch.nn.Parameter(torch.ones(1,1,1,1))

In [56]: conv_zeros.weight
Out[56]:
Parameter containing:
tensor([[[[1.]]]], requires_grad=True)

In [57]: conv_zeros(x)
Out[57]:
tensor([[[[ 0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  1.,  2.,  3.,  4.,  0.],
          [ 0.,  5.,  6.,  7.,  8.,  0.],
          [ 0.,  9., 10., 11., 12.,  0.],
          [ 0., 13., 14., 15., 16.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.]]]], grad_fn=<ThnnConv2DBackward>) 

Als Ergebnisbias 参数设置 为 True:
Fügen Sie hier eine Bildbeschreibung ein

x = torch.nn.Parameter(torch.reshape(torch.range(1,16),(1,1,4,4)))
conv_zeros = torch.nn.Conv2d(1,1,1,1,padding=1,padding_mode='zeros',bias=False)
conv_zeros_bias = torch.nn.Conv2d(1,1,1,1,padding=1,padding_mode='zeros',bias=True)
conv_zeros.weight = torch.nn.Parameter(torch.ones(1,1,1,1))
conv_zeros(x)
tensor([[[[ 0.,  0.,  0.,  0.,  0.,  0.],
          [ 0.,  1.,  2.,  3.,  4.,  0.],
          [ 0.,  5.,  6.,  7.,  8.,  0.],
          [ 0.,  9., 10., 11., 12.,  0.],
          [ 0., 13., 14., 15., 16.,  0.],
          [ 0.,  0.,  0.,  0.,  0.,  0.]]]],
       grad_fn=<MkldnnConvolutionBackward>)
conv_zeros_bias(x)
tensor([[[[ 0.5259,  0.5259,  0.5259,  0.5259,  0.5259,  0.5259],
          [ 0.5259,  0.4084,  0.2909,  0.1734,  0.0559,  0.5259],
          [ 0.5259, -0.0616, -0.1791, -0.2966, -0.4141,  0.5259],
          [ 0.5259, -0.5316, -0.6492, -0.7667, -0.8842,  0.5259],
          [ 0.5259, -1.0017, -1.1192, -1.2367, -1.3542,  0.5259],
          [ 0.5259,  0.5259,  0.5259,  0.5259,  0.5259,  0.5259]]]],
       grad_fn=<MkldnnConvolutionBackward>)


Fügen Sie hier eine Bildbeschreibung ein

Dann stellt sich die Frage, ob der Bias auf True,
Der gleiche Input, das gleiche lernbare Parametergewicht, < gesetzt werden soll a i =3> Werden unterschiedliche Ergebnisse erzielt, solange der Bias eingestellt ist?

那么 bias 到底 起到什么作用呢?

2. „reflektieren“

„Reflect“ nimmt den Rand der Matrix als Symmetrieachse und füllt die Elemente in der Matrix symmetrisch zum äußersten Rand.

 In [58]: conv_reflect = torch.nn.Conv2d(1,1,1,1,padding=1,padding_mode='reflect',bias=False)

In [59]: conv_reflect.weight = torch.nn.Parameter(torch.ones(1,1,1,1))

In [60]: conv_reflect(x)
Out[60]:
tensor([[[[ 6.,  5.,  6.,  7.,  8.,  7.],
          [ 2.,  1.,  2.,  3.,  4.,  3.],
          [ 6.,  5.,  6.,  7.,  8.,  7.],
          [10.,  9., 10., 11., 12., 11.],
          [14., 13., 14., 15., 16., 15.],
          [10.,  9., 10., 11., 12., 11.]]]], grad_fn=<ThnnConv2DBackward>) 
3. „replizieren“

„replicate“ kopiert die Kanten der Matrix und füllt sie bis zur Außenseite der Matrix.

 In [61]: conv_reflect = torch.nn.Conv2d(1,1,1,1,padding=1,padding_mode='replicate',bias=False)

In [62]: conv_reflect.weight = torch.nn.Parameter(torch.ones(1,1,1,1))

In [63]: conv_replicate(x)
Out[63]:
tensor([[[[ 1.,  1.,  2.,  3.,  4.,  4.],
          [ 1.,  1.,  2.,  3.,  4.,  4.],
          [ 5.,  5.,  6.,  7.,  8.,  8.],
          [ 9.,  9., 10., 11., 12., 12.],
          [13., 13., 14., 15., 16., 16.],
          [13., 13., 14., 15., 16., 16.]]]], grad_fn=<ThnnConv2DBackward>) 
4. „zirkulär“

Wie der Name schon sagt, bedeutet „zirkulär“ das Ausfüllen einer Schleife. Wie entsteht eine Schleife? Schauen wir uns zunächst das Beispiel an:

 In [64]: conv_reflect = torch.nn.Conv2d(1,1,1,1,padding=1,padding_mode='circular',bias=False)

In [65]: conv_reflect.weight = torch.nn.Parameter(torch.ones(1,1,1,1))

In [66]: conv_circular(x)
Out[66]:
tensor([[[[16., 13., 14., 15., 16., 13.],
          [ 4.,  1.,  2.,  3.,  4.,  1.],
          [ 8.,  5.,  6.,  7.,  8.,  5.],
          [12.,  9., 10., 11., 12.,  9.],
          [16., 13., 14., 15., 16., 13.],
          [ 4.,  1.,  2.,  3.,  4.,  1.]]]], grad_fn=<ThnnConv2DBackward>) 

Wenn die Eingabematrix von links nach rechts und von oben nach unten unendlich erweitert wird, hat sie die folgende Form:

tensor([[[[ 1.,  2.,  3.,  4.,  1.,  2.,  3.,  4.,  1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.,  5.,  6.,  7.,  8.,  5.,  6.,  7.,  8.],
          [ 9., 10., 11., 12.,  9., 10., 11., 12.,  9., 10., 11., 12.],
          [13., 14., 15., 16., 13., 14., 15., 16., 13., 14., 15., 16.],
          [ 1.,  2.,  3.,  4.,  1.,  2.,  3.,  4.,  1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.,  5.,  6.,  7.,  8.,  5.,  6.,  7.,  8.],
          [ 9., 10., 11., 12.,  9., 10., 11., 12.,  9., 10., 11., 12.],
          [13., 14., 15., 16., 13., 14., 15., 16., 13., 14., 15., 16.],
          [ 1.,  2.,  3.,  4.,  1.,  2.,  3.,  4.,  1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.,  5.,  6.,  7.,  8.,  5.,  6.,  7.,  8.],
          [ 9., 10., 11., 12.,  9., 10., 11., 12.,  9., 10., 11., 12.],
          [13., 14., 15., 16., 13., 14., 15., 16., 13., 14., 15., 16.]]]]) 

Bild.png

Hast du es gesehen? Wenn es unendlich erweitert wird, ist dies eine Schleife der ursprünglichen 4 * 4-Matrix. Die obige Matrix ist das Ergebnis des Füllens von 4 Einheiten sowohl in der Höhen- als auch in der Breitendimension. Wenn nur 1 Einheit gefüllt ist, dann nur das Ergebnis nach dem Füllen einer Einheit Einheit wird abgefangen. Matrix:

Bild.png

Dies ist das Ergebnis der Befüllung von nur 1 Einheit im Beispiel.

verweisen

https://www.jianshu.com/p/a6da4ad8e8e7
Empfehlung: https://blog.csdn.net/g11d111/article/details/82665265

Supongo que te gusta

Origin blog.csdn.net/chumingqian/article/details/134222819
Recomendado
Clasificación