深度学习小技巧(一):如何保存和恢复TensorFlow训练的模型

在许多情况下,在使用scikit学习库的同时,你需要将预测模型保存到文件中,然后在使用它们的时候还原它们,以便重复使用以前的工作。比如在新数据上测试模型,比较多个模型的优劣。这种保存过程也称为对象序列化——表示具有字节流的对象,以便将其存储在磁盘上,它可以通过网络发送或保存到数据库,而其恢复的过程被称为反序列化。在本文中,我们将在Python和scikit学习中看到三种可能的方法,而且每种都有其优点和缺点。

1.保存和恢复模型的工具

我们第一个介绍的工具是Pickle,用于对象(de)序列化的标准Python工具。之后,我们会介绍Joblib库,它提供了容易(de)序列化方法,其中包含了大数据数组的对象,最后我们会介绍一种手动方法来保存和恢复JSON对象(JavaScript Object Notation)。这些方法都不能代表最佳解决方案,但是可以根据项目的需要选择合适的方案。

2.模型初始化

首先,我们要创建一个scikit学习模型。在我们的例子中,我们将使用Logistic回归模型和Iris数据集。我们导入所需的库,并且加载数据,并将其拆分为训练集和测试集。

现在让我们用一些非默认参数来创建模型,并用训练数据来“喂养”它。我们假设你先前已经找到了模型的最优参数,即产生最高估计精度的参数。

这是我们产生的模型:

使用该fit方法,模型已经学习了存储在其中的系数model.coef_。目标是将模型的参数和系数保存到文件中,因此你不需要再次对新数据重复模型训练和参数优化的步骤。

3.Pickle模块

在以下几行代码中,我们将上一步中创建的模型保存到文件中,然后作为一个新对象加载pickled_model。然后使用加载的模型计算准确度分数,并对新的未见(测试)数据进行预测结果。

运行此代码应该会产生你的预测分数,并通过Pickle保存模型:

使用Pickle来保存和恢复学习模型的好处在于它很快,并且你可以用两行代码完成。如果你已经对训练数据上的模型参数进行了优化,那么这是非常有用的,因此你不需要重复此步骤。不管如何,它都不保存测试结果和任何数据。但仍然可以保存多个对象的元组或列表(并记住哪个对象在哪里),如下所示:

3.Joblib模块

Joblib库它的目的是替代Pickle,用于包含大数据的对象。我们将重复与Pickle一样的保存和恢复过程。

从示例中可以看出,与Pickle相比,Joblib库提供了一个简单的工作流程。虽然Pickle要求将文件对象作为参数传递,但是Joblib可与文件对象和字符串文件名一起使用。如果你的模型包含大量数据,则每个数组将存储在单独的文件中,但整体的保存和恢复过程将保持不变。Joblib还允许使用不同的压缩方法,如“zlib”,“gzip”,“bz2”和不同的压缩级别。

4.手动保存并还原到JSON

根据你的项目,很多时候你会发现Pickle和Joblib都不是合适的解决方案。其中一些原因将在兼容性问题部分中稍后讨论。无论何时要想完全控制保存和恢复过程,最好的方法是手动构建自己的功能。

以下显示了使用JSON手动保存和恢复对象的示例。这种方法允许我们选择需要保存的数据,例如模型参数,系数,训练数据以及我们需要的任何其他数据。

由于我们想将所有这些数据保存在一个对象中,所以一个可能的方法是创建一个继承我们的示例中的模型类的新类LogisticRegression。这个新类被MyLogReg调用,然后分别实现save_json和load_json的方法以保存和恢复JSON文件。

为简单起见,我们将只保存三个模型参数和训练数据。我们可以用这种方法存储一些额外的数据,例如训练集上的交叉验证分数,测试数据,测试数据的准确度等等。

现在我们来试一试MyLogReg。首先我们创建一个对象mylogreg,将训练数据传递给它,并将其保存到文件中。然后我们创建一个新对象json_mylogreg,并调用该load_json方法从文件加载数据。

打印出新的对象,我们可以根据需要来查看我们的参数和训练数据。

由于使用JSON的数据序列化实际上是将对象保存为字符串格式,而不是字节流,所以'mylogreg.json'文件可以使用文本编辑器打开和修改。虽然这种方法对开发人员来说很方便,但是由于入侵者可以查看和修改JSON文件的内容,因此安全性较低。此外,这种方法更适合于具有少量实例变量的对象,例如scikit-learn模型,因为任何添加新变量都需要在保存和恢复方法中进行更改。

5.兼容性问题

尽管到目前为止,每个工具的优点和缺点已被介绍,但Pickle和Joblib工具的最大缺点可能是其与不同型号的Python版本的兼容性。

5.1:Python版本的兼容性——两种工具的文档都指出,不建议(de)在不同的Python版本之间对对象进行序列化,尽管它可能在低级的版本更改中起作用。

5.2:模型兼容性——最常见的错误之一是使用Pickle或Joblib保存模型,然后在尝试从文件还原之前更改模型。模型的内部结构需要在保存和重新加载之间保持不变。

Pickle和Joblib的最后一个问题与安全性有关。这两种工具都可能包含恶意代码,因此不建议从不受信任或未经身份验证的源代码。

