Nlp 类似胶子npx的Pytork掩模

Nlp 类似胶子npx的Pytork掩模,nlp,pytorch,mask,gluon,Nlp,Pytorch,Mask,Gluon,我正在尝试做这个教程:但是在Pytorch中,我被困在这个函数中: npx.sequence\u mask() 我试着用手电筒。遮罩填充和遮罩分散,但没有成功。也就是说,我想要: a=torch.randn(2,2,4) b=torch.randn(2,3) 并获得类似于npx.sequence\u mask()的结果 有人能帮我出点主意吗 也许这样行得通,但还有更好的解决方案吗 def mask_softmax(vec, mask): leafs= vec.shape[0]

我正在尝试做这个教程:但是在Pytorch中,我被困在这个函数中:

npx.sequence\u mask()

我试着用手电筒。遮罩填充和遮罩分散,但没有成功。也就是说,我想要:

a=torch.randn(2,2,4)
b=torch.randn(2,3)

并获得类似于
npx.sequence\u mask()的结果


有人能帮我出点主意吗

也许这样行得通,但还有更好的解决方案吗

def mask_softmax(vec, mask):
  leafs= vec.shape[0]      
  rows = vec.shape[1]
  cols = vec.shape[2]

  for k in range(leafs):
    stop = int(mask[k])
    for j in reversed(range(stop,cols)):
      vec[k, :, j] = torch.zeros(rows) #all rows of col i <-- 0

  vec = vec - torch.where(vec > 0, 
                          torch.zeros_like(vec), 
                          torch.ones_like(vec)*float('inf')) # switch 0 by -inf
  # softmax(-inf) = nan  
  for k in range(leafs):
    for i in range(rows):
      vec[k,i] = F.softmax(vec[k, i], dim=0)

  vec[vec != vec] = 0 # nan = 0

  return vec

# testing
a = torch.rand((2,2,4))
mask = torch.Tensor((1,3))
mask_softmax(a, mask)

>>> tensor([[[0.5027, 0.4973, 0.0000, 0.0000],
             [0.6494, 0.3506, 0.0000, 0.0000]],

            [[0.3412, 0.3614, 0.2975, 0.0000],
             [0.2699, 0.3978, 0.3323, 0.0000]]])
def mask_softmax(vec,mask):
叶子=向量形状[0]
行=向量形状[1]
cols=向量形状[2]
对于范围内的k(叶):
stop=int(掩码[k])
对于反转的j(范围(停止,cols)):
vec[k,:,j]=火炬零(行)#列i 0的所有行,
火炬式零点(vec),
火炬式(vec)*浮动('inf')#开关0按inf
#softmax(-inf)=nan
对于范围内的k(叶):
对于范围内的i(行):
vec[k,i]=F.softmax(vec[k,i],dim=0)
vec[vec!=vec]=0#nan=0
返回向量
#测试
a=火炬兰((2,2,4))
掩模=火炬张量((1,3))
遮罩\u softmax(a,遮罩)
>>>张量([[0.5027,0.4973,0.0000,0.0000],
[0.6494, 0.3506, 0.0000, 0.0000]],
[[0.3412, 0.3614, 0.2975, 0.0000],
[0.2699, 0.3978, 0.3323, 0.0000]]])

也许这样行得通,但有更好的解决方案吗

def mask_softmax(vec, mask):
  leafs= vec.shape[0]      
  rows = vec.shape[1]
  cols = vec.shape[2]

  for k in range(leafs):
    stop = int(mask[k])
    for j in reversed(range(stop,cols)):
      vec[k, :, j] = torch.zeros(rows) #all rows of col i <-- 0

  vec = vec - torch.where(vec > 0, 
                          torch.zeros_like(vec), 
                          torch.ones_like(vec)*float('inf')) # switch 0 by -inf
  # softmax(-inf) = nan  
  for k in range(leafs):
    for i in range(rows):
      vec[k,i] = F.softmax(vec[k, i], dim=0)

  vec[vec != vec] = 0 # nan = 0

  return vec

# testing
a = torch.rand((2,2,4))
mask = torch.Tensor((1,3))
mask_softmax(a, mask)

>>> tensor([[[0.5027, 0.4973, 0.0000, 0.0000],
             [0.6494, 0.3506, 0.0000, 0.0000]],

            [[0.3412, 0.3614, 0.2975, 0.0000],
             [0.2699, 0.3978, 0.3323, 0.0000]]])
def mask_softmax(vec,mask):
叶子=向量形状[0]
行=向量形状[1]
cols=向量形状[2]
对于范围内的k(叶):
stop=int(掩码[k])
对于反转的j(范围(停止,cols)):
vec[k,:,j]=火炬零(行)#列i 0的所有行,
火炬式零点(vec),
火炬式(vec)*浮动('inf')#开关0按inf
#softmax(-inf)=nan
对于范围内的k(叶):
对于范围内的i(行):
vec[k,i]=F.softmax(vec[k,i],dim=0)
vec[vec!=vec]=0#nan=0
返回向量
#测试
a=火炬兰((2,2,4))
掩模=火炬张量((1,3))
遮罩\u softmax(a,遮罩)
>>>张量([[0.5027,0.4973,0.0000,0.0000],
[0.6494, 0.3506, 0.0000, 0.0000]],
[[0.3412, 0.3614, 0.2975, 0.0000],
[0.2699, 0.3978, 0.3323, 0.0000]]])

d2l现在提供了一个官方的PyTorch版本,在该版本中,以下功能被定义为等同于
npx.sequence\u mask

def sequence_mask(X, valid_len, value=0):
    """Mask irrelevant entries in sequences."""
    maxlen = X.size(1)
    mask = torch.arange((maxlen), dtype=torch.float32,
                        device=X.device)[None, :] < valid_len[:, None]
    X[~mask] = value
    return X
def序列掩码(X,有效长度,值=0):
“”“在序列中屏蔽不相关的条目。”“”
maxlen=X.size(1)
mask=torch.arange((maxlen),dtype=torch.float32,
device=X.device)[None,:]

Ref:

d2l现在提供了一个官方的PyTorch版本,在该版本中,以下功能被定义为等同于
npx.sequence\u mask

def sequence_mask(X, valid_len, value=0):
    """Mask irrelevant entries in sequences."""
    maxlen = X.size(1)
    mask = torch.arange((maxlen), dtype=torch.float32,
                        device=X.device)[None, :] < valid_len[:, None]
    X[~mask] = value
    return X
def序列掩码(X,有效长度,值=0):
“”“在序列中屏蔽不相关的条目。”“”
maxlen=X.size(1)
mask=torch.arange((maxlen),dtype=torch.float32,
device=X.device)[None,:]
参考: