最近做了一段时间的神经网络模型,效果还算可以,正着手上线。部门内大伙都没什么经验,技术部门对这块也是大姑娘上花轿——头一回。
之前为了方便快速建模,并没有选择Tensorflow,而选用了比较容易上手的Keras框架。从而大大地方便了模型的搭建和测试。不过上线的时候,由于技术部门使用Java栈的原因,要求提供一份PMML用于线上部署。
可能有的朋友还没听过Keras,也不知道啥是PMML,这里就简单介(search)绍(copy)一下相关的内容,好不容易进来看看,免得各位离开本页啦 ('')
Keras是啥?
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:
简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
支持CNN和RNN,或二者的结合
无缝CPU和GPU切换
Keras适用的Python版本是:Python 2.7-3.6
Keras的设计原则是
用户友好:Keras是为人类而不是天顶星人设计的API。用户的使用体验始终是我们考虑的首要和中心内容。Keras遵循减少认知困难的最佳实践:Keras提供一致而简洁的API, 能够极大减少一般应用下用户的工作量,同时,Keras提供清晰和具有实践意义的bug反馈。
模块性:模型可理解为一个层的序列或数据的运算图,完全可配置的模块可以用最少的代价自由组合在一起。具体而言,网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块,你可以使用它们来构建自己的模型。
易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得Keras更适合于先进的研究工作。
与Python协作:Keras没有单独的模型配置文件类型(作为对比,caffe有),模型由python代码描述,使其更紧凑和更易debug,并提供了扩展的便利性。
30秒一睹为快
我前面也都说了,Keras是非常容易使用的,也不用扯别的了,tell you 不如 show you。
Keras的核心数据结构是“模型”,模型是一种组织网络层的方式。Keras中主要的模型是Sequential模型,Sequential是一系列网络层按顺序堆起来的。
Sequential模型如下
将一些网络层通过.add()堆叠起来,就构成了一个模型:
完成模型的搭建后,我们需要使用.compile()方法来编译模型:
编译模型时必须指明损失函数和优化器,如果你需要的话,也可以自己定制损失函数、自己的模型、网络层,甚至修改源代码。你开心就好。
完成模型编译后,我们在训练数据上按batch进行一定次数的迭代来训练网络.
当然,我们也可以手动将一个个batch的数据送入网络中训练,这时候需要使用:
随后,我们可以使用一行代码对我们的模型进行评估,看看模型的指标是否满足我们的要求:
或者,我们可以使用我们的模型,对新的数据进行预测:
何为 PMML?
当我们训练好了一个模型后,我们下一步要干啥呢?上线呗,还用问。交给谁上线呢?我也不知道,反正我们这边是交给大数据技术部。他们需要考虑的是各种性能、辅助功能、业务流程等以确保我们的模型真正可以输出有价值的内容。
既然不是自己用,那就要交接了,交什么呢?如果你用自己喜欢的语言跑出了模型,你打算交给技术一堆脚本,然后给一堆说明文档,让技术自己去琢磨。结果是,他才不愿意看你的脚本,也许人家就根本看不懂。
那怎么办?你可以交给他一个PMML文件。PMML 主要用在不同的应用程序之间轻松共享预测分析模型。这样,你就可以用你最爱的语言建模型,完事后转化为 PMML,用其他语言的人只要解析PMML文件就能复原模型了,然后他也可以愉快地用自己喜欢的语言搞点别的事情。
PMML 文件能够表达各种常用步骤,包括:
数据词典:包括数值、顺序和分类字段。
挖掘架构:处理缺少值和离群值的策略。
数据转换:将原始输入数据预处理至派生字段所需的计算。
输出: 预期模型输出,如预测类及概率。
目标: 应用于模型输出的后处理步骤。
模型解释:包括字段相关性、混淆矩阵、增益图及接收者操作特征(ROC)曲线图。
模型验证:包含输入数据记录和预期模型输出的示例集。确保新旧系统对同样的输入有同样的输出。
Keras转PMML
用Kears训练好神经网络模型后,怎么转成PMML上线呢?我首先想到的是看下官网有没有方法,结果是没有。然后在网上找找开源代码,结果是有,Keras2pmml。很好,拿来用。结果是行不通,人家很久没更新了,激活函数最多支持到Relu。回头看看我的模型,赫然写着Softmax不被支持。
只好自己动手了,把源码拉下来看一遍,以为只要往激活函数列表里加个softmax就ok了。
哪有那么简单。翻开PMML官网的神经网络模块,研究了半天,原来PMML里softmax根本不是激活函数,keras里面却是。层数也不对,我的Dropout层也被当作隐藏层,导致结果打分总出错。
不过这些小case能难倒我?我好歹也是久经沙场惯了的。把这些问题解决后,再把输出文件美化美化,看起来是好样的。验证了几次数据,万事大吉。
来看看用法。模型训练好后,先保存到模型文件 model.h5中。
以上代码,先把训练好的模型文件读入,添加参数说明,再转换成pmml。
源代码如下:
今天就先介绍这么多,代码比较长,如有疑问可以互相交流,不足之处还请多多指正。多谢各位的支持,并预祝大家新年快乐~~
阅读参考
https://www.ibm.com/developerworks/cn/opensource/ind-PMML1/
https://keras-cn.readthedocs.io/en/latest/
领取专属 10元无门槛券
私享最新 技术干货