Модель Save Theano не работает для сети MLP.

Я пытаюсь сохранить модель, полученную во время обучения многослойной сети Perceptron, построенной с помощью Theano, в соответствии с http://deeplearning.net/tutorial/code/mlp.py, используя код, показанный в логистическом регрессоре по адресу http://deeplearning.net/tutorial/code/logistic_sgd.py, в частности

# save the best model
with open('best_model.pkl', 'w') as f:
cPickle.dump(classifier, f)

но то, что я получаю

... загрузка данных ... построение модели ... эпоха обучения 1, мини-пакет 74/74, ошибка проверки 38,333333 % эпоха 1, мини-пакет 74/74, ошибка теста лучшей модели 41,666667 % Трассировка (последний последний вызов): Файл "mlp.py", строка 423, в test_mlp() Файл "mlp.py", строка 406, в test_mlp cPickle.dump(классификатор, f, протокол=cPickle.HIGHEST_PROTOCOL) cPickle.PicklingError: Can't pickle: атрибут поиск встроенный.instancemethod не удалось

Поскольку я столкнулся с этой проблемой и со сверточной сетью, мой вопрос: существует ли общий способ хранения модели в Theano для повторного использования для прогнозирования?

ИЗМЕНИТЬ Как было предложено в комментариях, я использую сейчас

cPickle.dump((classifier.hiddenLayer.params,classifier.logRegressionLayer.params), f)

для экономии и

classifier.hiddenLayer.W = cPickle.load(open('best_model_mlp.pkl'))[0][0]

для установки весов (например) скрытого слоя в классификаторе, определенном как

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] в качестве прогноза, даже с хорошо обученной сетью. Я все еще ошибаюсь в настройке или сохранении параметров?


person Filippo Galli    schedule 03.12.2015    source источник


Ответы (2)


Сегодня я столкнулся с той же проблемой. Я не знаю точно, почему это работает с 'logistic_sgd.py', а не с 'mlp.py', но вы можете просто сохранить 'classifier.params'

'classifier.params' — это единственные элементы, которые вам понадобятся, когда вы закончите обучение. Не должно быть слишком сложно предсказать ваши классы по этим параметрам (это уже в вашем коде).

person Cazoulable    schedule 07.12.2015
comment
Я пытался, но думаю, что у меня все еще есть проблемы, как указано в РЕДАКТИРОВАТЬ - person Filippo Galli; 08.12.2015
comment
Мое единственное предложение — использовать библиотеку Python Lasagne для обработки Theano, которая позволяет сохранять и загружать, просто вызывая «get_params ()» и «set_params». - person Filippo Galli; 13.01.2016

Я также столкнулся с этой проблемой и нашел это решение. Даже если необходимо только 'classifier.params', y_pred и input также необходимо инициализировать. Простой способ - сохранить их через рассол и перезагрузить.

Сохранение:

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)

Надеюсь это поможет.

person Fla    schedule 02.06.2016