Fanxu Meng

Results 55 comments of Fanxu Meng

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

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

> 你好,你转换前后的结果对齐了么,我已经设置成了eval模式,还是结果不一样,能不能和你沟通交流一下,不知道是不是我理解的有偏差, 我微信17809207817,非常非常感谢呀 需要注意:转换前的模型,还有转换后的模型都需要设置为eval模式。如果检查没有问题,可以把你转换的代码以及结果贴一下,我看看问题出在哪里了。

> 我转的resnet100, 和你给的resnet结构不一样,我按照论文的理解自己加了deploy函数 需要修改代码的时候,建议先把基本的IBasicBlock写完,测试转化前后等价了,再完成整个模型的代码。 你的这个IBasicBlock代码的forward函数前向传播过程是(bn1,conv1,bn2,prelu,conv2,bn3), 但是你deploy的时候: - bn1在前,conv1在后,不该照搬我的实现,建议解决方案: - 把bn1和conv1合并,可以参考https://github.com/fxmeng/RMNet/blob/0829642895f23c7787ff18b56507851faaa15331/models/rmobilenet.py#L22, 不要用torch.nn.utils.fuse_conv_bn这个,这个的顺序和你的也是反的。 - 保证residual通过bn1,conv1结果不变,这时conv1不能dirac初始化了,需要使用bn1对输入变化的逆变换。(好处是变换完可以保留bn1,finetune效果好;但是实现难度大,建议在充分理解算法之后再尝试) - 对bn1的操作应该是bn2的,bn3你没有进行操作,其实bn3的操作是比较复杂的,建议: - 把conv2和bn3合并,这时不需要考虑bn3,只需考虑conv2的weight和bias就行 - 参考我代码里对bn2的实现 - 对prelu的处理是错误的: - 如果你训练的时候就想用prelu,那参考我的mobilenet实现 - 如果你训练时候想用relu,参考我的resnet实现 - 训练时候残差连接最后没有接relu,效果可能会不好 - 如果是故意没有用relu,那上一条就只能用prelu了,且可以将连续两个3*3卷积合并为一个5*5卷积

> > 我是只把两个加在一起比较差的通道删除了,这种细节处理就像调参一样,需要多对比。 > > 作者,您好,请问判断比较差的通道依据是什么哈?有点不太明白,还望指教,谢谢 评价通道好坏的方法非常多,每种方法都各有各的道理,我这里使用的方法是使用用一个mask乘在待裁剪的通道上,在训练的时候稀疏化这个mask,当一个通道对应的值被稀疏化到接近0,就把这个通道删除。