当前位置:   article > 正文

img2markup每个batch里图像大小不同在计算attention时mask掉padding部分的方法_在计算attention score的时候如何对padding做mask操作

在计算attention score的时候如何对padding做mask操作

  还是目前在做的数学公式识别问题,目前我使用的代码框架是opennmt,因为训练数据每张大小都不同,在训练的时候需要对每个batch里的图像进行pad,主要就是将同一个batch里的图像pad到最大的那张图像大小,而且是在图像右边进行pad(注意预处理图像的时候图像下方和右边一定不要贴着图像中的符号的位置进行切图,一定要留白,后边会解释这个原因)。现在的目的是在训练的解码部分mask掉图像的pad部分,因为要用自然场景的图像进行训练而pad部分会对精度产生影响(如果是白底黑字的合成数据pad不会造成影响),下图左是pad示意图,图右是我的训练数据的留白示意图(红框部分就是我的留白),

  mask掉pad部分主要是将pad部分的值置为负无穷,注意不是将输入编码器的原图的pad部分置为负无穷,而是将经过编码器然后在解码器中算完attention score的feature map的pad部分置为负无穷(也即计算softmax前的feature map)。mask的原理是将pad部分置为负无穷,然后计算softmax后pad部分的权重就是零,这样就消除了pad部分的影响。

  mask的实现过程首先需要计算出原图像中pad部分在feature map中的映射位置,其主要方法就是计算原图和feature map大小的比例,然后根据原图中pad部分的坐标位置计算出pad部分在feature map中的位置(注意因为根据比例计算feature map中的映射位置,所以计算出的结果一般都不是整数,我这里建议使用四舍五入取整不要使用向上取整或者向下取整)。可以根据目标检测中原图ROI区域到feature map映射位置的参考方法,如:

https://blog.csdn.net/qq_29133371/article/details/53172994

https://blog.csdn.net/w113691/article/details/80567392

 得到feature map中pad位置的映射之后就可以直接把这些部分的值置为负无穷就完成了mask任务。现在解释一下为什么要在图像的下部和右部留白,我在刚开始训练的时候没有留白,然后在训练过程中出现梯度消失,参数不更新全部是nan的问题,然后找了好久的原因最后分析可能就是没有留白的原因,因为我们计算出的原图中pad部分在feature map中的位置不可能完全完美的对应,可能feature map中置为负无穷的点在原图中的映射也包含图像内容,如下如图所示,红色表格是feature map,其中填有p的是feature map中和原图pad部分的映射,左边原图的下方绿色表格是pad部分,因为前面说的我们计算的原图pad部分和feature map中pad部分映射不是完美对应,造成feature map中应该置为负无穷的部分在原图中的映射不仅包含了pad部分,也包含了原图中的部分如蓝框所示,然后我们把feature map中的pad置为负无穷就会造成原图中的信息缺失,这样训练就会出错,累计多了就出现梯度为nan的情况。解决这个问题的办法就是上面说的在图像的下方和右方留白(如果是四周pad就在四周留白)。

留白之后的示意图如下:虽然feature map的pad部分在原图中的映射也包含了原图的部分内容,但是这部分内容是留白并没什么用也就不会造成图像信息的丢失。

其他可参考:

http://juditacs.github.io/2018/12/27/masked-attention.html

https://www.pianshen.com/article/1916976296/

https://discuss.pytorch.org/t/applying-mask-caused-nan-grad/15470

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号