Directorio de artículos
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+2∗p 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
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+2∗p 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:
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:
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]