Reputation: 1383
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
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