在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']
我们可以使用 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']