當前位置:
首頁 > 最新 > 如何把神經網路keras模型轉PMML文件?

如何把神經網路keras模型轉PMML文件?

最近做了一段時間的神經網路模型,效果還算可以,正著手上線。部門內大夥都沒什麼經驗,技術部門對這塊也是大姑娘上花轎——頭一回。

之前為了方便快速建模,並沒有選擇Tensorflow,而選用了比較容易上手的Keras框架。從而大大地方便了模型的搭建和測試。不過上線的時候,由於技術部門使用Java棧的原因,要求提供一份PMML用於線上部署。

可能有的朋友還沒聽過Keras,也不知道啥是PMML,這裡就簡單介(search)紹(copy)一下相關的內容,好不容易進來看看,免得各位離開本頁啦 ("")

GIF

Keras是啥?

Keras是一個高層神經網路API,Keras由純Python編寫而成並基Tensorflow、Theano以及CNTK後端。Keras 為支持快速實驗而生,能夠把你的idea迅速轉換為結果,如果你有如下需求,請選擇Keras:

Keras適用的Python版本是:Python 2.7-3.6

Keras的設計原則是

30秒一睹為快

我前面也都說了,Keras是非常容易使用的,也不用扯別的了,tell you 不如 show you。

Keras的核心數據結構是「模型」,模型是一種組織網路層的方式。Keras中主要的模型是Sequential模型,Sequential是一系列網路層按順序堆起來的。

Sequential模型如下

將一些網路層通過.add()堆疊起來,就構成了一個模型:

完成模型的搭建後,我們需要使用.compile()方法來編譯模型:

編譯模型時必須指明損失函數和優化器,如果你需要的話,也可以自己定製損失函數、自己的模型、網路層,甚至修改源代碼。你開心就好。

完成模型編譯後,我們在訓練數據上按batch進行一定次數的迭代來訓練網路.

當然,我們也可以手動將一個個batch的數據送入網路中訓練,這時候需要使用:

隨後,我們可以使用一行代碼對我們的模型進行評估,看看模型的指標是否滿足我們的要求:

或者,我們可以使用我們的模型,對新的數據進行預測:

何為 PMML?

當我們訓練好了一個模型後,我們下一步要幹啥呢?上線唄,還用問。交給誰上線呢?我也不知道,反正我們這邊是交給大數據技術部。他們需要考慮的是各種性能、輔助功能、業務流程等以確保我們的模型真正可以輸出有價值的內容。

既然不是自己用,那就要交接了,交什麼呢?如果你用自己喜歡的語言跑出了模型,你打算交給技術一堆腳本,然後給一堆說明文檔,讓技術自己去琢磨。結果是,他才不願意看你的腳本,也許人家就根本看不懂。

那怎麼辦?你可以交給他一個PMML文件。PMML 主要用在不同的應用程序之間輕鬆共享預測分析模型。這樣,你就可以用你最愛的語言建模型,完事後轉化為 PMML,用其他語言的人只要解析PMML文件就能復原模型了,然後他也可以愉快地用自己喜歡的語言搞點別的事情。

PMML 文件能夠表達各種常用步驟,包括:

Keras轉PMML

用Kears訓練好神經網路模型後,怎麼轉成PMML上線呢?我首先想到的是看下官網有沒有方法,結果是沒有。然後在網上找找開源代碼,結果是有,Keras2pmml。很好,拿來用。結果是行不通,人家很久沒更新了,激活函數最多支持到Relu。回頭看看我的模型,赫然寫著Softmax不被支持。

只好自己動手了,把源碼拉下來看一遍,以為只要往激活函數列表裡加個softmax就ok了。

哪有那麼簡單。翻開PMML官網的神經網路模塊,研究了半天,原來PMML里softmax根本不是激活函數,keras裡面卻是。層數也不對,我的Dropout層也被當作隱藏層,導致結果打分總出錯。

GIF

不過這些小case能難倒我?我好歹也是久經沙場慣了的。把這些問題解決後,再把輸出文件美化美化,看起來是好樣的。驗證了幾次數據,萬事大吉。

來看看用法。模型訓練好後,先保存到模型文件 model.h5中。

以上代碼,先把訓練好的模型文件讀入,添加參數說明,再轉換成pmml。

源代碼如下:

今天就先介紹這麼多,代碼比較長,如有疑問可以互相交流,不足之處還請多多指正。多謝各位的支持,並預祝大家新年快樂~~

閱讀參考

https://www.ibm.com/developerworks/cn/opensource/ind-PMML1/

https://keras-cn.readthedocs.io/en/latest/


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |