Path: blob/master/site/es-419/hub/tutorials/bangla_article_classifier.ipynb
25118 views
Copyright 2019 The TensorFlow Hub Authors.
Licensed under the Apache License, Version 2.0 (the "License");
Clasificación de artículos en bengalí con TF-Hub
Precaución: Además de instalar paquetes de Python con pip, en este bloc de notas se usa sudo apt install
para instalar paquetes del sistema: unzip
.
En esta colaboración se demuestra el uso de TensorFlow Hub para la clasificación de idiomas diferentes del inglés. En este caso, elegimos bengalí como idioma local y utilizamos incorporaciones de palabras previamente entrenadas para resolver tareas de clasificación multiclase, donde clasificamos artículos de noticias en bengalí de fastText, una biblioteca de Facebook con vectores de palabras preentrenados para 157 idiomas.
Usaremos el exportador de incorporaciones preentrenadas de TF-Hub para convertir las incorporaciones de palabras en un módulo de incorporación de textos y luego usarlo para entrenar un clasificador con tf.keras, la API de alto nivel, fácil de usar, de Tensorflow para crear modelos de aprendizaje profundo. Incluso aunque usemos incorporaciones fastText en este caso, es posible exportar cualquier otra incorporación previamente entrenada de otras tareas y obtener rápidamente resultados con Tensorflow Hub.
Preparación
Conjunto de datos
Utilizaremos BARD (Bangla Article Dataset, el conjunto de datos de artículos en bengalí) que tiene alrededor de 376 226 artículos recolectados a partir de diferentes portales de noticias en bengalí y están etiquetados según 5 categorías: economía, política, internacionales, deportes y entretenimiento. Descargamos el archivo de Google Drive. Este enlace (bit.ly/BARD_DATASET) conecta con este repositorio de GitHub.
Exportación de vectores de palabras previamente entrenados para módulo de TF-Hub
TF-Hub ofrece scripts útiles para convertir incorporaciones de palabras en módulos de incorporación de textos para TF-hub aquí. Para hacer el módulo de bengalí o cualquier otro idioma, simplemente debemos descargar un archivo .txt
o .vec
de incorporación de textos en el mismo directorio que export_v2.py
y ejecutar el script.
El exportador lee los vectores de incorporación y los exporta a un SavedModel de Tensorflow. El SavedModel contiene un programa completo de TensorFlow que incluye los pesos y el grafo. TF-Hub puede cargar el SavedModel como un módulo que usaremos para construir el modelo para clasificación de textos. Como estamos usando tf.keras
para crear el modelo, utilizaremos hub.KerasLayer, que ofrece un encapsulador (wrapper) para que el módulo de TF-Hub lo use como una capa Keras.
Primero, obtendremos las incorporaciones de palabras de fastText y el exportador de incorporaciones del repositorio de TF-Hub.
Después, ejecutaremos el script exportador en nuestro archivo de incorporaciones. Como las incorporaciones de fastText tienen una línea de encabezado y son bastante grandes (alrededor de 3.3 GB para bengalí después de la conversión a un módulo) ignoramos la primera línea y exportamos solamente los primeros 100 000 tokens al módulo de incorporación de textos.
El módulo de incorporación de textos toma un lote de oraciones en un tensor de 1 D de strings como entrada y emite como salida vectores de incorporación, con la forma (batch_size, embedding_dim), correspondientes a las oraciones. Se preprocesa la entrada dividiendo por los espacios. Las incorporaciones de textos se combinan en incorporaciones de oraciones con el combinador sqrtn
(ver aquí). Para demostrarlo pasamos una lista de palabras en bengalí como entrada y obtuvimos los vectores de incorporación correspondientes.
Conversión a conjunto de datos de Tensorflow
Dado que el conjunto de datos es realmente grande, en vez de cargarlo completo en la memoria, usaremos un generador que produzca muestras en tiempo de ejecución, en lotes. Lo haremos utilizando las funciones del conjunto de datos de Tensorflow. El conjunto de datos también está muy desbalanceado, entonces, antes de usar el generador, lo aleatorizaremos.
Podemos verificar la distribución de etiquetas en los ejemplos de entrenamiento y validación, después de la aleatorización.
Para crear un conjunto de datos con un generador, primero escribimos la función del generador que lee cada uno de los artículos de file_paths
y las etiquetas del arreglo de etiquetas y produce un ejemplo de entrenamiento a cada paso. Pasamos esta función generadora al método tf.data.Dataset.from_generator
y especificamos los tipos de salida. Cada ejemplo de entrenamiento es una tupla que contiene un artículo de tipo de datos tf.string
y una etiqueta codificada en un solo paso (one-hot). Dividimos el conjunto de datos con una separación para validación de entrenamiento de 80-20 con los métodos tf.data.Dataset.skip
y tf.data.Dataset.take
.
Entrenamiento y evaluación del modelo
Como ya hemos agregado un encapsulador en torno a nuestro módulo para usarlo como cualquier otra capa de Keras, ahora podemos crear un modelo secuencial pequeño que sea una acumulación (pila) lineal de capas. Podemos agregar nuestro módulo de incorporación de textos con model.add
, del mismo modo que con cualquier otra capa. Compilamos el modelo mediante la especificación de la pérdida y el optimizador, y lo entrenamos por 10 épocas. La API tf.keras
puede tratar a los conjuntos de datos de TensorFlow como entradas, lo que nos permite pasar una instancia de un conjunto de datos al método adecuado para el entrenamiento del modelo. Dado que usamos la función del generador, tf.data
trabajará con las muestras generadoras, agrupará en lotes y las enviará al modelo.
Modelo
Entrenamiento
Evaluación
Podemos visualizar las curvas de exactitud y pérdida para los datos de entrenamiento y validación con el objeto tf.keras.callbacks.History
devuelto por el método tf.keras.Model.fit
, que contiene los valores de pérdida y exactitud para cada época.
Predicción
Podemos obtener las predicciones para los datos de validación y controlar la matriz de confusión para ver el desempeño del modelo en cada una de las 5 clases. Porque el método tf.keras.Model.predict
devuelve un arreglo n-d para las probabilidades de cada clase, que se pueden convertir en etiquetas de clase con np.argmax
.
Comparación del desempeño
Ahora podemos tomar de labels
las etiquetas correctas para los datos de validación y podemos compararlas con nuestras predicciones para obtener un classification_report.
También podemos comparar el desempeño de nuestro modelo con los resultados publicados obtenidos en la publicación original, que tenían una precisión de 0.96. Los autores originales describen muchos pasos de preprocesamiento efectuados al conjunto de datos; tales como dejar caer puntuaciones y dígitos, quitando las primeras 25 palabras vacías frecuentes. Como podemos ver en el classification_report
, ¡también logramos obtener una precisión y exactitud del 0.96 después de entrenar solamente durante 5 épocas sin ningún procesamiento previo!
En este ejemplo, cuando creamos la capa Keras a partir de nuestro módulo de incorporaciones, preparamos el parámetro trainable=False
; significa que los pesos de las incorporaciones no se actualizarán durante el entrenamiento. Pruebe definiéndolo como True
para alcanzar una exactitud de aproximadamente el 97% con este conjunto de datos después de solamente 2 épocas.