我正在尝试使用http://deeplearning.net/tutorial/code/mlp.py中的Logistic回归程序中显示的代码,根据http://deeplearning.net/tutorial/code/logistic_sgd.py保存在使用Theano构建的多层感知器网络训练期间获得的模型,特别是
# save the best model
with open('best_model.pkl', 'w') as f:
cPickle.dump(classifier, f)
但我得到的是
...加载数据......构建模型......培训时代1, minibatch 74/74,验证错误38.333333% epoch 1,minibatch 74/74,最佳模型测试错误41.666667%Traceback(最近一次调用最后一次):文件“mlp.py”,第423行,in test_mlp()文件“mlp.py”,第406行,在test_mlp中 cPickle.dump(classifier,f,protocol = cPickle.HIGHEST_PROTOCOL)cPickle.PicklingError:无法pickle:属性 查找内置 .instancemethod失败
由于我在卷积网络中也遇到了这个问题,我的问题是:有一种在Theano中存储模型的一般方法,可以重复用于预测吗?
修改 正如我现在使用的评论中所建议的那样
cPickle.dump((classifier.hiddenLayer.params,classifier.logRegressionLayer.params), f)
用于保存和
classifier.hiddenLayer.W = cPickle.load(open('best_model_mlp.pkl'))[0][0]
用于在分类器中设置hiddenLayer的权重(例如),定义为
x = T.matrix('x')
classifier = MLP(
rng=rng,
input=x,
n_in = 28*28,
n_hidden= 500,
n_out=10
)
但是当我调用函数时
predict_model = theano.function(
inputs=[classifier.input],
outputs=classifier.logRegressionLayer.y_pred,
)
我总是将[0]作为预测,即使是训练有素的网络也是如此。 我在设置或保存参数时仍然做错了吗?
答案 0 :(得分:3)
我今天一直面临同样的问题。我不确切地知道这与'logistic_sgd.py
'而不是'mlp.py'
,但你可以做的只是存储'classifier.params'
'classifier.params'
是您需要的唯一元素。从这些参数预测你的类不应该太难(这已经在你的代码中了。)
答案 1 :(得分:0)
我也遇到了这个问题并找到了这个解决方案。
即使只需要'classifier.params'
,也需要初始化y_pred
和input
。简单的方法是通过pickle存储它们并重新加载它们。
保存:
with open('best_model.pkl', 'wb') as f:
cPickle.dump((classifier.params, classifier.logRegressionLayer.y_pred,
classifier.input), f)
预测功能:
def predict(dataset, n_hidden, n_in, n_out):
datasets = load_data(dataset)
test_set_x, test_set_y = datasets[2]
test_set_x = test_set_x.get_value()
test_set_y = test_set_y.eval()
rng = numpy.random.RandomState(1234)
x = T.matrix('x')
# Declare MLP classifier
classifier = MLP(
rng=rng,
input=x,
n_in=n_in,
n_hidden=n_hidden,
n_out=n_out
)
# load the saved model
classifier.params, classifier.logRegressionLayer.y_pred,
classifier.input = cPickle.load(open('best_model.pkl'))
predict_model = theano.function(
inputs=[classifier.input],*emphasized text*
outputs=classifier.logRegressionLayer.y_pred)
print("Expected values: ", test_set_y[:10])
predicted_values = predict_model(test_set_x[:10])
print("Predicted values:", predicted_values)
希望这有帮助。