在theano中保存和重置多层网络的参数

Save and reset parameters of multilayer networks in theano

我们可以使用 six.moves.cPickle 在 python 中保存和加载对象。

我使用以下代码保存并重置了 LeNet 的参数。

# save model
# params = layer3.params + layer2.params + layer1.params + layer0.params
import six.moves.cPickle as pickle
f = file('best_cnnmodel.save', 'wb')
pickle.dump(params, f, protocol=pickle.HIGHEST_PROTOCOL)
f.close()

# reset parameters
model_file = file('best_cnnmodel.save', 'rb')
params = pickle.load(model_file)
model_file.close()
layer3.W.set_value(params[0].get_value())
layer3.b.set_value(params[1].get_value())
layer2.W.set_value(params[2].get_value())
layer2.b.set_value(params[3].get_value())
layer1.W.set_value(params[4].get_value())
layer1.b.set_value(params[5].get_value())
layer0.W.set_value(params[6].get_value())
layer0.b.set_value(params[7].get_value())

LeNet 的代码似乎没问题。但它并不优雅。对于深度网络,我无法使用此代码保存模型。在这种情况下我能做什么?

可以考虑使用json格式。它易于阅读且易于使用。

这是一个例子:

准备数据

import json


data = {
    'L1' : { 'W': layer1.W, 'b': layer1.b },
    'L2' : { 'W': layer2.W, 'b': layer2.b },
    'L3' : { 'W': layer3.W, 'b': layer3.b },
}
json_data = json.dumps(data)

json_data 看起来像这样:

{"L2": {"b": 2, "W": 17}, "L3": {"b": 2, "W": 10}, "L1": {"b": 2, "W": 1}}

解压数据

params = json.loads(json_data)

for k, v in params.items():
    level = int(k[1:])
    # assume you save the layer in an array, but you can use 
    # different way to store and reference the layers
    layer = layers[level]
    layer.W = v['W']
    layer.b = v['b']