Caffe代码迁移为PyTorch的注意事项

进入研究生生活已经有三个月了,每天的生活就是上课、看论文、跑模型,也从来没有自己动手写过完整的模型。最近想在一个Caffe模型上加个模块,奈何实在改不动Caffe代码(C++忘的差不多了,日后一定好好看看Caffe底层),于是转战PyTorch。

本文主要介绍一下注意事项,不具体展开介绍怎么样一步一步来,只说明一下大致步骤,具体细节只有做了才能明白。

Caffe网络结构的迁移

Caffe的网络结构看起来不是非常的清楚,可以借助可视化网站来查看原程序的网络。PyTorch中nn.Module提供的层包含了Caffe中的层,迁移起来很方便。可阅读这篇文章Caffe代码转化为PyTorch代码
迁移时,尽量保持每一层的名称与Caffe相对应,避免以后模型加载的麻烦。

:Caffe中反卷积层默认采用向上取整,而PyTorch中的反卷积层默认采用向下取整,很可能导致迁移后数据结果与Caffe的输出结果不一致。此处提供两篇文章PyTorch取整方式Caffe取整方式供参考。


Caffe的预训练模型转化至PyTorch

很简单的方式就是通过读取Caffemodel中的每一层参数抽出来,写成一个pkl文件。再通过PyTorch加载pkl文件导入。提供一篇文章:预训练模型转化

:当完成转化后,在PyTorch写读取文件的函数时,千万别命名为state_dict,这是nn.Module的函数,如果你写了,这个方法就被覆盖了。我发现很多人的博客上命名为这个,就会导致后面保存模型的时候,保存结果始终是原始模型。


训练小规模epoch,观察loss

代码跑起来后,观察loss在小规模上是否下降。
:如果使用自定义的loss,那么一定要确保loss计算过程中全程采用Tensor进行计算,否则无法记录计算步骤,导致反向传播失败,从而导致参数得不到更新,最后结果就是每个epoch的loss都是一样的。


其他注意点

使用PyTorch计算时注意点

在使用Tensor运算时,一定注意使用Tensor的运算方式,不要使用python内嵌函数。
例如:如图所示,两个Tensor做加法后,将其变成float类型。
正确做法为:
在这里插入图片描述
错误做法 为:
在这里插入图片描述

PyTorch中没有CropLayer

在迁移过程中,发现原来Caffe代码中有使用CropLayer,但是PyTorch中却没有这个层。可以按照这篇博客,手动实现计算。Caffe的CropLayer

参考文章
PyTorch取整方式
Caffe取整方式
Caffe的CropLayer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章