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

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