Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

I see you make a mask on feature map before calculate attention weight, i have some question #5

Open
tnkong opened this issue Sep 18, 2019 · 12 comments

Comments

@tnkong
Copy link

tnkong commented Sep 18, 2019

在feature map 上面打掩码是必须的吗? 我看到有些模型没有这么做? 所以想问问您对此的理解,
从代码上来看, 在计算attention权重的时候对图片pad的几何位置打了mask,这样在最终计算注意力权重的时候这个mask的位置就不会产生贡献, 我想您可能是想使用一种局部的注意力机制,不是global的计算而是local的计算注意力权重。我对这个的mask作用有些疑问,请问您是否做过对比实验, 一个有mask, 一个没有mask, 模型性能如何??

@whywhs
Copy link
Owner

whywhs commented Sep 18, 2019

因为我在做batch size的操作时,将小图padding为大图引入了很多冗余的空白信息。又考虑到我的encoder是一个全卷积神经网络,所以Encoder输出的feature map上也是会等比例的存在这些冗余的信息。故我在feature map上加入了mask,目的就是去除引入空白信息的影响。对比实验我没有做过,但是我觉得如果没有mask,效果应该会比较差。

@tnkong
Copy link
Author

tnkong commented Sep 18, 2019

3q

@Jeremy-lf
Copy link

因为我在做batch size的操作时,将小图padding为大图引入了很多冗余的空白信息。又考虑到我的encoder是一个全卷积神经网络,所以Encoder输出的feature map上也是会等比例的存在这些冗余的信息。故我在feature map上加入了mask,目的就是去除引入空白信息的影响。对比实验我没有做过,但是我觉得如果没有mask,效果应该会比较差。

您好,多有打扰,遇到一些问题想让您帮忙看一下。
我用训练好的模型去测试训练集的时候遇到好多问题,遇到很多下面这种类型的错误:
pre:x - - - x - x - x - 2 x - 2 - x - 2 - x - 2 - - - - - - - - - - - - - - - - - - - - - - - - - -
real:x = - 2
pre:M H \perp A B M \perp A B M \perp A B M \perp A B
real:M H \perp A B
pre:x 3 - 3 x - 3 a 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
real:x = 3
pre:x _ { 1 } = - - x _ { - 4 } _ { - 4 } = - \frac { - x - 4 - - - - - - - - - - - - - - - - - - - - -
real:x _ { 1 } = - 4

而以上这些样本的分辨率都相对比较小,图片的size也比较小。我想到的原因就是这些尺寸小的图片在补空白以后,加上椒盐噪声影响太大,很容易把那些点识别为运算符,这样想的不知道有有没有道理?如果是这个原因,我应该如何去避免?

此外,您没有用数据增强,我个人加了一些缩放和小角度的旋转(识别印刷版的公式),作用不是很明显,是不是数据增强在数学公式识别中效果本来就不好?

最后,对于您目前的这个网络结构,有哪些点,您认为可以去优化呢?

@whywhs
Copy link
Owner

whywhs commented Nov 9, 2019

1、图片的分辨率会有一个下限值,因为卷积网络会有一个降维。所以,我不是很清楚你的图片分辨率小到什么程度。目前,我觉得比较好的方案可能是你需要resize一下吧。当然这个还是需要看你数据集的具体信息,你可以给我详细说明一下。
2、对于数据增强来说,小角度旋转在手写体上效果很明显。因为手写体会有些人喜欢倾斜着写字。对于印刷体不好,我觉得是因为印刷体都很标准,不存在倾斜书写的情况,所以可能效果不好。但对于数据增强来说,我觉得是有必要且会有提升的,建议你可以根据印刷体的特点有针对性的尝试数据增强。
3、至于优化的方向,你可以从增加正则,缓解过拟合,数据增强这几个方面尝试。目前,我在这几个方面都取得了不错的结果。

@Jeremy-lf
Copy link

Jeremy-lf commented Nov 11, 2019

WeChatadf7f845a42505de354ba1f8bef32183

WeChat832599c1ee85fda607b29bc6123ac73c

WeChatc72f5cd343ec2b6b8f28cecd85668686

1、这些图片是我的截下来的图,用训练好的模型去测试训练集,出错的很多都是这些分辨率和尺寸比较低和小的公式,如果这些图和那些size较大的图片在一个批次当中,补零以后就基本都是空白了,您感觉这些图片应不应该加入到训练集当中呢? 2、您在计算特征图mask的区域时,用的是原图大小除以16,然后加一,那么会不会导致信息有丢失呢?毕竟卷积是通过卷积核大小的区域卷积的。

3、最后还有个疑惑,测试的时候,如果我单张去测试,那么它的效果会不会打折?

@Jeremy-lf
Copy link

Jeremy-lf commented Nov 13, 2019

还遗漏了一个问题,batch_size应该选多少比较合适8,12,16?我最多可以用四块卡,因为这个补边我觉得影响挺大的,所以对于大点的批次有疑虑

@whywhs
Copy link
Owner

whywhs commented Nov 13, 2019

1、看你给出来的图片,边上大片的空白也是吗?如果边上的空白也是的话,那你需要先把这些空白裁剪一下吧。另外,你效果不好的原因,也是因为你这些都是印刷体的,我训练的都是手写体的,数据上还是有很大不同的。所以,建议你利用你的数据自己重新训练一下。
2、全卷积神经网络的大小是等比例降低的,我用的DenseNet出来的Feature Map的大小是原图的1/16。所以出来的Mask也一样是1/16,不会有损失的。
3、测试的时候,效果不会因为你单张变差。
4、Batch size目前我选6会好些,batch size变大之后会带来干扰。但具体的我还没有去仔细查看。

@Jeremy-lf
Copy link

很感谢您能解答我的疑虑,上边那些图白色区域是我的公式,其他的是我截图接下来的。其他几个问题,您回答的也很好,至于最后这个batch_size的选择,我之前用的是12,我再尝试一下其他的值。后续有新的想法在与您交流,很感谢!

@Jeremy-lf
Copy link

您好,又要打扰您了。我之前测试的时候是用训练中的验证集一个批次批次测试,后边试了一下一张一张测试,发现效果变差了很多,下降了4个百分点,为什么会下降这么多呢?我训练的时候batch_size为12,希望您能解答一下

@whywhs
Copy link
Owner

whywhs commented Nov 19, 2019

确实是会下降对吗?这个的实验我没有去做,我开始以为不会有变化。
如果是下降了的话,我觉得有可能是我在训练的时候一开始加入了MASK吧?因为对于一张图片来说,MASK其实没有意义,有可能会造成干扰。
所以,我的建议是,你可以在训练的时候以bs为1进行,同时去掉数据加载时引入的MASK,这样对于test时用一张一张图片应该会有所提高。

@Jeremy-lf
Copy link

确实会下降,而且下降的还蛮大的,我实验了一下,一次两张图片和一次一张图片,精度就能差4%左右。我认为原因就在于单张测试的时候,大多图片没有了黑边,而训练的时候都有,所以网络可能就习惯了有黑边这种。所以我想着,能不能在训练load数据的时候,对所有图片大小排个序,这样一个批次进去的时候,基本不会有很多黑边出现。其次,您说的这个方法应该还行,就是这样加载数据的时候去掉mask,后面算那个卷积完的比例的时候就不太好确定(可能稍微麻烦一点)

@whywhs
Copy link
Owner

whywhs commented Nov 19, 2019

对图片排序相当于你没有做shuffle,我是不建议你这样做的,你想的话可以试试。
至于你说的是因为padding导致有黑边,我觉得影响应该是在CNN部分,因为我的CNN没有对黑边做处理。去掉MASK的操作不麻烦,就是在load数据的时候,把我的加padding地方删除,然后Decoder部分把MASK的地方删除。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants