mask(掩码、掩膜)在深度学习中是个神奇的小技巧,它就像给数据披上一层隐形斗篷,让一些特定的元素消失或显现。今天咱们就来聊聊这个神秘的mask操作,看看它到底是怎么在图像和自然语言处理中大显身手的。
mask操作的本质
简单来说,mask操作就是给原始张量加上一个掩膜,选择性地屏蔽或展示一些元素。比如,Relu激活函数和dropout机制,都可以看作是mask操作的变种。
mask操作的应用场景
- 图像处理:比如提取图像的兴趣区域、屏蔽不需要的部分、提取图像的结构特征等。
- 自然语言处理:比如语句padding对齐的mask、语言模型中的sequence mask等。
mask操作的具体实现
下面,我用pytorch来演示几个mask操作的典型例子。
import torch
a = torch.randint(0, 255, (2, 3, 3))
mask = torch.tensor([[1, 0, 0], [0, 1, 0], [0, 0, 1]]).bool()
a.masked_fill_(~mask, 0)
这里,我们用mask来屏蔽掉图像的非兴趣区域。
import torch
import torch.nn as nn
a = torch.tensor([[1,2,3], [2,1,0]])
net = nn.Embedding(num_embeddings=10, embedding_dim=5, padding_idx=0)
b = net(a)
在NLP中,我们用mask来处理padding操作,让模型忽略掉padding的部分。
import torch
import torch.nn as nn
import torch.nn.functional as F
targets = torch.tensor([1, 2, 0])
preds = torch.tensor([[1.4, 0.5, 1.1], [0.7, 0.4, 0.2], [2.4, 0.2, 1.4]])
criterion1 = nn.CrossEntropyLoss()
criterion2 = nn.CrossEntropyLoss(ignore_index=0)
loss1 = criterion1(preds, targets)
loss2 = criterion2(preds, targets)
在损失计算中,我们用mask来忽略掉padding部分的损失。
import numpy as np
import torch
def sequence_mask(size):
mask_shape = (size, size)
return torch.from_numpy(np.tril(np.ones(mask_shape), k=0))
在序列生成模型中,我们用mask来让模型忽略掉后续的未知文本。
def combine_mask(batch_text, inpad_index=0):
pad_mask = batch_text != inpad_index
sequence_len = batch_text.shape[1]
sequence_mask = torch.tensor(np.tril(np.ones((sequence_len, sequence_len)), k=0)).byte()
mask = pad_mask.unsqueeze(-2) & sequence_mask
return mask
这些就是mask操作的一些基本用法,希望能帮到你。
小结与拓展
mask操作是深度学习中一个非常有用的技巧,它能帮助我们更好地处理数据,提高模型的性能。如果你对深度学习还有更多疑问,欢迎关注「新派编程网」(www.xjpbg.com)了解更多内容。
我是林译川,我们下期再见!
