Hi,
I have a tensor of dimension (batch_size, Seq_len)
I want to mask out all values between two specific values of seq_len, for example 100, and 125. (including 100 and 125). There might be multiple such occurrences of them too.
I want to mask out with ‘-1’
how can I do it in a fast way in pytorch?
Hi fbrah!
I’m confused about what you are asking. “Seq_len” is the second
dimension of your tensor, but then you have “two specific values of
seq_len.” I don’t understand what you mean. Is “seq_len” an index
into your tensor, or is it the value of an element of your tensor?
If “seq_len” is an index, then you can use slice notation. That is,
if t
is your tensor, then:
t[:, 100:126] = -1.0
will overwrite the elements of your tensor whose second index is in
the range [100, 125] (inclusive) with -1.0.
If “seq_len” is a value, then if you want to replace with -1 the elements
of your tensor whose values fall in a given range, masked_fill_()
should do what you want. That is, if t
is your tensor, then:
t.masked_fill_ (t.ge (100.0) * t.le (125.0), -1.0)
will overwrite the elements of your tensor whose value fall in the
range [100.0, 125.0] (inclusive) with -1.0.
Good luck.
K. Frank
Hi @KFrank
Thanks for your reply and thorough explanation.
However, values in the seq_len dimension are some integers which are basically word_indices.
let me clarify what I want to do:
Lets say seq_len = 128
consider X = myTensor[0,:]. # this would be of size [1, 128].
for example: X = [4,121,4,501,100, …,125, 90,92, 100, …,125]
I want all values between (including) 100 and 125 which I showed with …, set to -1. And I want to do that for all rows of myTensor (#row = batch_size)
I hope I could clarify this. Thanks again
Is there anyway I can use masked_fill_()
for this but not with respect to actual values?
Hello fbrah!
Based on what I think you want, the masked_fill_()
code I posted
should work for you.
Could you post a short, self-contained script that uses masked_fill_()
as I described, together with its output (including errors, if any), and
compare, concretely, what masked_fill_()
gives you with what you
actually want?
Good luck.
K. Frank
@KFrank
The script you described set all elements whose values lies in between 100 and 125 to -1.
However, my elements are just some indices and I want the elements who are between specific start and end to be -1.
Just to clarify the confusion let me change the start and end to 41 and 7 respectively.
I want to change x = torch.tensor([1,3,4,41,10,7,5,1,8,3,41,90,78,7,41])
to
torch.tensor([1,3,4,-1,-1,-1,5,1,8,3,-1,-1,-1,-1,41])
.
With the code you sent x.masked_fill_(x.ge(41) * x.le(4), -1.0)
the output wouldn’t change.
Hello fbrah!
I understand what you are asking now.
I do not see a way to do it using straightforward tensor operations;
I think you will have to loop over the elements in each row.
Best.
K. Frank