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

关于TRANS Ⅲ中的注意事项 #16

Closed
Orangerccc opened this issue May 22, 2021 · 10 comments
Closed

关于TRANS Ⅲ中的注意事项 #16

Orangerccc opened this issue May 22, 2021 · 10 comments

Comments

@Orangerccc
Copy link

您好!不好意思打扰您!!我最近拜读您的论文,看到了TRANS Ⅲ,不得不说这种变换确实很是新颖,但看到其中您提到的注意点,即如果第二层K*K 如果对输入做了0填充,那么公式8是不成立的,解决方案是用第一次等价过来的卷积的偏置 REP(b1) 作为填充,对这一点我有点不太理解,您能给详细解释一下不成立的原因以及解决方案的原因么?谢谢您!

@Orangerccc
Copy link
Author

补:我又重新计算了一遍这个卷积过程中的值,似乎结果是一致的,我没有想清楚您这个不成立的原因在哪里,可能是我的理解问题,还烦请您解惑,多有叨扰,谢谢!

@DingXiaoH
Copy link
Owner

DingXiaoH commented May 24, 2021 via email

@Orangerccc
Copy link
Author

感谢您的回复!
您可能没有明白我的问题,我不太清楚您论文中Trans Ⅲ的如果有padding,padding为0,不成立的原因,并且为什么以REP(b1)作为padding 公式又成立的呢?

另外,您这个公式8成立的意思,是如果成立的话,公式8中的前面括号的部分,就可以被因式分解出来 ,即,公式8可以等价公式10, 不成立,公式8和公式10不等价,是这个意思么?

打扰您了,不好意思,祝好!
s

@konioy
Copy link

konioy commented Jun 22, 2021

如果k*k卷积核的padding=1,是不是等式8成立?是不是可以把BNAndPadLayer换成普通的BatchNorm2d?
@DingXiaoH

@DingXiaoH
Copy link
Owner

公式8成立的前提是,KxK的输入等于1x1-BN的输出。在KxK有padding的情况下,KxK的输入不等于1x1-BN的输出(多了一圈0)。在这种情况下让Trans Ⅲ成立的方法是用1x1的等效bias去pad。
这是因为,Trans III成立的前提是【KxK卷积的输入应该等于 I * F^(1) 的结果再叠加 constant matrices(即REP(b^(1))】,只有这样才能把b^(1)转换到b^(2)里去(在constant matrices上卷积的结果还是constant matrices)
1)如果没有padding,这个条件显然成立。
2)如果用0去pad,这个条件不成立,因为pad的那一圈全都是0,不是b^(1) 的值。
3)如果用b^(1) 的值去pad,这个条件就成立了。

@DingXiaoH
Copy link
Owner

如果k*k卷积核的padding=1,是不是等式8成立?是不是可以把BNAndPadLayer换成普通的BatchNorm2d?
@DingXiaoH

不是。padding=0才可以把BNAndPadLayer换成普通的BatchNorm2d。请参考上面的解释

@konioy
Copy link

konioy commented Jun 23, 2021

谢谢你的回复!我有点明白了。
但是,我的理解是用0和b^(1)效果是一样的,pad的那一部分都可以当做常数算作bias。
但是用你提供的代码做实验来看,用0做pad会有误差不是完全一样。还是不理解为什么?

@DingXiaoH
Copy link
Owner

这是padding的问题。
请参考论文第4页最后一段。
最简单的解决方案是 让1x1有padding,3x3没有padding:
ori_3_3 = nn.Conv2d(in_channels=256, out_channels=16, kernel_size=3, stride = 1, padding = 0, bias=True)
ori_1_1 = nn.Conv2d(in_channels=3, out_channels=256, kernel_size= 1, stride=1, padding=1, bias=True)

@mrgreen3325
Copy link

这是padding的问题。
请参考论文第4页最后一段。
最简单的解决方案是 让1x1有padding,3x3没有padding:
ori_3_3 = nn.Conv2d(in_channels=256, out_channels=16, kernel_size=3, stride = 1, padding = 0, bias=True)
ori_1_1 = nn.Conv2d(in_channels=3, out_channels=256, kernel_size= 1, stride=1, padding=1, bias=True)

謝謝
但3x3 如果沒有padding W h 會縮小,我的情況需要w h 不变,有沒有其他方法?

@mrgreen3325
Copy link

这是padding的问题。
请参考论文第4页最后一段。
最简单的解决方案是 让1x1有padding,3x3没有padding:
ori_3_3 = nn.Conv2d(in_channels=256, out_channels=16, kernel_size=3, stride = 1, padding = 0, bias=True)
ori_1_1 = nn.Conv2d(in_channels=3, out_channels=256, kernel_size= 1, stride=1, padding=1, bias=True)

大大,你給的方法在我的情況work 了。
另外,請問你覺得k x k 接k x k conv2d 有方法能融合起來嗎?

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

4 participants