keras中的mask操作
使用背景
最常见的一种情况, 在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
情况.
使用方法
最直接的, 在
NLP
问题中, 对句子填补之后, 就要输入到Embedding
层中, 将token
由id
转换成对应的vector
. 我们希望被填补的0值在后续的计算中不产生影响, 就可以在初始化Embedding
层时指定参数mask_zero
为True
, 意思就是屏蔽0值, 即填补的0值.在
Embedding
层中的compute_mask
方法中, 会计算得到mask
矩阵. 虽然在Embedding
层中不会使用这个mask
矩阵, 即0值还是会根据其对应的向量进行查找, 但是这个mask
矩阵会被传入到下一层中, 如果下一层, 或之后的层会对mask
进行考虑, 那就会起到对应的作用.也可以在
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中的mask操作的更多相关文章
- keras中的loss、optimizer、metrics
用keras搭好模型架构之后的下一步,就是执行编译操作.在编译时,经常需要指定三个参数 loss optimizer metrics 这三个参数有两类选择: 使用字符串 使用标识符,如keras.lo ...
- keras中自定义Layer
最近在学习SSD的源码,其中有两个自定的层,特此学习一下并记录. import keras.backend as K from keras.engine.topology import InputSp ...
- 深度学习基础系列(十一)| Keras中图像增强技术详解
在深度学习中,数据短缺是我们经常面临的一个问题,虽然现在有不少公开数据集,但跟大公司掌握的海量数据集相比,数量上仍然偏少,而某些特定领域的数据采集更是非常困难.根据之前的学习可知,数据量少带来的最直接 ...
- OpenCV计算机视觉学习(2)——图像算术运算 & 掩膜mask操作(数值计算,图像融合,边界填充)
在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底是什么呢,下面我们从图像基本运算开始,一步一步学习掩膜. 1,图像算术运算 图像的算术运算有很多种,比 ...
- 关于JavaScript中的delete操作
关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...
- 理解CSV文件以及ABAP中的相关操作
在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑.它仅仅是一种被逗号分割的文本文档吗? 让我们先来看看接下来可能要处理的几个相关组件的词汇的语义. Separat ...
- 第32课 Qt中的文件操作
1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...
- 【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】
一.JQuery中样式的操作 1.给id=mover的div采用属性增加样式.one $("#b1").click(function(){ $("#mover" ...
- 【Java EE 学习 32 下】【JQuery】【JQuey中的DOM操作】
一.JQuery中的DOM操作. 什么是DOM:DOM是一中和浏览器.平台.语言无关的接口,使用该接口可以轻松访问页面中所有的标准组件.DOM简称文档对象模型,是Document Oject Mode ...
随机推荐
- 表单和 v-model
思维导图 form 做表单一定要用 form+button组合 <template> <div id="app"> 登录 <form @submit. ...
- 关于H标签 DL DT DD标签的一个小故事
看了一篇关于SEO论坛的论文,大概故事内容是:一个专业的销售公司,里面SEO 技术多多,可就是销售网站的SEO的情况极为恼火.这天,老板又招到了一个SEO,直接聘为SEO主管全权负责网站的SEO,并 ...
- C++字符串与指针
字符串初始化 在C++中基本数据类型并不包括string,string类型其实是一种类类型,通过STL函数库中的模板类basic_string 实例化得到. int main () { // stri ...
- 焦大:逛网seo案例浅析
http://www.wocaoseo.com/thread-93-1-1.html 逛,发现喜欢.这或许是很多人上网的喜欢方式,我隐约记得白鸦在一次采访上说到现在人的购物方式,在淘宝上人们决定买一件 ...
- 领导给了一堆无序杂乱的数据,我写了个Python自动化脚本
这个问题算是群友答疑.如果说同事或者老板给你一堆这样的数据,你估计会抓狂,该怎么处理呢? 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. ...
- Photon Server伺服务器在LoadBalancing的基础上扩展登陆服务
一,如何创建一个Photon Server服务 参见此博客 快速了解和使用Photon Server 二, 让LoadBalancing与自己的服务一起启动 原Photonserver.config文 ...
- CodeForces - 1114D-Flood Fill (区间dp)
You are given a line of nn colored squares in a row, numbered from 11 to nn from left to right. The ...
- [BUUOJ记录] [GYCTF]EasyThinking
主要考察ThinkPHP6.0的一个任意文件写入的CVE以及突破disable_function的方法. ThinkPHP6.0.0任意文件操作漏洞 理论分析 进入题目是一个简单的操作页面,dirma ...
- Oracle错误 ora-12514 解决方法-九五小庞
成功连到数据库上之后,查看listener状态:lsnrctl status status READY 状态,需要由非归档转为归档模式,故操作如下: 1.关闭数据库shutdown immediate ...
- 从两表连接看Oracle sql优化器的效果
select emp.*,dept.* from tb_emp03 emp,tb_dept03 dept where emp.deptno=dept.id -- 不加hint SQL> sele ...