週末在家無聊,想了想覺得有必要整理一下如何將其他框架(如Tensorflow, MxNet, Caffe, Keras等)訓練的模型匯入到Pytorch框架中。

也許有人會問:既然有現成的模型為啥還轉成pytorch?直接用不可以嗎?

也許有人會說:直接重新訓練一個就可以了嗎?

也許有人會說:直接用onnx。

也許。。。

人生苦短,我選擇pytorch,不想浪費過多時間去學習各種各樣的深度學習框架。

Tensorflow用起來太複雜,caffe編譯太麻煩,加層也是相當麻煩……

=======================================================

github上也許有一些keras轉pytorch,caffe轉pytorch的程式碼,甚至據說onnx也可以。但事實上,我曾試過諸多各種方法,但沒有哪一種比較通用,部分僅適用於個別模型,有的甚至都無法執行,浪費了大量的時間。

最終的最終,還是走上了純手工預訓練模型匯入的方式。

先簡單說一下背景,本人對tensorflow,keras,caffe,mxnet,pytorch,chainer這些框架都曾有過嘗試。但是最終選擇了pytorch作為“本命”框架,因為它的簡潔、簡單、透明等等優點,簡單到你會用numpy就可以了。而其他框架呢,呵呵。。。。

目前CV領域,各種各樣的開源模型,有的論文中效果宣稱如何如何,但就是不開源;有的論文開源了,但用了一個你不熟悉的框架;有的甚至只給你提供了pb檔案;……

上述現象嚴重的阻礙了新演算法的學習與復現。重新訓練一遍會很耗時間,且不一定能達到論文的效果,不熟悉的框架同樣會浪費諸多嘗試的時間。

有感於上述現象阻礙,本人嘗試將其他框架預訓練模型匯入到pytorch中。曾轉換的模型包含但不限於以下方法:

(1) [VSR_DUF](

https://

github。com/yhjo09/VSR-D

UF

(2) [FALSR](

https://

github。com/falsr/FALSR

(3) [AmoebaNet](

https://

github。com/tensorflow/t

pu/tree/master/models/official/amoeba_net

(4) [EfficientNet](

https://

github。com/tensorflow/t

pu/tree/master/models/official/efficientnet

(5) [MixNet](

https://

github。com/tensorflow/t

pu/tree/master/models/official/mnasnet/mixnet

(6) [Speech2Video](

https://

github。com/joonson/yous

aidthat

(7) [ZoomLearnZoom](

https://

github。com/ceciliavisio

n/zoom-learn-zoom

(8) ……

言歸正傳,既然是純手工匯入方法,那麼就必須對待匯入的模型有一定的認知了解。

事實上,純手工匯入模型要求比較簡單,簡單到只需要下面三個步驟即可:

1。 用pytorch構建待載入模型

2。 將預訓練模型中的必要權值匯出

3。 將匯出權值賦給pytorch模型中的對應引數即可

對於CNN而言,常見的操作主要包含:卷積(2d卷積、深度分離卷積,組卷積,轉置卷積)、BatchNorm、啟用(ReLU, PReLU, LeaklyReLU, Swish等), 全連線層等。

在pytorch中卷積描述為:

conv = nn。Conv2d(inc, outc, kernel, stride, padding, bias)

其引數則應按照如下方式檢視:

print(conv。weight)

print(conv。bias)

權值引數尺寸排布方式為:outc X inc X kernel X kernel

而tensorflow中權值的排布方式則為:kernel X kernel X inc X outc

所以在將tensorflow的權值匯入到pytorch框架中時應當transpose一下!!!

另外,需要注意的一點是:深度分裂卷積比較特殊。該特殊之處自己嘗試一下即可明白,^_^。

關於BatchNorm需要匯入的引數包含:weight, bias, running-mean, running-var。

他們分別對應tensorflow中的:gamma,beta,mean,variance。

此處引數匯入沒有什麼難度,直接匯入即可,因為引數維度都是一樣的。

另外一個需要關注的是全連線層,事實上,清除了如何匯入卷積層後,檢視一下pytorch與tensorflow中的全連線層引數後就全懂了。這裡不過多介紹。

最後,載入轉換時方式為:conv。weight = nn。parameter(torch。from_numpy(tfweight))

其他引數於此類似,不在過多介紹。

流水賬形式的模型轉換漁具介紹到此結束,本想附上一個轉換示例,結果發現個人電腦上午相關demo。明天上班後將FALSR的轉換示例開源出來,感興趣者敬請關注。