Comprensión de nn.Conv1d \ nn.Conv2d y grupos \ parámetros de dilatación

nn.Conv1d

Código:

nn.Conv1d(in_channels = 16, out_channels = 16, kernel_size = (3,2,2), stride = (2,2,1), padding = [2,2,2])

Si la entrada es:

x = torch.randn(10,16,30,32,34)

luego:

  • 10 significa: tamaño_lote
  • 16 representa: el número de canales de entrada
  • 30, 32, 34 representan el tamaño de la imagen (u otro)

Luego, después de este nn, la especificación de salida es [10,16,16,18,37] La
fórmula es la siguiente:
dout = (din - kernelsize + 2 ∗ padding) / stride + 1) d_ {out} = (d_ {in} - kernel_size + 2 * relleno) / stride + 1)reo u t=( di n-k e r n e lsyo z e+2p a d d i n g ) / s t r i d e+1 )

  • (30-3 + 2 * 2) / 2 + 1 = 16
  • (32 - 2 + 2 * 2) / 2 + 1 = 18
  • (34 - 2 + 2 * 2) / 1 + 1 = 36

Se puede entender como: Tres núcleos de convolución con un tamaño de 3/3/2, respectivamente, se deslizan en las tres dimensiones de la imagen de entrada.

nn.Conv2d

Código:

nn.Conv2d(16, 32 , kernel_size(3,2), stride = (2,1))

Si la entrada es:

x = torch.rand(10,16,30,32)

La especificación de salida es [10,32,14,31]:

  • 10: tamaño_lote
  • 32: Número de canales de salida
  • (30 - 3 + 2 * 0) / 2 + 1 = 14
  • (32 - 2 + 2 * 0) / 1 + 1 = 31

Comprensión del parámetro de grupos y el parámetro de dilatación en nn.Conv2d

grupos

Inserte la descripción de la imagen aquí
Cuando grupos = 1, asumiendo que el número de canales de entrada es ny el número de canales de salida es m, entonces se entiende que los canales de entrada se dividen en 1 grupo (no agrupado), y cada canal de salida debe estar en todos los canales de entrada. La convolución es una especie de conexión completa local con intercambio de parámetros.
Si los grupos se cambian a 2, se puede entender como dividir los canales de entrada en dos grupos, en este momento, cada canal de salida solo necesita ser convolucionado en uno de los grupos.
Si groups = in_channels, es decir, divida los canales de entrada en grupos in_channels (cada grupo es también un canal), en este momento, cada canal de salida solo necesita realizar la convolución en uno de los canales de entrada.

dilatación

conv_arithmetic
dilatación incorpora una idea llamada à trous, la fórmula de cálculo de salida después de introducir la dilatación es:

dout = (din - dilatación ∗ (kernelsize - 1) - 1 + 2 ∗ padding) / stride + 1) d_ {out} = (d_ {in} - dilatación * (kernelsize-1) -1 + 2 * padding) / zancada + 1) reo u t=( di n-d i l a t i o n( k e r n e l s i z e-1 )-1+2p a d d i n g ) / s t r i d e+1 )
Definimos un núcleo de convolución 3 * 3. Si el parámetro de dilatación es el predeterminado (1), entonces la convolución se realiza de acuerdo con el entendimiento convencional, como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
Si configuramos la dilatación en 2, de hecho, es en dos Inserte un espacio en blanco en los dos puntos de convolución, de modo que el núcleo de convolución 3 * 3 se convierta en 5 * 5:
Inserte la descripción de la imagen aquí

dilatación = 1:

import torch.nn as nn
m = nn.Conv2d(1, 1, (3, 3), stride=(1, 1))
input = torch.randn(1, 1, 7, 7)
output = m(input)
print(output.shape)
>>>输出:[1,1,5,5]

dilatación = 2:

import torch.nn as nn
m = nn.Conv2d(1, 1, (3, 3), stride=(2, 2))
input = torch.randn(1, 1, 7, 7)
output = m(input)
print(output.shape)
>>>输出:[1,1,3,3]

referencia

sitio web oficial conv_arithmetic
pytorch

Supongo que te gusta

Origin blog.csdn.net/jokerxsy/article/details/108614661
Recomendado
Clasificación