如何在 theano 中保存/序列化经过训练的模型?

Posted

技术标签:

【中文标题】如何在 theano 中保存/序列化经过训练的模型?【英文标题】:How to save / serialize a trained model in theano? 【发布时间】:2015-08-10 13:38:47 【问题描述】:

我将模型保存在 loading and saving 上。

# saving trained model
f = file('models/simple_model.save', 'wb')
cPickle.dump(ca, f, protocol=cPickle.HIGHEST_PROTOCOL)
f.close()

ca 是经过训练的自动编码器。它是类cA 的一个实例。从我构建和保存模型的脚本中,我可以毫无问题地调用ca.get_reconstructed_input(...)ca.get_hidden_values(...)

在不同的脚本中,我尝试加载经过训练的模型。

# loading the trained model
model_file = file('models/simple_model.save', 'rb')
ca = cPickle.load(model_file)
model_file.close()

我收到以下错误。

ca = cPickle.load(model_file)

AttributeError: 'module' 对象没有属性 'cA'

【问题讨论】:

【参考方案1】:

解酸的脚本需要知道酸洗对象的所有类定义。其他 *** 问题(例如 AttributeError: 'module' object has no attribute 'newperson')中对此有更多说明。

只要您正确导入cA,您的代码就是正确的。鉴于您遇到的错误可能并非如此。确保您使用的是from cA import cA 而不仅仅是import cA

或者,您的模型由其参数定义,因此您可以只腌制参数值)。这可以通过两种方式完成,具体取决于您的观点。

    保存 Theano 共享变量。这里我们假设ca.params 是Theano 共享变量实例的常规Python 列表。

    cPickle.dump(ca.params, f, protocol=cPickle.HIGHEST_PROTOCOL)
    

    保存存储在 Theano 共享变量中的 numpy 数组。

    cPickle.dump([param.get_value() for param in ca.params], f, protocol=cPickle.HIGHEST_PROTOCOL)
    

当您想要加载模型时,您需要重新初始化参数。例如,创建cA 类的新实例,然后

ca.params = cPickle.load(f)
ca.W, ca.b, ca.b_prime = ca.params

ca.params = [theano.shared(param) for param in cPickle.load(f)]
ca.W, ca.b, ca.b_prime = ca.params

请注意,您需要同时设置params 字段和单独的参数字段。

【讨论】:

我看到的错误是由于我使用的是import cA 而不是from cA import cA。我发布的代码是正确的。你的选择也是正确的。我认为关闭此线程的最简洁方法是让您在第一段中添加一些内容(确定问题的真正根源),例如“确保您使用的是from cA import cA 而不仅仅是import cA”,我可以将您的答案标记为已接受。谢谢! 对我来说,从 cpickle 加载模型与编译它的速度差不多。 据我了解,知道这个pickle文件本质上将绑定到相同的硬件是非常重要的,至少你不能在基于cpu的Theano上加载基于cuda的模型.在不同硬件之间传输学习到的网络并非易事,这让我感到非常惊讶。 学习到的网络只需要经过训练的参数即可。您不需要腌制已编译的 Theano 函数。实际上,出于您给出的原因,最好避免这种情况。最好简单地腌制模型参数(作为 numpy 数组,而不是 Theano 共享变量),然后将它们加载回编译的任何形式的网络(即 CPU 或 GPU 版本)。 @DanielRenshaw 应该可以使用theano.misc.pkl_utils.dump()theano.misc.pkl_utils.load() 进行序列化/反序列化。【参考方案2】:

另一种保存模型的方法是保存其权重和架构,然后加载它们,就像我们对预训练 CNN 所做的那样:

def save_model(model):


   model_json = model.to_json()
   open('cifar10_architecture.json', 'w').write(model_json)
   model.save_weights('cifar10_weights.h5', overwrite=True)

来源/参考:https://blog.rescale.com/neural-networks-using-keras-on- rescale/

【讨论】:

以上是关于如何在 theano 中保存/序列化经过训练的模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 H2o 中保存/加载经过训练的模型?

使用经过训练的字符级 LSTM 模型生成文本

如何通过保存经过训练的模型来减少使用 pickle 的编译时间?

在 Theano 中训练 MLP

使用 theano 后端加载 keras 模型时出现断言错误

如何保存经过训练的模型(估计器)并将其加载回来以使用 Tensorflow 中的数据对其进行测试?