As the docs described, the grid_sample
performs value sampling in the closed range [-1, 1], i.e., values x = -1, y = -1
is the left-top pixel of input
, and values x = 1, y = 1
is the right-bottom pixel of input
. But when I perform grid_sample
on a volumetric (5D) input, the result is totally unexpected. The code snippet is as follow:
import torch
import torch.nn.functional as F
data_dict = torch.load('data_dict.pth')
prob = data_dict['prob'].unsqueeze(0).unsqueeze(0)
sm = data_dict['sm'].unsqueeze(0).unsqueeze(0)
ret = F.grid_sample(prob, sm, mode='nearest')
print('--------result of zero padding----------')
print(ret[0, 0, 0, 0, 0]) # sampling result of (0, 0, 0)
print(sm[0, 0, 0, 0, :]) # samping coord of (0, 0, 0)
print(prob[0, 0, -1, 0, 0]) # samping target of (0, 0, 0)
ret = F.grid_sample(prob, sm, mode='nearest', padding_mode='border')
print('--------result of border padding----------')
print(ret[0, 0, 0, 0, 0]) # sampling result of (0, 0, 0)
print(sm[0, 0, 0, 0, :]) # samping coord of (0, 0, 0)
print(prob[0, 0, -1, 0, 0]) # samping target of (0, 0, 0)
Its running results are as follow:
--------result of zero padding----------
tensor(0.)
tensor([-1., -1., 1.])
tensor(0.9999)
--------result of border padding----------
tensor(0.9999)
tensor([-1., -1., 1.])
tensor(0.9999)
The result of ret[0, 0, 0, 0, 0]
should find value from (-1, -1, 1)
of prob which equals to 0.999, but the sampling result is 0. I guess this may be caused by kind of out-of-bound behavior, thus, I set the padding mode to border
and the result makes sense.
What makes me confused is that where is the out-of-bound behavior comes from? Does it come from float point accuracy loss? If so, how can we ensure the sampling results are correct at the boundaries?
Thanks.