Sometimes, current operations tend to hardly meet our needs as they are not ‘vectorized enough’.
For example, here I have to tensor.eq(float)
to get each cur_sp_mask
. So I have to use for-loop
to enumerate each blob.
import torch
bz = 2
a = (torch.rand(bz, 3, 4)*4).int()
index = torch.tensor([[0, 1, 0, 2],[0, 1, 2, 3], [1, 2, 2, 3]])
a = a.view(bz, -1)
index_vec = index.view(-1)
for i in range(bz):
max_index = torch.max(index_vec)
a_vec = a[i]
rec = torch.zeros_like(a_vec.float())
# I have to enumerate each blob
for j in range(max_index + 1):
cur_sp_mask = index_vec.eq(j)
n_pixels = torch.sum(cur_sp_mask).float()
rec[cur_sp_mask] = a_vec[cur_sp_mask] + j * n_pixels
rec = rec.view(3, 4)
print('a[i]')
print(a_vec.view(3,4))
print('index')
print(index.view(3,4))
print('result')
print(rec)
print('------')
Another example, I want to create a list of tensors, each of which can be created using torch.arange
:
# Something like this:
#
import torch
x= torch.tensor([20, 53, 98]).long()
y= torch.tensor([110, 120, 132]).long()
# now I have to
a = []
for i in range(3):
a.append(torch.arange(x[i], y[i]))
# However, I hope something like this can be
# more efficient than `for-loop`.
a = torch.arange(x, y)
# a is a list full of tensors
However, torch.arange
does not support “batching” operation.
It is definetely huge work to make most operations powerful enough to support so advanced “batching”. However, maybe it is possible:
import torch
x= torch.tensor([20, 53, 98]).long()
y= torch.tensor([110, 120, 132]).long()
warp_x = warp_op(x)
warp_y = warp_op(y)
# When tensors are warpped,
# then they can be more efficient executed than `for-loop`.
a = torch.arange(warp_x , warp_y)
# a is a list full of tensors