mask.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. # Copyright 2019 Shigeki Karita
  2. # Apache 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
  3. """Mask module."""
  4. import torch
  5. def subsequent_mask(size, device="cpu", dtype=torch.bool):
  6. """Create mask for subsequent steps (size, size).
  7. :param int size: size of mask
  8. :param str device: "cpu" or "cuda" or torch.Tensor.device
  9. :param torch.dtype dtype: result dtype
  10. :rtype: torch.Tensor
  11. >>> subsequent_mask(3)
  12. [[1, 0, 0],
  13. [1, 1, 0],
  14. [1, 1, 1]]
  15. """
  16. ret = torch.ones(size, size, device=device, dtype=dtype)
  17. return torch.tril(ret, out=ret)
  18. def target_mask(ys_in_pad, ignore_id):
  19. """Create mask for decoder self-attention.
  20. :param torch.Tensor ys_pad: batch of padded target sequences (B, Lmax)
  21. :param int ignore_id: index of padding
  22. :param torch.dtype dtype: result dtype
  23. :rtype: torch.Tensor (B, Lmax, Lmax)
  24. """
  25. ys_mask = ys_in_pad != ignore_id
  26. m = subsequent_mask(ys_mask.size(-1), device=ys_mask.device).unsqueeze(0)
  27. return ys_mask.unsqueeze(-2) & m
  28. def vad_mask(size, vad_pos, device="cpu", dtype=torch.bool):
  29. """Create mask for decoder self-attention.
  30. :param int size: size of mask
  31. :param int vad_pos: index of vad index
  32. :param str device: "cpu" or "cuda" or torch.Tensor.device
  33. :param torch.dtype dtype: result dtype
  34. :rtype: torch.Tensor (B, Lmax, Lmax)
  35. """
  36. ret = torch.ones(size, size, device=device, dtype=dtype)
  37. if vad_pos <= 0 or vad_pos >= size:
  38. return ret
  39. sub_corner = torch.zeros(
  40. vad_pos - 1, size - vad_pos, device=device, dtype=dtype)
  41. ret[0:vad_pos - 1, vad_pos:] = sub_corner
  42. return ret