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

Python 如何在theano中保存/序列化经过培训的模型?,python,serialization,save,loading,theano,Python,Serialization,Save,Loading,Theano,我将模型保存为上的文档 ca是一种经过培训的自动编码器。它是类的一个实例。从构建和保存模型的脚本中,我可以调用ca.get\u recoverted\u input(…)和ca.get\u hidden\u values(…),没有任何问题 在另一个脚本中,我尝试加载经过训练的模型 # loading the trained model model_file = file('models/simple_model.save', 'rb') ca = cPickle.load(model_file

我将模型保存为上的文档

ca
是一种经过培训的自动编码器。它是类的一个实例。从构建和保存模型的脚本中,我可以调用
ca.get\u recoverted\u input(…)
ca.get\u hidden\u values(…)
,没有任何问题

在另一个脚本中,我尝试加载经过训练的模型

# loading the trained model
model_file = file('models/simple_model.save', 'rb')
ca = cPickle.load(model_file)
model_file.close()
我收到以下错误

AttributeError:“模块”对象没有属性“cA”


执行取消pickle的脚本需要知道pickle对象的所有类定义。在其他StackOverflow问题(例如)中有更多关于这一点的内容

只要正确导入
cA
,您的代码就是正确的。考虑到你得到的错误,情况可能并非如此。确保您使用的是来自cA导入cA的
,而不仅仅是
导入cA

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

  • 保存文件,无共享变量。这里我们假设
    ca.params
    是一个无共享变量实例的常规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
    


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

    保存模型的另一种方法是保存其权重和结构,然后加载相同的内容,就像我们对列车前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)
    

    source/ref:rescale/

    我看到的错误是因为我使用的是
    import cA
    而不是
    from cA import cA
    。我发布的代码在其他方面是正确的。你的选择也是正确的。我认为关闭此线程最干净的方法是在第一段中添加一些内容(确定问题的真正根源),如“确保您使用的是cA import cA
    ,而不仅仅是
    import cA
    ”,我可以将您的答案标记为已接受。谢谢对我来说,从cpickle加载模型和编译模型一样慢。据我所知,非常重要的是要知道这个pickle文件基本上会绑定到相同的硬件,至少你不能在基于cpu的Theano上加载基于cuda的模型。我非常惊讶地发现,在不同的硬件之间传输学习的网络是一项不平凡的任务。学习的网络只需要经过训练的参数。您不需要对编译后的Theano函数进行pickle。事实上,出于你给出的理由,最好避免这样做。最好是简单地pickle模型参数(作为numpy数组,而不是无共享变量),然后将其加载回编译的任何形式的网络(即CPU或GPU版本)。@DanielRenshaw应该可以使用
    Theano.misc.pkl_utils.dump()
    Theano.misc.pkl_utils.load()
    进行序列化/反序列化。
    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
    
    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)