使用背景

最常见的一种情况, 在NLP问题的句子补全方法中, 按照一定的长度, 对句子进行填补和截取操作. 一般使用keras.preprocessing.sequence包中的pad_sequences方法, 在句子前面或者后面补0. 但是这些零是我们不需要的, 只是为了组成可以计算的结构才填补的. 因此计算过程中, 我们希望用mask的思想, 在计算中, 屏蔽这些填补0值得作用. keras中提供了mask相关的操作方法.

原理

在keras中, Tensor在各层之间传递, Layer对象接受的上层Layer得到的Tensor, 输出的经过处理后的Tensor.

keras是用一个mask矩阵来参与到计算当中, 决定在计算中屏蔽哪些位置的值. 因此mask矩阵其中的值就是True/False, 其形状一般与对应的Tensor相同. 同样与Tensor相同的是, mask矩阵也会在每层Layer被处理, 得到传入到下一层的mask情况.

使用方法

  1. 最直接的, 在NLP问题中, 对句子填补之后, 就要输入到Embedding层中, 将tokenid转换成对应的vector. 我们希望被填补的0值在后续的计算中不产生影响, 就可以在初始化Embedding层时指定参数mask_zeroTrue, 意思就是屏蔽0值, 即填补的0值.

    Embedding层中的compute_mask方法中, 会计算得到mask矩阵. 虽然在Embedding层中不会使用这个mask矩阵, 即0值还是会根据其对应的向量进行查找, 但是这个mask矩阵会被传入到下一层中, 如果下一层, 或之后的层会对mask进行考虑, 那就会起到对应的作用.

  2. 也可以在keras.layers包中引用Masking类, 使用mask_value指定固定的值被屏蔽. 在调用call方法时, 就会输出屏蔽后的结果.

    需要注意的是Masking这种层的compute_mask方法, 源码如下:

    def compute_mask(self, inputs, mask=None):
    output_mask = K.any(K.not_equal(inputs, self.mask_value), axis=-1)
    return output_mask

    可以看到, 这一层输出的mask矩阵, 是根据这层的输入得到的, 具体的说是会比输入第一个维度, 这是因为最后一个维度被K.any(axis=-1)给去掉了. 在使用时需要注意这种操作的意义以及维度的变化.

自定义使用方法

更多的, 我们还是在自定义的层中, 需要支持mask操作, 因此需要对应的逻辑.


首先, 如果我们希望自定义的这个层支持mask操作, 就需要在__init__方法中指定:

self.supports_masking = True

如果在本层计算中需要使用到mask, 则call方法需要多传入一个mask 参数, 即:

def call(self, inputs, mask=None):
pass

然后, 如果还要继续输出mask, 供之后的层使用, 如果不对mask矩阵进行变换, 这不用进行任何操作, 否则就需要实现compute_mask函数:

def compute_mask(self, inputs, mask=None):
pass

这里的inputs就是输入的Tensor, 与call方法中接收到的一样, mask就是上层传入的mask矩阵.

如果希望mask到此为止, 之后的层不再使用, 则该函数直接返回None即可:

def compute_mask(self, inputs, mask=None):
return None

参考资料

Keras自定义实现带masking的meanpooling层

Keras实现支持masking的Flatten层

