【Pytorch2caffe】pytorch转caffe的一些注意细节

收集整理,感谢以下作者的解释。在设计pytorch网络结构的时候,务必注意下面几个点,防止训了很久的模型转成caffe不能用的情况。

#1、
q&a:#0929_1  pytorch 中的ceil mode 为false,则默认当奇数数feature size时,去掉多余的边的数据再进行maxpool;反之当ceil mode为true,则保留多余边数据,再maxpool
#规避 maxpool 时,尽量送入池化层时采用偶数hxw的feature map

Pytorch中池化层默认的ceil mode是false(向下取整)(2.5x2.5 -> 2x2),而caffe只实现了ceil mode= true的(向上取整)(2.5x2.5 -> 3x3)。


q&a: https://github.com/JDAI-CV/fast-reid/issues/210#issuecomment-669010431

#2、
q&a:#0929_2    prototxt注意问题推理过程发现每次的结果都不一样,发现prototxt中每个卷积层下都有初始化权重的偏差(weight_filter、bias_filter和maxpool 的ceil_model),将其统统删除;maxpool 的ceil_model在caffe中默认是true

q&a: https://www.cnblogs.com/wangxiaobei2019/p/14167822.html

#3、
q&a:#0929_3   如何在caffe做点乘操作?即怎么解决a*b1的问题 ??

code:
'''
对应的python代码是

def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)
那么思路就有了

需要先将b1拉到和a一样的size,再做点乘

实现:

对应的操作就是caffe的scale层
'''

q&a: 
https://github.com/xxradon/PytorchToCaffe/issues/29


#4、
q&a:#0929_4 该版本的如果遇到相关报错,https://github.com/xxradon/PytorchToCaffe ; 记得加一个net.eval()

q&a: https://github.com/xxradon/PytorchToCaffe/issues/8


#5、关于Pytorch BN层的参数设置的问题
在Caffe中训练时设置use_global_stats=false,测试时需要改为use_global_stats=true。
在PyTorch中model.train()默认track_running_stats=true,测试时model. eval()默认track_running_stats=false。

q&a:0929_5 !!!!pytorch的train和eval两个模式下bn层输出不一样;!!!关于eval的重要性!!!

trainning=True, track_running_stats=True。这个是期望中的训练阶段的设置,此时BN将会跟踪整个训练过程中batch的统计特性。
trainning=True, track_running_stats=False。此时BN只会计算当前输入的训练batch的统计特性,可能没法很好地描述全局的数据统计特性。
trainning=False, track_running_stats=True。这个是期望中的测试阶段的设置,此时BN会用之前训练好的模型中的(假设已经保存下了)running_mean和running_var并且不会对其进行更新。一般来说,只需要设置model.eval()其中model中含有BN层,即可实现这个功能。[6,8]
trainning=False, track_running_stats=False 效果同(2),只不过是位于测试状态,这个一般不采用,这个只是用测试输入的batch的统计特性,容易造成统计特性的偏移,导致糟糕效果。
相关详细解释:https://www.cnblogs.com/jins-note/p/13440772.html

!!!!!tips:
如果BatchNorm2d的参数val,track_running_stats设置False,那么加载预训练后每次模型测试测试集的结果时都不一样;track_running_stats设置为True时,每次得到的结果都一样。

q&a::https://www.zhihu.com/question/282672547/answer/529154567

上一篇:opencv for android(十七):使用opencv的dnn模块加载caffe模型进行人脸识别


下一篇:Ubuntu Touch 操作系统正式版将于10月17日开放下载