es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo obtener acceso a tokenizer después de cargar un modelo BERT personalizado guardado usando Keras y TF2?

Estoy trabajando en un problema de clasificación de intenciones y necesito tu ayuda.

Ajusté uno de los modelos BERT para la clasificación de texto. Entrené y evalué el modelo con un conjunto de datos pequeño para detectar cinco intenciones. Usé el siguiente código Intent Recognition with BERT usando Keras y TensorFlow 2. ¡Funciona bien!
https://curiousily.com/posts/intent-recognition-with-bert-using-keras-and-tensorflow-2/

He guardado el modelo para poder usarlo más tarde sin tener que volver a entrenarlo en el futuro.

Guardar todo el modelo como SavedModel.

!mkdir -p saved_model
model.save(‘saved_model/intentclassifiermodel’)

Luego lo comprimí y lo descargué para usarlo por separado.

!zip -r saved_model.zip saved_model/

Ahora, estoy tratando de usar este modelo para predecir la clasificación de intenciones. Para ello, he creado otro cuaderno de Google Colab y he cargado el modelo.

from google.colab import drive
drive.mount(‘/content/gdrive’)

!pip install tensorflow==2.2

!pip install bert-for-tf2 >> /dev/null

import bert

from tensorflow import keras
model = keras.models.load_model(‘/content/gdrive/MyDrive/NLPMODELS/saved_model/intentclassifiermodel’)

model.summary()

El modelo se carga correctamente, ahora quiero hacer una predicción. Para ello, estoy utilizando el siguiente fragmento de código (era el mismo código en el código base).

sentences = [

“¿Eres un bot?”,
“¿Cómo crear un bot?”
]

pred_tokens = map(tokenizer.tokenize, sentences)
pred_tokens = map(lambda tok: [“[CLS]”] + tok + [“[SEP]”], pred_tokens)
pred_token_ids = list(map(tokenizer.convert_tokens_to_ids, pred_tokens))

pred_token_ids = map(lambda tids: tids +[0]*(data.max_seq_len-len(tids)),pred_token_ids)
pred_token_ids = np.array(list(pred_token_ids))

predictions = model.predict(pred_token_ids).argmax(axis=-1)

for text, label in zip(sentences, predictions):
print(“text:”, text, “\nintent:”, classes[label])
print()

Sin embargo, este código falla porque no estoy seguro de cómo acceder al tokenizador aquí.

Aquí está el error:

¿Podrías ayudarme a obtener el tokenizador?

Gracias y saludos,
Rohit Dhamija

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hola Rohit,

    Claro, puedo ayudarte a acceder al tokenizador. Como has utilizado el modelo BERT en tu código, necesitas tener el tokenizador correspondiente que se utilizó para pre-entrenar el modelo BERT.

    Puedes cargar el tokenizador utilizando la clase FullTokenizer del módulo bert/tokenization.py. Aquí tienes el fragmento de código que puedes utilizar para cargar el tokenizador y tokenizar las frases:

    import os
    import bert
    
    max_seq_len = 128
    bert_ckpt_dir = "/ruta/a/bert/ckpt"
    
    vocab_file = os.path.join(bert_ckpt_dir, "vocab.txt")
    tokenizer = bert.FullTokenizer(vocab_file)
    
    sentences = [
      "¿eres un bot?",
      "cómo crear un bot"
    ]
    
    pred_tokens = map(tokenizer.tokenize, sentences)
    pred_tokens = map(lambda tok: ["[CLS]"] + tok + ["[SEP]"], pred_tokens)
    pred_token_ids = list(map(tokenizer.convert_tokens_to_ids, pred_tokens))
    
    pred_token_ids = map(lambda tids: tids +[0]*(max_seq_len-len(tids)),pred_token_ids)
    pred_token_ids = np.array(list(pred_token_ids))
    

    En el código anterior, cambia la variable bert_ckpt_dir al directorio donde has almacenado los archivos de checkpoint de bert. Además, cambia max_seq_len a la longitud máxima de secuencia que has utilizado durante el ajuste fino del modelo BERT.

    ¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta.

    Gracias y saludos,
    [Tu nombre]

Comments are closed.