赞
踩
NLP的任务处理中,处理的通常是一句句话,每一句话的长度是不同的,这给训练带来了麻烦。特别是为了高效的GPU并行运算,数据大小的一致性就很重要了,除非batch_size设置为1。
因此我们就需要把一堆句子的长度统一,通常是用最长的句子的长度为标准(也可以自定义),对短于这个长度的句子进行padding,长于的就截掉。keras中可以用proprecessing来出来
data:输入的文本数据
maxlen:文本最大长度
dtype:padding的数据类型,通常是整数
padding:padding的位置,可以为一句话开头“pre”,也可以是一句话结束“post”
truncating:对过长截断的位置,可以为一句话开头“pre”,也可以是一句话结束“post”
value:即padding词的id,通常是0,在keras中0会比较好。当然也可以自定义为1,或其他整数
k.preprocessing.sequence.pad_sequences(data, maxlen=300, dtype='int32', padding='pre', truncating='pre', value=0.0)
那么经过了上面的padding,句子就变得一样长了,方便进行训练了。但是训练过程中也会对于padding的部分进行学习,就学到一些无用的东西,最好能让这些padding不参与运算或者参与loss的计算就好了。
因此在keras的embedding中可以设置mask_zero=True,这一步并不是把padding部分的向量全部置为0,还是会和其他词一样正常出结果,仅仅是将这些padding标记起来,会影响后序的计算,。
加入后序接的LSTM,那么LSTM这一步,被mask的就不用参与运算了。因此就消除了padding的影响。
但是这里会有一个影响,那就是不能输出sequence了,因此不参与运算了,所以对应的位置就没有输出了,因此LSTM就不能return sequence了,因为return的长度不同,后序就无法计算了,只能return output。
如果还希望return sequence,同时也希望可以进行mask处理,那么可以考虑自定义一个带mask的loss function来消除padding对loss计算的影响,同样达到了效果。这一步可以参见我的另一篇文章。
https://blog.csdn.net/weixin_42175217/article/details/104786046
关于torch中的方式后序再更新
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。