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

疑问:结构转换后输出怎么不一样? #12

Open
luhaiwei opened this issue Dec 2, 2021 · 13 comments
Open

疑问:结构转换后输出怎么不一样? #12

luhaiwei opened this issue Dec 2, 2021 · 13 comments

Comments

@luhaiwei
Copy link

luhaiwei commented Dec 2, 2021

image
image
您好,最近拜读了您的论文,基于目前的重参数化提出了新颖性的观点,想继续研究以下代码,但是发现输入相同的值,不知道为什么结构转换后输出不一样?

@fxmeng
Copy link
Owner

fxmeng commented Dec 2, 2021

需要在model.eval()下对比,因为结构不同了,model.train()时,BN层的均值方差会有些变化。

@luhaiwei
Copy link
Author

luhaiwei commented Dec 3, 2021

需要在model.eval()下对比,因为结构不同了,model.train()时,BN层的均值方差会有些变化。

感谢作者的答复!

还有另外一个问题想请教一下:
image
上图大致是MobileNetv2的一个Block,从左到右,分别为正常训练、networkslim稀疏稀疏训练、“RM(reserving and merging)”、平坦网络裁剪

对于第三幅图不知道画的正不正确,有一些疑问:
第一种理解就是Block的输入经过跳跃连接的BN层之后输出和另一条分支的输出合并(如第三幅图所示),之后到第四幅图进行裁剪;
第二种理解就是在第三幅图(RM)中直接将Block的输入和另一条分支的输出合并,跳跃连接中的BN层的训练只是为了在第四幅图中网络裁剪时判断保留哪些重要的特征作为Block的输入。

@fxmeng
Copy link
Owner

fxmeng commented Dec 5, 2021

我自己只用过第一种方法,但是剪枝的范式你可以多试试,相信可能会有比我用的更好的方法。

@luhaiwei
Copy link
Author

luhaiwei commented Dec 6, 2021

感谢您的回复!
image

您好,想问一下,在网络裁剪的时候,当block含有跳跃连接,按照剪枝范式,如果在跳跃连接分支中裁剪后剩余通道索引为[1,4,5,7,8],另一个分支裁剪后剩余索引是[2,3,5,9],这样的情况该怎么处理呢?谢谢!

@fxmeng
Copy link
Owner

fxmeng commented Dec 6, 2021

我是只把两个加在一起比较差的通道删除了,这种细节处理就像调参一样,需要多对比。

@luhaiwei
Copy link
Author

luhaiwei commented Dec 8, 2021

我是只把两个加在一起比较差的通道删除了,这种细节处理就像调参一样,需要多对比。

谢谢您的回答,感觉受益匪浅,学习到了很多 ~
请问判断加在一起差一些的通道标准是什么?是根据通道本身值的大小,或者是根据删除后准确率的下降程度?

@XinyingZheng
Copy link

XinyingZheng commented Dec 23, 2021

你好,你转换前后的结果对齐了么,我已经设置成了eval模式,还是结果不一样,能不能和你沟通交流一下,不知道是不是我理解的有偏差, 我微信17809207817,非常非常感谢呀

@fxmeng
Copy link
Owner

fxmeng commented Dec 23, 2021

你好,你转换前后的结果对齐了么,我已经设置成了eval模式,还是结果不一样,能不能和你沟通交流一下,不知道是不是我理解的有偏差, 我微信17809207817,非常非常感谢呀

需要注意:转换前的模型,还有转换后的模型都需要设置为eval模式。如果检查没有问题,可以把你转换的代码以及结果贴一下,我看看问题出在哪里了。

@XinyingZheng
Copy link

XinyingZheng commented Dec 23, 2021 via email

@fxmeng
Copy link
Owner

fxmeng commented Dec 24, 2021

我转的resnet100, 和你给的resnet结构不一样,我按照论文的理解自己加了deploy函数

需要修改代码的时候,建议先把基本的IBasicBlock写完,测试转化前后等价了,再完成整个模型的代码。
你的这个IBasicBlock代码的forward函数前向传播过程是(bn1,conv1,bn2,prelu,conv2,bn3),
但是你deploy的时候:

  • bn1在前,conv1在后,不该照搬我的实现,建议解决方案:
  • 对bn1的操作应该是bn2的,bn3你没有进行操作,其实bn3的操作是比较复杂的,建议:
    • 把conv2和bn3合并,这时不需要考虑bn3,只需考虑conv2的weight和bias就行
    • 参考我代码里对bn2的实现
  • 对prelu的处理是错误的:
    • 如果你训练的时候就想用prelu,那参考我的mobilenet实现
    • 如果你训练时候想用relu,参考我的resnet实现
  • 训练时候残差连接最后没有接relu,效果可能会不好
    • 如果是故意没有用relu,那上一条就只能用prelu了,且可以将连续两个33卷积合并为一个55卷积

@XinyingZheng
Copy link

XinyingZheng commented Dec 24, 2021 via email

@luhaiwei
Copy link
Author

我是只把两个加在一起比较差的通道删除了,这种细节处理就像调参一样,需要多对比。

作者,您好,请问判断比较差的通道依据是什么哈?有点不太明白,还望指教,谢谢

@fxmeng
Copy link
Owner

fxmeng commented Dec 28, 2021

我是只把两个加在一起比较差的通道删除了,这种细节处理就像调参一样,需要多对比。

作者,您好,请问判断比较差的通道依据是什么哈?有点不太明白,还望指教,谢谢

评价通道好坏的方法非常多,每种方法都各有各的道理,我这里使用的方法是使用用一个mask乘在待裁剪的通道上,在训练的时候稀疏化这个mask,当一个通道对应的值被稀疏化到接近0,就把这个通道删除。

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