《SDCC 2017人工智能技术实战》
什么是keras
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:
简易和快速的原型设计(keras具有高度模块化,极简,和可扩充特性)
支持CNN和RNN,或二者的结合
无缝CPU和GPU切换
Keras适用的Python版本是:Python 2.7-3.5
中文文档:
http://keras-cn.readthedocs.io/en/latest/
pytorch 是另一款有类似功能的框架。
keras 的构造元素
数据处理
文本数据 : 拆分、索引、标注,主要针对英文。
序列数据:补齐、n-gram、skip-gram
标注类[tokenizer]能批量处理多个文本文件,统一进行索引,拆分和补齐工作。图像数据:翻转、切割、旋转
Keras自带一个具备多种图像变换功能的数据生成器。
实践中会将生成器生成的随机变换的数据和原始数据叠加进行拟合,效果更好。
模型类型
Keras的核心数据结构是“模型”,模型是一种组织网络层的方式。
Sequential model 顺序模型
Keras中主要的模型是
Sequential模型,Sequential是一系列网络层按顺序构成的栈。
- 损失函数
- 网络层,有很多初始化参数:
- 初始化
- 激活函数
- 优化
- 正则化
Sequential模型如下:
from keras.models import Sequential
model = Sequential()
将一些网络层通过.add()堆叠起来,就构成了一个模型:
from keras.layers import Dense,Activation
model.add(Dense(units=64,input_dim=100))
model.add(Activation("relu"))
model.add(Dense(units=10))
model.add(Activation("softmax"))
完成模型的搭建后,编译模型
model.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
编译模型时必须指明损失函数和优化器,如果需要的话可以自己定制损失函数。
在训练数据上按batch进行一定次数的迭代来训练网络:
model.fix(x_train, y_train, epochs=5,batch_size=32)
从神经网络模型到keras代码的映射1:
从神经网络模型到keras代码的映射:2
泛化模型 generic model
模型元素
keras元素与神经网络模型图的对应关系
keras构造深度学习模型实例
keras构造图像识别模型
图像识别: 迁移学习
- 最简单的迁移学习就是将预置模型的顶层去掉,迁移其余结构到新模型。
- 所有参数都要重新训练
构造自己的模型
keras构造深度推荐模型
keras构造时间序列预测模型
在生产环境中部署keras模型
输出为TensorFlow/CNTK的模型文件,在生产环境中运行。
输出CNTK可用模型
import cntk as C
C.combine(keras_model.model.outputs).save('trained_cntk_model')
输出TensorFlow可用模型
import keras.backend as K
session=K.session()
Tf_saver=tf.train.Saver()
Tf_saver.save(sess=session,save+_put=output_path)
利用keras本身的预测函数
利用neocortex.js,在浏览器中利用存储的模型结构和权重运行模型。
模型打分只需要执行前馈网络,计算量小
neocortex.js将需要统一到服务器的打分计算分散到用户的浏览器或者任何能执行.js程序的地方
适于轻量化应用
http://scienceai.github.io/neocortex/mnist_mlp/
使用步骤:
将keras训练好的模型输出:
- 模型结构输出到json文件
- 模型权重输出到HDF5文件
在.js里指定模型文件
mm = new NeuralNet({
modelFilePath:'',
arrayType:'float64',
useGPU:false
})
nn.predict()方法即可进行打分操作
Keras对比TensorFlow
简化模型构建不用自己定义基本的权重要素,keras自动根据数据完成
不用明确地构造组合函数
激活函数可以在网络层直接作为选项