El papel de unfold es implementar manualmente la operación de ventana deslizante (en convolución), es decir, solo el volumen, sin el producto.
ret = F.unfold(inp, size)
- inp: Tensor de entrada, debe ser de cuatro dimensiones (B, C, H, W)
- tamaño: tupla que representa el tamaño de la ventana deslizante
- ret: Tensor tridimensional de salida (a, b, c), a representa el número de lotes de entrada, b representa el tamaño de la ventana deslizante y c representa el número de veces que se desliza la ventana deslizante
Por ejemplo, para un mapa de características de 1 × 1 × 5 × 5 de la siguiente manera:
[[[[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[ 11, 12, 13, 14, 15],
[ 16, 17, 18, 19, 20],
[ 21, 22, 23, 24, 25]]]]
Para realizar una operación de ventana deslizante 2×2 en él, el proceso es el siguiente:
1 2 -> 2 3 -> 3 4
6 7 7 8 8 9 ...
Escribe el código de la siguiente manera:
import torch
from torch.nn import functional as F
x = torch.Tensor([[[[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[ 11, 12, 13, 14, 15],
[ 16, 17, 18, 19, 20],
[ 21, 22, 23, 24, 25]]]])
x = F.unfold(x, (2, 2))
print(x)
print(x.size())
La salida es la siguiente:
tensor([[[ 1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19],
[ 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20],
[ 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24],
[ 7, 8, 9, 10, 12, 13, 14, 15, 17, 18, 19, 20, 22, 23, 24, 25]]])
torch.Size([1, 4, 16])
El número de filas es 4, que corresponde al tamaño de la ventana deslizante de 2 × 2; y los elementos de cada columna son el contenido cubierto por la ventana deslizante a su vez, deslizado 16 veces en total, por lo que hay 16 columnas.