许多深度学习算法落地阶段,tensorflow训练好的参数需要转换到caffe平台。
我们采用了https://blog.csdn.net/pc9803/article/details/100055213中的半自动化方法,只是其中一些步骤进行了优化。可以肯定的是这种方法是完全可行的,我们的模型(有20多层)成功转换后,两个平台模型输出结果的L1 distance为1e-07级别,cos distance为1.00,也就是说tensorflow与caffe平台之间的精度误差很小,完全可以忽略。转换流程和上面博客的流程基本相似,这里就不再赘述了。
本文的重点就是在实际转换过程中一些有用tips分享给大家:
-
非对称padding问题。在stride>1的卷积、反卷积操作中,如果需要填充的像素不对称,比如只需要填充一列或一行像素,那么tersorflow如果采用‘SAME’模式,就会优先填充右下,而caffe优先填充左上,这就会导致两个平台的运算结果差异很大。具体解决方法,就是tensorflow手工padding,可参考https://zhuanlan.zhihu.com/p/115081459?utm_source=wechat_session&utm_medium=social&utm_oi=751930042400903168。
-
BN层的问题。(1)BN层在训练和测试阶段的计算方式不同,所以模型转换时两个平台切记要都是测试模式的模型。(2)另外一个非常关键的问题就是BN层中的eps默认值问题,tensorflow默认1e-03,而caffe默认1e-05。这个问题不引起注意,就会导致最后转换后模型的输出相似度很高,cos distance甚至超过0.9,很容易认为是平台误差导致的。