【问题标题】:Save tensorflow model to file将张量流模型保存到文件
【发布时间】:2016-10-26 07:02:06
【问题描述】:

我创建了一个 tensorflow 模型,我想将其保存到文件中,以便以后进行预测。特别是,我需要保存:

  • input_placeholder
    (= tf.placeholder(tf.float32, [None, iVariableLen]))
  • solution_space
    (= tf.nn.sigmoid(tf.matmul(input_placeholder, weight_variable) + bias_variable))
  • 会话
    (= tf.Session())

我尝试过使用 pickle,它适用于 sklearn 二值化器等其他对象,但不适用于上述对象,我在底部收到错误。

我如何腌制:

import pickle
with open(sModelSavePath, 'w') as fiModel:
    pickle.dump(dModel, fiModel)

其中dModel 是一个字典,其中包含我想要保留的所有对象,我用它来拟合。

关于如何腌制张量流对象有什么建议吗?

错误信息

pickle.dump(dModel, fiModel)
...
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle module objects

【问题讨论】:

标签: python-2.7 tensorflow pickle


【解决方案1】:

我解决这个问题的方法是使用pickleing Sklearn 对象,如二值化器,并将tensorflow's inbuilt save functions 用于实际模型:

保存张量流模型
1) 像往常一样构建模型
2) 使用tf.train.Saver() 保存会话。例如:

oSaver = tf.train.Saver()

oSess = oSession
oSaver.save(oSess, sModelPath)  #filename ends with .ckpt

3) 这会将会话中所有可用的变量等保存到它们的变量名中。

加载张量流模型
1)整个流程需要重新初始化。换句话说,需要声明变量、权重、偏差、损失函数等,然后将tf.initialize_all_variables()初始化并传入oSession.run()
2) 现在需要将该会话传递给加载程序。我抽象了流程,所以我的加载器看起来像这样:

dAlg = tf_training_algorithm()  #defines variables etc and initializes session

oSaver = tf.train.Saver()
oSaver.restore(dAlg['oSess'], sModelPath)

return {
    'oSess': dAlg['oSess'],
    #the other stuff I need from my algorithm, like my solution space etc
}

3) 预测所需的所有对象都需要从初始化中取出,在我的例子中位于 dAlg

PS:泡菜是这样的:

with open(sSavePathFilename, 'w') as fiModel:
    pickle.dump(dModel, fiModel)

with open(sFilename, 'r') as fiModel:
    dModel = pickle.load(fiModel)

【讨论】:

  • 欣赏这个答案,但 oSession 是什么?
【解决方案2】:

您应该将项目保存为两个单独的部分,一个用于tensorflow 的对象,另一个用于其他对象。我建议您使用以下工具:

  1. tf.saved_model:你要保存和加载的程序tensorflow都在里面。
  2. dill:基于pickle的更强大的pickle工具,可以帮你绕过pickle遇到的大部分错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多