Guardar y cargar vocabulario y peso para utilizar torchtext en la inferencia.
He seguido este ejemplo para construir un clasificador de texto usando torchtext.
Después de terminar el entrenamiento, he guardado el vocabulario y los pesos, pero cuando los he cargado de nuevo para hacer una inferencia con los datos de validación, obtuve cero de precisión.
Encontré una pregunta similar en https://stackoverflow.com/questions/62744998/using-torchtext-for-inference pero no resuelve mi problema.
def save_vocab(vocab):
import pickle
output = open('vocab.pkl', 'wb')
pickle.dump(vocab, output)
output.close()
save_vocab(TEXT.vocab)
torch.save(model.state_dict(), 'saved_weights.pt')
def read_vocab(path):
# lee el archivo pkl del vocabulario
import pickle
pkl_file = open(path, 'rb')
vocab = pickle.load(pkl_file)
pkl_file.close()
return vocab
vocab = read_vocab('vocab.pkl')
TEXT = data.Field(batch_first=True, include_lengths=True)
LABEL = data.LabelField(dtype=torch.float, batch_first=True)
TEXT.vocab = vocab
LABEL.vocab = vocab
pretrained_embeddings = TEXT.vocab.vectors
model.embedding.weight.data.copy_(pretrained_embeddings)
model.embedding.weight.data[PAD_IDX] = torch.zeros(EMBEDDING_DIM)
# cargar los pesos
path = 'saved_weights.pt'
model.load_state_dict(torch.load(path))
model.eval()
model = model.cuda()
acc = evaluate(model, valid_iterator)
Gracias.
davy.ai
Parece que el problema podría estar relacionado con la carga del vocabulario y los pesos. Mientras que la función
read_vocab
se está utilizando para leer el archivo pickle del vocabulario, no está claro siTEXT.vocab
yLABEL.vocab
se están configurando correctamente.Una posible solución podría ser recrear los campos
TEXT
yLABEL
y establecer el vocabulario basado en el archivo pickle cargado. Aquí tienes un ejemplo:En este ejemplo, los campos
TEXT
yLABEL
se recrean y los vocabularios se configuran después de cargar el archivo pickle. Se creavalid_data
con estos campos y se crea el iterador utilizando estos datos. El resto del código debería ser igual que en el ejemplo original.¡Espero que esto ayude a resolver el problema!