深度學習模型之間的轉換(智雲檢視/HyperDL-Tutorial)
由於各種深度學習框架的層出不窮,我們在進行演算法開發到演算法部署的過程中,往往都需要用到不同的框架。例如我們很有可能使用tensorflow,pytorch等進行演算法開發和除錯,在早期工程inference的時候我們往往使用較為輕量的caffe或者魔改後的caffe。到了移動端部署我們可能會使用feather CNN nihui的NCNN或者小米的mace等框架。facebook ONNX的出現為模型的轉換提供了一種思路,但除了pytorch等框架能很好的支援ONNX。其他等框架並未很好的對接ONNX。在MMdnn出現之前,大家都把caffemodel作為一箇中間體來進行轉換。
其實就模型轉換而言只是個填引數的過程,把模型結構搭好,把引數填進去就即可,但是實踐過的朋友大家一定會知道這其中存在不少坑,但是我們更希望有一種自動化的模型轉換方案來進行模型轉換。
MMdnn的出現為模型轉換帶來了不少的福音,MMdnn提供了一種IR(中間表示)來來銜接各個模型之間的轉換。他囊括並支援了主流的DNN框架。
下面我就簡要講一下幾個的簡單模型轉換
在此我推薦一個檢視模型結構的工具Netron 支援數種主流深度學習框架(Caffe,Tensorflow,ONNX等)的模型結構檢視。
例如下圖是MTCNN Pnet的模型結構圖
MMdnn的安裝
MMdnn的安裝非常簡單
pip install mmdnn
轉換中的一些坑
1.並不是所有Layer和所有網路都支援轉換
由於各個深度學習框架之間的設計模式不同有的是基於命令式的有的是基於符號形式的。各個框架之間的op的粒度不同,又由於沒有一個統一的標準,支援所有框架之間的轉換是一件非常難的事情。MMdnn也只是把一些提供的常用的op,如conv,pooling等常規op。
2.Tensorflow與caffe的padding方式並不相同
這個問題會出現在MobileNet在轉換的過程中,因為Tensorflow的padding方式和其他框架是不同的。Tensorflow標準的卷積操作通常採用非對稱的padding,而caffe等其他框架的卷積操作則是採用對稱的padding。
如下圖 ,比如當 卷積核的大小為3x3 stride為2的時候。儘管他們的padding方式不同,但卷積之後的尺寸確是一樣的。
轉換步驟
例如現在我們想把MTCNN的Keras Pnet轉化成caffeodel用於部署。
mmtoir -f keras -w pnet.h5 -o pnet
把keras模型轉化成MMdnn IR中間表示,在當然目錄下會生成一個.npy 的weights檔案和一個.pb檔案。接著使用
mmtomodel -f caffe -in pnet -iw pnet.npy -o pnet
後記
- 我們通過對模型之間轉換的原理及方式的講解,旨在讓使用者能夠方便的在不同框架下部署自己的模型,提高靈活性和降低開發難度。