跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

深度学习中mask操作怎么用?

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)了解更多内容。

我是林译川,我们下期再见!

相关文章