Hi everyone,
I’m struggling with the following issue, and can’t find a possible explanation (I’m quite the pytorch amateur, so please forgive me for not finding possible obvious solutions).
I’m feeding MR images to a 3D Unet, and reshape the already normalized numpy array image
like this:
imagefinal=(image.reshape(1,1, image.shape[0], image.shape[1], image.shape[2]))
after which I convert it to a tensor using
tensor_x = torch.from_numpy(imagefinal).float()
However, using
print(imagefinal.max())
print(torch.max(tensor_x))
returns
1.0
tensor(2652589.7500, device=‘cuda:0’)
1.0
tensor(4033200., device=‘cuda:0’)
1.0
tensor(3447660.5000, device=‘cuda:0’)
1.0
tensor(3224289., device=‘cuda:0’)
1.0
Do you have any idea why the maximum value of the array would change to very large values after converting it to a tensor? I’ve tried forcing the tensor to be of different datatypes with no success. Is there something obvious I’m missing here?
Thanks in advance for your help!
Consider this toy example:
np_array = np.random.randn(2,3,4)
print(np_array.shape, np_array.dtype, np_array.max())
>>((2, 3, 4), dtype('float64'), 2.2915268560525193)
tensor = torch.from_numpy(np_array)
print(tensor.shape, tensor.dtype, tensor.max())
>>torch.Size([2, 3, 4]) torch.float64 tensor(2.3412, dtype=torch.float64)
Everything is as expected. Notice, that default numpy float type is float64
, torch is float32
. So, you may convert float64 to float32 and have possible overflow (which I am a bit doubt). I would also suggest to carefully review if you may change imagefinal
somewhere in the code before converting to tensor.
Hi Alexey,
Thank you very much for your reply. After some additional digging, I found the problem. I’m masking my MR image arrays with the np.ma.masked_array
function, returning a MaskedArray
datatype. I wasn’t able to find an explanation for this online, but torch.from_numpy
doesn’t seem able to directly copy values from MaskedArray types. After first converting the MaskedArray to a normal numpy array using x=np.asarray(MaskedArray)
, the torch.from_numpy
function works as intended.
Best,
Laurens
Good to hear, you figure it out.
Cheers,
Alexey