Mohit Lamba
Mohit Lamba

Reputation: 1383

Bring any PyTorch cuda tensor in the range [0,1]

Suppose I have a PyTorch Cuda Float tensor x of the shape [b,c,h,w] taking on any arbitrary value allowed by Float Tensor range. I want to normalise it in the range [0,1].

I think of the following algorithm (but any other will also do).

Step1: Find minimum in each batch. Call it min and having shape [b,1,1,1].

Step2: Similarly find the maximum and call it max.

Step3: Use y = (x-min)/max. Alternatively use y = (x-min)/(max-min). I don't know which one will be better. y should have the same shape as that of x.

I am using PyTorch 1.3.1.

Specifically I am unable to get the desired min using torch.min(). Same goes for max.

I am going to use it for feeding it to pre-trained VGG for calculating perceptual loss (after the above normalisation i will additionally bring them to ImageNet mean and std). Due to some reason I cannot enforce [0,1] range during data loading part because the previous works in my area have a very specific normalisation algorithm which has to be used but some times does not ensures [0,1] bound but will be somewhere in its vicinity. That is why at the time computing perceptual loss I have to do this explicit normalisation as a precaution. All out of the box implementation of perceptual loss I am aware assume data is in [0,1] or [-1,1] range and so do not do this transformation.

Thankyou very much

Upvotes: 1

Views: 334

Answers (1)

Shai
Shai

Reputation: 114816

Not the most elegant way, but you can do that using keepdim=True and specifying each of the dimensions:

channel_min = x.min(dim=1, keepdim=True)[0].min(dim=2,keepdim=True)[0].min(dim=3, keepdim=True)[0]
channel_max = x.max(dim=1, keepdim=True)[0].max(dim=2,keepdim=True)[0].max(dim=3, keepdim=True)[0]

Upvotes: 1

Related Questions