关于模型存储的疑问?

datasource
模型保存
模型加载
pickle
模型持久化
标签: #<Tag:0x00007fcf7a229420> #<Tag:0x00007fcf7a2292b8> #<Tag:0x00007fcf7a2290d8> #<Tag:0x00007fcf7a228f98> #<Tag:0x00007fcf7a228db8>

(snowball) #1

笔者初衷是想应用keras库训练一个模型,然后将模型h5文件存储于根目,再在另一个模型调用,然而,在应用于交易过程中,模型不能加载,日志里没有交易数据。平台方说交易时只能应用DataSource存储。DataSource也是不得要领。

ds = DataSource()
model.save(model_ds.open_temp_path())
ds.close_temp_path()

然后

load_model(ds.open_temp_path())

提示ds没有定义?
这里的open_temp_path()是什么目录?临时存一下?还有其它的路径可以存储吗?
ds.id不能重设定?
有没有全面彻底的解决方案?


模型保存问题
(iQuant) #2
克隆策略

方法一:

通过平台的DataSource存储模型

In [29]:
from sklearn import svm
X = [[0, 0], [1, 1]]
y = [0, 1]
clf = svm.SVC()
clf.fit(X, y)  # 训练模型

ds = DataSource.write_pickle(clf) # 保存模型
model  = ds.read_pickle() # 加载模型
model.predict([0.1,0.3]) # 模型预测
/opt/conda/lib/python3.5/site-packages/sklearn/utils/validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
  DeprecationWarning)
Out[29]:
array([0])

方法二:

通过sklearn包的持久化模型实现目的

In [28]:
from sklearn.externals import joblib
from sklearn import svm
X = [[0, 0], [1, 1]]
y = [0, 1]
clf = svm.SVC()
clf.fit(X, y)   # 训练模型

joblib.dump(clf, "train_model.m") # 保存模型 
clf = joblib.load("train_model.m") # 加载模型
pred_X = [1.2,1]
clf.predict(pred_X)  # 模型训练
/opt/conda/lib/python3.5/site-packages/sklearn/utils/validation.py:395: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
  DeprecationWarning)
Out[28]:
array([1])

tensorflow框架下模型保存问题
(snowball) #3

您好,有点跑题了,要存储的是keras库生成的模型,用方法一错误提示如下:
AttributeError: Can’t pickle local object 'main..RemoteBigPythonKernel’
方法二没有尝试,但之前我存储的是文件,在模拟交易时,读取不到,如果能读取到文件的话,本能的就绕过datasource了。


(小Q) #4

@snowball @nep7une
解决方法如下(截图):

代码:

import numpy as np
np.random.seed(1337)  # for reproducibility
from keras.models import Sequential
from keras.layers import Dense
from keras.models import load_model
X = np.linspace(-1, 1, 200)
np.random.shuffle(X)    # randomize the data
Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200, ))
X_train, Y_train = X[:160], Y[:160]     # first 160 data points
X_test, Y_test = X[160:], Y[160:]       # last 40 data points
model = Sequential()
model.add(Dense(output_dim=1, input_dim=1))
model.compile(loss='mse', optimizer='sgd')
for step in range(301):
    cost = model.train_on_batch(X_train, Y_train)

model_ds = DataSource()
model.save(model_ds.open_temp_path())
model_ds.close_temp_path()
print(model_ds.id)

ds = DataSource('a53194b2329d11e88d5d0242ac1100d8')
model_new = load_model(ds.open_temp_path())
ds.close_temp_path()


(nep7une) #5

很早前提过需求,貌似还不支持加载在本地训练好的模型。

https://community.bigquant.com/t/模型保存问题/4076/5


(iQuant) #6

收到反馈,已经在开始解决了。


(snowball) #7

是啊,同感,他们速度有点慢啊,小半年了。


(神龙斗士) #8

你的方向是很对的,很接近了。

1. 训练模型,保存模型为 DataSource,并获取到模型id

ds = DataSource()
model.save(ds.open_temp_path())
ds.close_temp_path()
print(ds.id)

image

2. 加载模型,通过 模型id 可以在不同进程或者不同策略里使用:

ds = DataSource('30bf9576329211e89d6b0242ac110075')
load_model(ds.open_temp_path())
ds.close_temp_path()

注意:会定期清理不使用的DataSource,新版将支持久化DataSource


tensorflow框架下模型保存问题
(nep7une) #9

感谢~~


(snowball) #10

多谢啦!另外你们能开放根目录的下文件预览吗?有些格式,默认是看不到的。


(hhd2020) #11

最近这个方法还有效吗,我用上面的代码,打开保存过的模型,但页面提示找不到文件


(神龙斗士) #12

你可以发一下相关代码,我们看看