I’m seeing some unexpected behavior using a cuda.ByteTensor
with tensor.max()
. I’m creating a binary mask from 2 cuda.FloatTensors
(y,x) using y==x
. This works fine. But when trying to retrieve the argmax using something like (y==x).max(dim=1)[1]
, it only returns the expected behavior on a cpu. I can only get the expected result on the gpu by converting the cuda.ByteTensor
to a cuda.FloatTensor
before calling the max
operator: (y==x).type(cuda.FloatTensor).max(dim=1)[1]
. Below I’ve provided a minimal example.
Python 2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:09:15)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> import torch
>>> print(torch.__version__)
0.2.0_4
>>> x = torch.Tensor( [ [0], [1], [1], [0], [0] ]).cuda()
>>> type(x)
<class 'torch.cuda.FloatTensor'>
>>> b_x = 1 == x
>>> type(b_x)
<class 'torch.cuda.ByteTensor'>
>>> b_x
0
1
1
0
0
[torch.cuda.ByteTensor of size 5x1 (GPU 0)]
>>> b_x.max(dim=1)
(
0
1
1
0
0
[torch.cuda.ByteTensor of size 5 (GPU 0)]
,
1
0
0
1
1
[torch.cuda.LongTensor of size 5 (GPU 0)]
)
>>> x = torch.Tensor( [ [0], [1], [1], [0], [0] ])
>>> type(x)
<class 'torch.FloatTensor'>
>>> b_x = 1 == x
>>> type(b_x)
<class 'torch.ByteTensor'>
>>> b_x.max(dim=1)
(
0
1
1
0
0
[torch.ByteTensor of size 5]
,
0
0
0
0
0
[torch.LongTensor of size 5]
)
>>> x = torch.Tensor( [ [0], [1], [1], [0], [0] ]).cuda()
>>> b_x = 1 == x
>>> b_x.type(torch.cuda.FloatTensor).max(dim=1)
(
0
1
1
0
0
[torch.cuda.FloatTensor of size 5 (GPU 0)]
,
0
0
0
0
0
[torch.cuda.LongTensor of size 5 (GPU 0)]
)
>>>