1. Antes de comenzar
En este codelab, revisarás el código creado con TensorFlow y Model Maker de TensorFlow Lite para crear un modelo con un conjunto de datos basado en comentarios spam. Los datos originales están disponibles en Kaggle. Se recopilaron en un único archivo CSV y se limpiaron mediante la eliminación de texto incorrecto, marcas, palabras repetidas y mucho más. Esto facilitará enfocarse en el modelo, en lugar de en el texto.
El código que revisarás se proporciona aquí, pero es muy recomendable que lo sigas en Google Colab.
Requisitos previos
- Este codelab se redactó para desarrolladores experimentados que no han usado el aprendizaje automático.
- Este codelab es parte de la ruta de aprendizaje Comienza a usar la clasificación de texto en dispositivos móviles. Si aún no has completado las actividades anteriores, hazlo ahora antes de continuar.
Qué aprenderás
- Cómo instalar Model Maker de TensorFlow Lite con Google Colab
- Cómo descargar los datos del servidor de Cloud a tu dispositivo
- Cómo usar un cargador de datos
- Cómo crear el modelo
Requisitos
- Acceso a Google Colab
2. Instala Model Maker de TensorFlow Lite
Abre el Colab. La primera celda del notebook instalará Model Maker de TensorFlow Lite:
!pip install -q tflite-model-maker
Cuando haya finalizado, avanza a la siguiente celda.
3. Importa el código
La siguiente celda contiene varias importaciones que deberá usar el código del notebook:
import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader
import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
También comprobará si estás ejecutando TensorFlow 2.x, que es un requisito para usar Model Maker.
4. Descarga los datos
A continuación, deberás descargar los datos del servidor de Cloud a tu dispositivo y configurar data_file para que haga referencia al archivo local:
data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
extract=False)
Model Maker puede entrenar modelos a partir de archivos CSV sencillos como este. Solo necesitas especificar qué columnas contienen el texto y cuáles contienen las etiquetas. Verás cómo hacerlo más adelante en el codelab.
5. Incorporaciones aprendidas previamente
Por lo general, cuando usas Model Maker, no creas modelos desde cero. Usas modelos existentes que personalizas según tus necesidades.
En el caso de los modelos de lenguaje, como este, esto implica el uso de incorporaciones previamente aprendidas. La idea detrás de una incorporación es que las palabras se conviertan en números. Cada número se otorga a cada palabra del corpus general. Una incorporación es un vector que se usa para determinar la opinión de una palabra estableciendo una “dirección” para ella. Por ejemplo, las palabras que se usan con frecuencia en mensajes de comentarios spam terminarán teniendo vectores que apuntan en una dirección similar, y las palabras que no lo son apuntarán en la dirección opuesta.
Cuando se usan incorporaciones ya aprendidas, se puede comenzar con un corpus o una colección de palabras, que ya tienen una opinión de un cuerpo de texto grande. Esto te permitirá llegar a una solución mucho más rápido que si comenzaras desde cero.
Model Maker proporciona varias incorporaciones aprendidas previamente que puedes usar, pero la más simple y rápida para comenzar es average_word_vec.
Este es el código:
spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7
El parámetro num_words
También especificarás la cantidad de palabras que deseas que use tu modelo.
Es posible que pienses que “cuanto más, mejor”, pero, en general, hay una cantidad adecuada en función de la frecuencia con la que se utiliza cada palabra. Si usas todas las palabras de todo el corpus, el modelo podría intentar aprender y establecer la dirección de las palabras que se usan solo una vez. En cualquier corpus de texto, encontrarás que muchas palabras solo se usan una o dos veces, y, por lo general, no vale la pena incluirlas en tu modelo, ya que tienen un impacto insignificante en la opinión general. Puedes ajustar tu modelo en función de la cantidad de palabras que desees con el parámetro num_words.
Un número menor podría proporcionar un modelo más pequeño y rápido, pero podría ser menos preciso, ya que reconoce menos palabras. Un número más grande aquí generará un modelo más grande y más lento. Encontrar el punto óptimo es clave.
El parámetro wordvec_dim
El parámetro wordved_dim es la cantidad de dimensiones que deseas usar para el vector de cada palabra. La regla general que se determina a partir de la investigación es que es la raíz cuarta de la cantidad de palabras. Por ejemplo, si usas 2,000 palabras, un buen punto de partida es 7. Si cambias la cantidad de palabras que usas, también puedes cambiar esto.
El parámetro seq_len
Por lo general, los modelos son muy rígidos en lo que respecta a los valores de entrada. Para un modelo de lenguaje, esto significa que el modelo puede clasificar oraciones de una longitud estática específica. Esto se determina con el parámetro seq_len o la longitud de la secuencia.
Cuando conviertes palabras en números (o tokens), una oración se convierte en una secuencia de esos tokens. Por lo tanto, tu modelo se entrenará (en este caso) para clasificar y reconocer oraciones que tengan 20 tokens. Si la oración es más larga, se truncará. Si es más corta, se rellenará. Verás un token <PAD> dedicado en el corpus que se usará para esto.
6. Usa un cargador de datos
Antes, descargaste el archivo CSV. Ahora, es el momento de usar un cargador de datos para convertir esto en datos de entrenamiento que el modelo puede reconocer:
data = DataLoader.from_csv(
filename=data_file,
text_column='commenttext',
label_column='spam',
model_spec=spec,
delimiter=',',
shuffle=True,
is_training=True)
train_data, test_data = data.split(0.9)
Si abres el archivo CSV en un editor, verás que cada línea solo tiene dos valores, que se describen con texto en la primera línea del archivo. Por lo general, cada entrada se considera una columna.
Verás que el descriptor de la primera columna es commenttext y que la primera entrada de cada línea es el texto del comentario. De manera similar, el descriptor de la segunda columna es spam, y observarás que la segunda entrada de cada línea es True o False, para indicar si ese texto se considera comentario spam o no. Las otras propiedades establecen el model_spec que creaste antes, junto con un carácter delimitador, que en este caso es una coma cuando el archivo está separado por comas. Usarás estos datos para entrenar el modelo, por lo que is_Training se establece como True.
Deberás retener una parte de los datos para probar el modelo. Divide los datos y deja un 90% para el entrenamiento y el otro 10% para pruebas y evaluación. Debido a esto, queremos asegurarnos de que los datos de prueba se elijan de forma aleatoria y que no sean el 10% inferior del conjunto de datos, por lo que debes usar shuffle=True cuando cargues los datos para aleatorizarlos.
7. Crea el modelo
La siguiente celda se usa simplemente para compilar el modelo y es una sola línea de código:
# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
validation_data=test_data)
Esto crea un modelo clasificador de texto con Model Maker, y debes especificar los datos de entrenamiento que deseas usar (como se configuró en el paso 4), la especificación del modelo (como se configuró en el paso 4) y una cantidad de épocas, que, en este caso, es 50.
El principio básico del aprendizaje automático es que es una forma de coincidencia de patrones. Primero, cargará los pesos previamente entrenados para las palabras y, luego, intentará agruparlos con una predicción de cuáles, cuando se agrupan, indican spam y cuáles no. La primera vez, es probable que se acerque a 50:50, ya que el modelo solo se está iniciando.