6.结论

在这篇文章中,我们描述了三种保存和恢复scikit学习模型的工具。Pickle和Joblib库可以快速方便地使用,但是在不同的Python版本和学习模型的变化中存在兼容性问题。另一方面,手动方法更难实现,需要在模型结构发生任何变化中进行修改,但在另一方面,它可以轻松地适应各种需求,并且没有任何兼容性问题。

作者信息

作者:Mihajlo Pavloski,数据科学与机器学习的爱好者,博士生。

本文由阿里云云栖社区组织翻译。

文章原标题《TensorFlow : Save and Restore Models》

作者:Mihajlo Pavloski译者:虎说八道

文章为简译,更为详细的内容,请查看原文

深度学习小技巧(二):如何保存和恢复scikit-learn训练的模型相关推荐

  1. 【神经网络与深度学习】CIFAR10数据集介绍,并使用卷积神经网络训练图像分类模型——[附完整训练代码]

    [神经网络与深度学习]CIFAR-10数据集介绍,并使用卷积神经网络训练模型--[附完整代码] 一.CIFAR-10数据集介绍 1.1 CIFAR-10数据集的内容 1.2 CIFAR-10数据集的结 ...

  2. 深度学习和目标检测系列教程 11-300:小麦数据集训练Faster-RCNN模型

    @Author:Runsen 上次训练的Faster-RCNN的数据格式是xml和jpg图片提供,在很多Object-Detection中,数据有的是csv格式, 数据集来源:https://www. ...

  3. 深度学习笔记(二)图像分类实践

    深度学习笔记(二)图像分类实践 使用keras中的ResNet模型进行图像处理记忆预测 import keras #import tensorflow from keras.applications. ...

  4. 深度学习入门(二十四)卷积神经网络——填充和步幅

    深度学习入门(二十四)卷积神经网络--填充和步幅 前言 卷积神经网络--填充和步幅 课件 填充 步幅 总结 课本 1 填充 2 步幅 3 小结 前言 核心内容来自博客链接1博客连接2希望大家多多支持作 ...

  5. 误差反向传播和深度学习相关技巧总结

    误差反向传播和深度学习相关技巧总结 文章目录 误差反向传播和深度学习相关技巧总结 一.误差反向传播法 1.几个问题 2.简单层(加法.乘法层).激活函数层.Affine/softmax层的实现 3.误 ...

  6. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

  7. python变量保存在哪里_python小技巧——将变量保存在本地及读取

    在用jupyter notebook写python代码的过程中会产生很多变量,而关闭后或者restart jupyter kernel后所有变量均会消失,想要查看变量就必须将代码重新再运行一遍,而想在 ...

  8. 从零开始编写深度学习库(二)FullyconnecteLayer CPU编写

    从零开始编写深度学习库(二)FullyconnecteLayer CPU编写 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 ...

  9. 产品经理之深度学习促进产品(二)

    产品经理之深度学习促进产品(二) 案例一 阿里巴巴 电子商务公司阿里巴巴通过大数据技术获取企业交易数据,自动分析和预测是否增加对企业的贷款,整个过程没有人工介入,全部为自动化处理. 到目前为止,阿里巴 ...

最新文章

  1. 漫画:生活很苦!当你扛不下去想放弃时,一定要过来看看!
  2. 关注:诺奖得主被爆40多篇论文P图造假!涉及国内“杰青”
  3. java多线程发牌 一个发牌 三个玩家_JAVA代码之斗地主发牌
  4. 一个程序员的C#命名规则(挺不错的)
  5. 四、物理优化(1)范式化
  6. cocos2d-x 学习资料(很全)
  7. 复刻了一个史上最强 Redis 6.0 版本
  8. Git学习(4)基本操作
  9. 三角形旋转c语言程序,c语言图形,请高手修改,效果是一个三角形绕一点旋转一周...
  10. windowsxp系统桌面卡住了解决
  11. Seek the Name, Seek the Fame POJ - 2752(KMP和hah两种方法求公共前后缀)
  12. Oracle创建directory
  13. Abnova 基因 FISH 探针丨CCND1(橙色)FISH 探针
  14. 2022校园春季招聘自带内推码投递链接合集
  15. PS CC2019安装
  16. C# ObjectArx AutoCAD二次开发(转帖)
  17. java拼音搜索排序算法_Java汉字按照拼音排序
  18. linux文件权限3代表啥,3,LINUX文件属性详述
  19. 【阿里面试】链表排序总结
  20. jtable 表头 透明_和田玉的韧性和透明度如何?你了解吗?它们其实是这样的!...

热门文章

  1. mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡
  2. java学习笔记6--类的继承、Object类
  3. 使用脚本编写 Vim 编辑器,第 2 部分: 用户定义函数
  4. 为什么“不在乎别人的眼光”是个大谎言?
  5. javascript系列-class10.DOM(下)
  6. 基于Docker + Consul + Nginx + Consul-template的服务负载均衡实现
  7. Zabbix如何实现Server和Agent的通信加密
  8. 10个最佳Node.js企业应用案例:从Uber到LinkedIn
  9. 【ElasticSearch系列】简单谈谈kibana-由安装marvel插件而来
  10. 地区省份城市sql信息