antorcha.grid_sample

referencia:

Consulte la documentación oficial, TORCH.NN.FUNCTIONAL.GRID_SAMPLE

La firma de función de grid_sample es la siguiente, torch.nn.functional.grid_sample(input, grid, mode='bilinear', padding_mode='zeros', align_corners=None).

En el caso 4D,

  • entrada (Tensor) – entrada de forma ( N , C , H in , W in ) (N, C, H_{in}, W_{in})( norte ,C ,Hen,Wen) , que es equivalente a la imagen de entrada, N es lote_tamaño y C es canal.
  • rejilla (Tensor) – campo de flujo de forma ( N , H out , W out , 2 ) (N, H_{out}, W_{out}, 2)( norte ,Hfuera de ti,Wfuera de ti,2 ) , la última dimensión debe ser una matriz de longitud 2, que representa el punto de coordenadas (x, y) en el plano bidimensional. W fuera W_ {fuera}Wfuera de tiH fuera H_{fuera}Hfuera de tiEquivalente al ancho y alto de la matriz de consulta, la función devolverá el valor de muestreo de cada coordenada en la matriz de consulta. El resultado del muestreo depende de la estrategia de interpolación.mode

Cuando align_corners=True y False, la función se comporta de manera diferente y devuelve resultados diferentes.

Explicación básica del ejemplo

Veamos primero un ejemplo. Primero, la matriz de entrada es inp, luego cree dos matrices new_h, new_w y sintetícelas en una cuadrícula de "matriz de coordenadas de consulta". Las dimensiones de la matriz de salida son las mismas que las dimensiones de la matriz de consulta.

Este ejemplo solo da una impresión general y no implica el cálculo de valores de puntos específicos.

# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
import torch
import torch.nn.functional as F

inp = torch.arange(0, 16)
inp = inp.reshape((1, 1, 4, 4)).float()
print("inp", inp)
# inp tensor([[[[ 0.,  1.,  2.,  3.],
#          [ 4.,  5.,  6.,  7.],
#          [ 8.,  9., 10., 11.],
#          [12., 13., 14., 15.]]]])
out_h = 3
out_w = 3
new_h = torch.linspace(-1, 1, out_h).view(-1, 1).repeat(1, out_w)
new_w = torch.linspace(-1, 1, out_w).repeat(out_h, 1)
print("new_h", new_h)
print("new_w", new_w)
# new_h tensor([[-1., -1., -1.],
#        [ 0.,  0.,  0.],
#        [ 1.,  1.,  1.]])
#new_w tensor([[-1.,  0.,  1.],
#        [-1.,  0.,  1.],
#        [-1.,  0.,  1.]])

grid = torch.cat((new_w.unsqueeze(2), new_h.unsqueeze(2)), dim=2)
print("grid", grid)
#grid tensor([[[-1., -1.],
#          [ 0., -1.],
#          [ 1., -1.]],
# 
#         [[-1.,  0.],
#          [ 0.,  0.],
#          [ 1.,  0.]],
# 
#         [[-1.,  1.],
#          [ 0.,  1.],
#          [ 1.,  1.]]])
grid = grid.unsqueeze(0)


outp = F.grid_sample(inp, grid=torch.Tensor(grid), mode='bilinear', align_corners=False)
# outp = F.grid_sample(inp, grid=grid, mode='bilinear', align_corners=False)
print("outp", outp)
# outp tensor([[[[0.0000, 0.7500, 0.7500],
#          [3.0000, 7.5000, 4.5000],
#          [3.0000, 6.7500, 3.7500]]]])

Comportamiento de la función bajo dos configuraciones de align_corners

Después de recibir el parámetro de entrada, la función lo asignará a x ∈ [ − 1 , 1 ] , y ∈ [ − 1 , 1 ] x \in [-1, 1], y \in [-1, 1]X[ - 1 ,1 ] ,y[ - 1 ,1 ] dentro del rango de la matriz. Y align_corners controla si la función debe asignar los elementos de las coordenadas de las esquinas a las posiciones de las esquinas de la matriz.

Consulte el análisis grid_sample de Pytorch para obtener más información .

Supongamos que el tamaño de la matriz de entrada es 4x4 y los valores de los elementos aumentan de 0 a 15.

Cuando align_corners=True, los valores de las coordenadas de las cuatro esquinas de la entrada se asignan a las cuatro esquinas del rango del sistema de coordenadas. Entonces el valor de las coordenadas (-1, -1) es 0, y el valor de (1, 1) es 15.

Cuando align_corners=False, cada valor de entrada estará en el centro del píxel de la matriz de 4x4 píxeles. Las cuatro esquinas de la matriz de píxeles se asignarán a las cuatro esquinas del rango del sistema de coordenadas.

Entonces, cuando desee calcular el valor de (0.7143, -0.7143) (la posición cruzada de la línea roja en la figura), debe encontrar los cuatro valores de 2, 3, 6 y 7 (el cuadro marrón en la figura), y tomar su interpolación bilineal.

La matriz de consulta tiene elementos duplicados

¿Cómo cambia el comportamiento de grid_sample cuando hay elementos duplicados en la cuadrícula de matriz de coordenadas de consulta? Por ejemplo, la siguiente ejecución de código:

outp = F.grid_sample(inp, grid=torch.Tensor(
        [[[[0, 0],
           [0, 1],
           [1, 0],
           [1, 1],
           [1, 1],
           [1, 1]]]]
    ), mode='bilinear', align_corners=True)

Se obtendrán los siguientes resultados. Se puede ver a partir de la observación que las últimas tres coordenadas de consulta son todas [1,1], por lo que los resultados de la consulta son todos iguales a 15.

outp tensor([[[[ 7.5000, 13.5000,  9.0000, 15.0000, 15.0000, 15.0000]]]])

Supongo que te gusta

Origin blog.csdn.net/duoyasong5907/article/details/129016301
Recomendado
Clasificación