Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Erro ao salvar um modelo de rede neural já treinado (com python)

Objetivo:

Usando o sckit-learn e o Keras, salvar um modelo treinado e "importá-lo" depois.

Assim, não precisaria ficar começando do zero toda vez que rodar o programa!

Estou recebendo o erro, após carregar o modelo salvo:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-74-2674d4ee4eaa> in <module>()
----> 1 predictions = logmodel.predict(X_test)

AttributeError: '_io.BufferedReader' object has no attribute 'predict'

Código fonte: https://pastebin.com/kjGyakmC

O que fiz de errado?

7 respostas

Oi Edson, tudo bem?

Esse erro está falando que a sua variável não tem o atributo predict. Dei uma olhada no seu código e vi que quando de você carrega o modelo, você não atribui esse carregamento a uma variável:

pickle.load(logmodel_persistente)

Nesse trecho, você está carregando seu modelo criado, portando essa função retorna seu modelo:

logmodel = pickle.load(logmodel_persistente)

No seu código você estava atribuindo a variável logmodel o próprio objeto que guardou o modelo (logmodel = logmodel_persistente).

Lembrando que para carregar um modelo com pickle.loads(), este precisa estar salvo antes (pickle.dump(modelo, arquivo)).

@Yuri Matheus: Boa Noite e obrigado mais uma vez pela ajuda!

Não entendi exatamente como corrigir... Quando eu salvei o modelo usando o pickle.dump, não foi salvo o predict?

Opa Edson, tudo certo?

No seu arquivo você está carregando o modelo (input 71, linha 469) antes de salvá-lo (input 168 , linha 505).

Quando treinamos um modelo, por exemplo logmodel.fit(X_train,y_train), as informações ficam salvas naquele objeto.

Podemos usar o pickle para salvar essas informações que estão armazenadas no objeto, por exemplo:

import pickle
# restante do código
logmodel.fit(X_train,y_train)

# cria o arquivo e abre para a gravação do objeto
arquivo = open('arquivo.p', 'wb')

# salva o objeto logmodel no arquivo
pickle.dump(logmodel, arquivo)

Quando fazemos isso, o arquivo com o modelo já treinado está salvo. Podemos então abrir esse modelo em outros arquivos do Python, para isso basta pedir para o pickle carregá-los:

import pickle

# abre o arquivo para leitura
arquivo = open('arquivo.p', 'rb')

# carrega o modelo que está salvo no arquivo
modelo_carregado = pickle.load(arquivo)

# como nosso modelo está carregado e treinado, podemos utilizar
# os seus métodos, como o predict
modelo.predict(dados)

@Yuri Matheus :

É uma boa prática guardar com o Pickle além do modelo as predições também? Assim, não precisaria calcular de novo...

Pergunto isso porque, mesmo com o modelo salvo, a linha

predictions2 = svm_model_carregado.predict(X_test2)

demora bastante a ser executada...

Opa Edson, isso depende. Se você for usar os resultados dessas predições depois, não há problema algum em salvá-las. Você pode usar esses resultados para criar relatórios em outros trechos do código por exemplo.

@Yuri Matheus:

Estou recebendo o erro abaixo ao tentar fazer o pickle.dump. Alguma ideia?


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-466-52571ee5bf40> in <module>()
----> 1 pickle.dump(classificador_rede_neural, arquivo)

TypeError: can't pickle _thread.RLock objects
solução!

Esse erro quer está falando que a thread atual travou seu objeto. Talvez a implementação do modelo tenha causado isso.