保存Theano模型不适用于MLP网络

时间:2015-12-03 14:46:20

标签: pickle theano prediction

我正在尝试使用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]作为预测,即使是训练有素的网络也是如此。 我在设置或保存参数时仍然做错了吗?

2 个答案:

答案 0 :(得分:3)

我今天一直面临同样的问题。我不确切地知道这与'logistic_sgd.py'而不是'mlp.py',但你可以做的只是存储'classifier.params'

完成培训后,

'classifier.params'是您需要的唯一元素。从这些参数预测你的类不应该太难(这已经在你的代码中了。)

答案 1 :(得分:0)

我也遇到了这个问题并找到了这个解决方案。 即使只需要'classifier.params',也需要初始化y_predinput。简单的方法是通过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)

希望这有帮助。