# How to generate a random displacement field followed by gaussian and trainable?

I am using grid_sample function, that

``````torch.nn.functional.grid_sample(input, grid, mode='bilinear', padding_mode='zeros')
``````

I want to construct a random grid and it trained with the network. The scrip likes

``````class Network(nn.Module):
def __init__(self):

def forward(self,input):
output = torch.nn.functional.grid_sample(input, self.rnd_grid_tensor, mode='bilinear', padding_mode='zeros')
return output
``````

How to generate the rnd_grid_tensor so that the value in the grid followed by gaussian distribution. Thanks

This is my solution but I am not sure is it correct or not

``````from torch.autograd import Variable
def gaussian(ins, is_training, mean, stddev):
if is_training:
noise = Variable(ins.data.new(ins.size()).normal_(mean, stddev))
return ins + noise
return ins

grid = gaussian (grid, True, 1, 0.1)
``````

Do you want a random displacement field where the displacements follow a Gaussian distribution?

If so, what you need to do is generate a tensor with the displacements

``````disp_field = torch.FloatTensor(1,2,16,16).normal_(mean, std).requires_grad_()
``````

Then add it into an identity grid, which you can create using `affine_grid()`:

``````id_grid = torch.nn.functional.affine_grid(torch.FloatTensor([[[1, 0, 0],[0, 1, 0]]]), size=(1,2,16,16))
``````

and then pass the sum to `grid_sample()`:

``````output = torch.nn.functional.grid_sample(input, id_grid + disp_field)
``````

Just note that the mean and standard deviation will be in the grid units of a half-image (ie. a displacement of `1` will be equivalent to `(size - 1)/2` pixels).
So if you have the mean and std in pixels, you have to divide them both by `(size - 1)/2`.

I hope this helps.

1 Like