keras中的mask操作的更多相关文章

  1. keras中的loss、optimizer、metrics

    用keras搭好模型架构之后的下一步,就是执行编译操作.在编译时,经常需要指定三个参数 loss optimizer metrics 这三个参数有两类选择: 使用字符串 使用标识符,如keras.lo ...

  2. keras中自定义Layer

    最近在学习SSD的源码,其中有两个自定的层,特此学习一下并记录. import keras.backend as K from keras.engine.topology import InputSp ...

  3. 深度学习基础系列(十一)| Keras中图像增强技术详解

    在深度学习中,数据短缺是我们经常面临的一个问题,虽然现在有不少公开数据集,但跟大公司掌握的海量数据集相比,数量上仍然偏少,而某些特定领域的数据采集更是非常困难.根据之前的学习可知,数据量少带来的最直接 ...

  4. OpenCV计算机视觉学习(2)——图像算术运算 & 掩膜mask操作(数值计算,图像融合,边界填充)

    在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底是什么呢,下面我们从图像基本运算开始,一步一步学习掩膜. 1,图像算术运算 图像的算术运算有很多种,比 ...

  5. 关于JavaScript中的delete操作

    关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...

  6. 理解CSV文件以及ABAP中的相关操作

    在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑.它仅仅是一种被逗号分割的文本文档吗? 让我们先来看看接下来可能要处理的几个相关组件的词汇的语义. Separat ...

  7. 第32课 Qt中的文件操作

    1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...

  8. 【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】

    一.JQuery中样式的操作 1.给id=mover的div采用属性增加样式.one $("#b1").click(function(){ $("#mover" ...

  9. 【Java EE 学习 32 下】【JQuery】【JQuey中的DOM操作】

    一.JQuery中的DOM操作. 什么是DOM:DOM是一中和浏览器.平台.语言无关的接口,使用该接口可以轻松访问页面中所有的标准组件.DOM简称文档对象模型,是Document Oject Mode ...

随机推荐

  1. Java多线程_Master-Worker设计模式

    Master-Worker模式是常用的并行模式之一,它的核心思想是:系统由Master进程和Worker进程两类进程协同工作,Master负责接收和分配任务,Wroker负责处理子任务.当各个Work ...

  2. Java小菜求职记-以前在Dubbo踩的坑,这次全被问到了,这下舒服了

    前传 小林求职记(五)上来就一连串的分布式缓存提问,我有点上头.... 终于,在小林的努力下,获得了王哥公司那边的offer,但是因为薪水没有谈妥,小林又重新进入了求职的旅途,在经历了多次求职过程之后 ...

  3. 保护wordpress后台登录地址

    前几天有个群友的wordpress网站被后台入侵了,吓得我赶紧看了看网站日志,密密麻麻的404,扫描我的后台登录地址.还好之前有了安全措施: 纯代码保护后台登录地址,防止爆破 //保护后台登录add_ ...

  4. Windows Server 2012 R2 时间同步

    最近的项目两台服务器都是Windows Server 2012的系统,需要做时间同步,现在是一些从网上搜罗的步骤总结. 具体就是配置windows的注册表: 一.服务端配置 (NTP服务器,客户端将根 ...

  5. idea创建web项目,不能自动导入tomcat包,导致调用request的方法时,无法正常调用

    问题现象 分析原因 reques不能正常调用它的各种方法是因为没有导入tomcat包,所以不能正常调用request对象中的各种方法. 解决办法 ================== ======== ...

  6. .NET Core3.1 Dotnetty实战第三章

    一.概要 本章主要内容就是讲解如何在dotnetty的框架中进行网络通讯以及编解码对象.数据包分包拆包的相关知识点. 后续会专门开一篇避坑的文章,主要会描述在使用dotnetty的框架时会遇到的哪些问 ...

  7. mq本机上能用,其他机子上连上不mq

    有一次遇到了记录下.原因是suse11重启后会自动开防火墙. 关了防火墙. rcSuSEfirewall2 stopShutting down the Firewall done

  8. vim编辑器 与etc目录

    第1章         目录结构 1.1  vim  vim故障 vim  是vi的升级版本 vi类似于文本文档  vim类似于notepad++ 编辑 必须先安装vim命令 yum -y insta ...

  9. Node.js调试相关

    如何进行Nodejs性能分析? nodejs性能最重要的两个部分:CPU耗时查看和内存泄漏排查 一,CPU相关 主要思路是两个:借助第三方的工具,以及借助v8自带的性能分析工具 借助第三方的工具 主要 ...

  10. HDU-多校2-Everything Is Generated In Equal Probability(公式+逆元)

    Problem Description One day, Y_UME got an integer N and an interesting program which is shown below: ...