45

我正在使用基于 scikit-learn 的nolearn的 DBN(深度信念网络)。

我已经建立了一个可以很好地对我的数据进行分类的网络,现在我有兴趣导出模型进行部署,但我不知道如何(每次我想预测某些东西时我都在训练 DBN)。在matlab我只会导出权重矩阵并将其导入另一台机器。

有人知道如何导出模型/要导入的权重矩阵而无需再次训练整个模型吗?

4

3 回答 3

68

首先,安装joblib

您可以使用:

>>> import joblib
>>> joblib.dump(clf, 'my_model.pkl', compress=9)

然后,在预测服务器上:

>>> import joblib
>>> model_clone = joblib.load('my_model.pkl')

这基本上是一个 Python 泡菜,对大型 numpy 数组进行了优化处理。它与常规的 pickle wrt 代码更改具有相同的限制:如果 pickle 对象的类结构发生更改,您可能不再能够使用新版本的 nolearn 或 scikit-learn 取消对象。

如果您想要长期稳健地存储模型参数,您可能需要编写自己的 IO 层(例如,使用二进制格式的序列化工具,如协议缓冲区或 avro 或低效但可移植的文本/json/xml 表示,如PMML) .

于 2013-07-07T12:19:25.257 回答
11

Pickling/unpickling 的缺点是它仅适用于匹配的 python 版本(主要版本和可能的次要版本)和 sklearn、joblib 库版本。

机器学习模型还有其他描述性输出格式,例如由Data Mining Group开发的,例如预测模型标记语言 (PMML) 和可移植分析格式 (PFA)。在这两者中,PMML 得到了更好的支持

因此,您可以选择将模型从 scikit-learn 保存到 PMML(例如使用sklearn2pmml),然后使用 jpmml 在 java、spark 或 hive 中部署和运行它当然您有更多选择)。

于 2016-09-02T11:24:34.363 回答
6

3.4 节。scikit-learn 文档中的模型持久性几乎涵盖了所有内容。

除了sklearn.externals.joblibogrisel 所指出的,它还展示了如何使用常规的 pickle 包:

>>> from sklearn import svm
>>> from sklearn import datasets
>>> clf = svm.SVC()
>>> iris = datasets.load_iris()
>>> X, y = iris.data, iris.target
>>> clf.fit(X, y)  
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,
  kernel='rbf', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)

>>> import pickle
>>> s = pickle.dumps(clf)
>>> clf2 = pickle.loads(s)
>>> clf2.predict(X[0])
array([0])
>>> y[0]
0

并给出一些警告,例如保存在一个 scikit-learn 版本中的模型可能无法在另一个版本中加载。

于 2015-08-12T03:09:41.863 回答