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

时间:2015-08-10 13:38:48

标签: python serialization save loading theano

我保存了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'

2 个答案:

答案 0 :(得分:11)

执行unpickling的脚本需要知道pickle对象的所有类定义。其他StackOverflow问题还有更多内容(例如AttributeError: 'module' object has no attribute 'newperson')。

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

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

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

    cPickle.dump(ca.params, f, protocol=cPickle.HIGHEST_PROTOCOL)
    
  2. 保存存储在Theano共享变量中的numpy数组。

    cPickle.dump([param.get_value() for param in ca.params], f, protocol=cPickle.HIGHEST_PROTOCOL)
    
  3. 如果要加载模型,则需要重新初始化参数。例如,然后创建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字段和单独的参数字段。

答案 1 :(得分:0)

保存模型的一种替代方法是保存其权重和体系结构,然后加载相同的方式,就像我们为列车前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:https://blog.rescale.com/neural-networks-using-keras-on- rescale /