1.背景:
一直使用torch进行开发,torch的友好为开发调试提供了很多方便,但是torch中有些函数没有内置,造成使用的时候必须自己实现,最近就遇到了一个连续切片的问题,问题可以想象我们往Bert中输入的是一个句子对,但是我们还需要第一个句子的表示,因此必须从句子对的表示中取出第一个或者第二个句子的表示,tensorflow中tf.strided_slice()函数有类似的功能,但是我在torch中没有找到类似的函数,因此自己想办法实现了类似功能(如果有大神知道更好的方案请不吝赐教)。
2.解决方案,下面直接上代码:
import torch
# x 表示句子对表示
x = torch.rand((3, 5))
print(x)
# mask是句子1的掩码
mask = [[1, 1, 1, 0],
[1, 0, 0, 0],
[1, 1, 0, 0]]
mask = torch.tensor(mask, dtype=torch.long)
# x1是按句子1最大长度截取的表示,可能包含一部分其他信息
x1 = x[:, : mask.size(1)]
print(x1)
# 使用掩码将非句子1对应的表示都变为0
x2 = x1 * mask.float()
print(x2)