Keras 笔记之Mask层

keras 的Mask层
先看下官方文档的解释

个人博客地址:http://xurui.club/

Masking层
keras.layers.core.Masking(mask_value=0.0)
使用给定的值对输入的序列信号进行“屏蔽”,用以定位需要跳过的时间步

对于输入张量的时间步,即输入张量的第1维度(维度从0开始算,见例子),如果输入张量在该时间步上都等于mask_value,则该时间步将在模型接下来的所有层(只要支持masking)被跳过(屏蔽)。

如果模型接下来的一些层不支持masking,却接受到masking过的数据,则抛出异常。

例子
考虑输入数据x是一个形如(samples,timesteps,features)的张量,现将其送入LSTM层。因为你缺少时间步为3和5的信号,所以你希望将其掩盖。这时候应该:

赋值x[:,3,:] = 0.,x[:,5,:] = 0.

在LSTM层之前插入mask_value=0.的Masking层

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(32))

在用LSTM等模型处理文本数据时,因为文本是变长的,所以在处理的过程中,要先进行长度的统一。常用的方法为
X_data = sequence.pad_sequence(maxlen=10,value=0,padding='post')
此步骤将X_data统一长度为10.
如[1,2,3,4,5]–>变为[1,2,3,4,5,0,0,0,0,0]
这样就可以把X_data 输入到model的Embedding等层。
然而,交给LSTM处理时,还有对数据进行反padding.也就是把后面的0去掉。
这个时候就是Mask层派上用场的时候了。Mask(0)经过Mask后,可以忽略X_data中所有的0,当然,把后面补的0去掉是可以理解的。那如果句中有0呢?一般情况下,如文本处理,会把文本映射成index,这样最大的好处就是节约空间。有些大文本数据,几百个G,经过了index映射,也就还剩几个G。这是题外话了,我们在keras的Embedding层会讲的。而这个时候index中的0,往往是一些无法转成词向量的低频词,这些词没有词向量,去掉对整个文本的处理也没有影响,所以在Mask中和补上的0一起忽略就好啦。
这里的忽略是什么意思呢?也就是不处理。
很多朋友以为Mask后会直接把0去掉。其实不是的。
可以做一些实验,如model的Mask后接个LSTM层,对LSTM输出每个时间步的值,发现,如果设置了Mask层,则上面[1,2,3,4,5,00000]的数据处理结果,前5位是经过了计算,补0的对应的位置的值,和第5位的值相同,也就是说LSTM对后面补0的位置并没有计算。

猜你喜欢

转载自blog.csdn.net/u010976347/article/details/80618931