<>前言

相信有很多人在搞机器学习也好,深度学习也好,最主要的东西都是如何训练出一个好模型,当然应该这样,我也是把最主要的重心放在如何训练好模型上了。

但是最近完成了一个深度学习模型的训练后,在部署到线上的时候,却发现考虑少了一些东西。

其中一个方面就是如何使得你的模型能够快速的应用到线上?如何使得代码的运行效率更快?
因为平时训练都是把模型直接保存在本地,需要的时候就直接读进内存即可。

但是如果在实际生产"环境中,怎么可能每调用一次模型就要读一次文件呢?这样运行效率太低了,而且在部署的时候就需要把模型拷贝到各个服务器上,这样对模型的维护更新更加不方便。

<>一、中间件Redis

相信很多人都知道Redis这个神器。
本例也是利用Redis作为中间件,将模型序列化然后储存在Redis中。
使用Redis的好处有:
只需要在一台机器中储存好模型,使用的时候一次性读取到Redis中即可。
通过Redis读取模型大大加快了从本地磁盘读取的速度,加快线上的业务进程。
更新模型的时候只需要更新一台机器上的模型。

<>二、普通机器学习模型保存序列化

这里用到的例子是在对数据进行标准化的时候训练的模型scaler
普通的保存在本地磁盘的方法是:
借助joblib 包
from sklearn.externals import joblib ## 保存到test目录 joblib.dump(scaler,
'/home/test/scaler_test') ## 读取scaler scaler_test = joblib.load(
'/home/test/scaler_test')
若要储存在Redis中,则需要先对模型进行序列化,直接储存只能储存成一堆字符串
借助cPickle
## 对模型进行序列化 scaler_cp = cPickle.dumps(scaler) ## 储存到redis中 self.redis_dumps(
"scaler",scaler_cp)
存储在Redis中的数据如下

## 加载模型 scaler_loads = self.redis_loads("scaler") ## 反序列化 scaler_cp = cPickle.
loads(scaler_loads)
这样模型就完全加载进来了。

<>三、tensorflow 训练后模型的保存

1、最简单最方便的方法就是直接保存在本地,如下
## 保存 model.save('/home/tensorflow/tensor_test.h5') ## 加载 from tensorflow.keras
.models import load_model model = load_model('/home/tensorflow/tensor_test.h5')
2、若想要储存在Redis中,则需要对模型分为两个部分储存,结构部分,权重部分。
结构部分的储存:
model_json = model.to_json() ## 储存到redis中 self.redis_dumps("model",model_json)

权重部分的储存:
weights_list = model.get_weights() ## 对模型进行序列化 weights = cPickle.dumps(
weights_list) ## 储存到redis中 self.redis_dumps("weights",weights)

模型的加载:
from tensorflow.keras.models import model_from_json model = model_from_json(
self.redis_loads("model")) weight = cPickle.loads(self.redis_loads("weights"))
model.set_weights(weight)
至此模型的加载就完成了。
测试过跟保存在磁盘的模型完全一样。

<>四、总结

在本地做实验训练模型跟真正运用到线上还是有很大的差别的,不仅仅要考虑到模型的准确度,还要考虑到对线上各个方面的影响。

我是一只前进的蚂蚁,希望能一起前行。

如果对您有一点帮助,一个赞就够了,感谢!

注:如果本篇博客有任何错误和建议,欢迎各位指出,不胜感激!!!

技术
©2019-2020 Toolsou All rights reserved,
2021年2月程序员工资统计,平均15144元初识MySQL之综合复习篇(干货)Faster RCNN系列算法原理讲解(笔记)谷歌称居家办公影响工作效率!2021 年将回归线下办公C语言控制台小游戏,打砖块GDOI2019 游记CSS架构设计Python基础知识整理笔记2019年终总结——工作第二年用C++跟你聊聊“原型模式” (复制/拷贝构造函数)