Luego, medirá los resultados de este ciclo y ejecutará el código de optimización para ajustar la predicción y, luego, volverá a intentarlo. Este es un ciclo de entrenamiento. Por lo tanto, si especificas epochs=50, pasará por ese “bucle” 50 veces.

Cuando llegues al ciclo de entrenamiento número 50, el modelo informará un nivel de exactitud mucho mayor. En este caso, se muestra un 99%.
En el lado derecho, verás las cifras de precisión de la validación. Por lo general, estos valores serán un poco más bajos que la precisión del entrenamiento, ya que son un indicador de cómo el modelo clasifica los datos que no "vio" antes. Utiliza el 10% de los datos de prueba que reservamos antes.

8. Exporta el modelo
Una vez que finalice el entrenamiento, podrás exportar el modelo.
TensorFlow entrena un modelo en su propio formato, y este debe convertirse al formato de TFLITE para usarse en una app para dispositivos móviles. Model Maker se encarga de esta complejidad por ti.
Solo tienes que exportar el modelo y especificar un directorio:
model.export(export_dir='/mm_spam')
Dentro de ese directorio, verás un archivo model.tflite. Descárgalo. Lo necesitarás en el siguiente codelab, en el que lo agregarás a tu app para Android.
Consideraciones para iOS
El modelo .tflite que acabas de exportar funciona bien para Android, ya que los metadatos sobre el modelo están integrados en él y Android Studio puede leer esos metadatos.
Estos metadatos son muy importantes, ya que incluyen un diccionario de tokens que representan palabras tal como las reconoce el modelo. ¿Recuerdas que, anteriormente, aprendiste que las palabras se convierten en tokens y que, luego, estos tokens reciben vectores para su sentimiento? Tu app para dispositivos móviles deberá conocer estos tokens. Por ejemplo, si "perro" se tokenizó como 42 y los usuarios escriben "perro" en una oración, tu app deberá convertir "perro" en 42 para que el modelo lo comprenda. Como desarrollador de Android, tendrás una "biblioteca de tareas de TensorFlow Lite" que facilitará el uso de esta función, pero en iOS deberás procesar el vocabulario, por lo que deberás tenerlo disponible. Model Maker puede exportar esto por ti si especificas el parámetro export_format. Por lo tanto, para obtener las etiquetas y el vocabulario de tu modelo, puedes usar lo siguiente:
model.export(export_dir='/mm_spam/',
export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])
9. Felicitaciones
En este codelab, te guiamos a través del código de Python para crear y exportar tu modelo. Al final, tendrás un archivo .tflite.
En el siguiente codelab, verás cómo editar tu app para Android para usar este modelo y comenzar a clasificar los comentarios como spam.