sábado, 23 de julio de 2022

Introducción a TensorFlow Hub

Una de las cosas que es tan fundamental en el desarrollo de software que es fácil pasar por alto es la idea de un repositorio de código compartido. Como programadores, las bibliotecas nos hacen inmediatamente más efectivos. En cierto sentido, cambian el proceso de resolución de problemas de la programación. Cuando usamos una biblioteca, a menudo pensamos en la programación en términos de bloques de construcción, o módulos, que se pueden unir.

Además de compartir código, también se pueden compartir redes previamente entrenadas. Esto hace posible que un desarrollador pueda personalizarla para su dominio, sin tener acceso a los recursos informáticos o los datos utilizados para entrenar el modelo originalmente disponible. Por ejemplo, NASNet tomó miles de horas de GPU para entrenar. Al compartir los pesos aprendidos, se puede facilitar que otros puedan reutilizar y desarrollar su trabajo.

Introducción a TensorFlow Hub

"Ingredientes" de una red de aprendizaje automático que se puede empaquetar y compartir a través de TensorFlow Hub. En cierto sentido, al compartir una red pre-entrenada también se comparte el tiempo de cómputo y el conjunto de datos utilizados para desarrollar el modelo, además de la arquitectura misma.


TensorFlow Hub es una plataforma para publicar, descubrir y reutilizar partes de módulos de aprendizaje automático en TensorFlow. Por módulo, nos referimos a una pieza autónoma de un gráfico TensorFlow, junto con sus pesos, que se puede reutilizar en otras tareas similares. Al reutilizar un módulo, un desarrollador puede entrenar un modelo usando un conjunto de datos más pequeño, mejorar la generalización o simplemente acelerar el entrenamiento. Veamos un par de ejemplos para hacer esto concreto.

Reentrenamiento de imagen

Como primer ejemplo, veamos una técnica que podemos utilizar para entrenar un clasificador de imágenes, comenzando con solo una pequeña cantidad de datos de entrenamiento. Las redes modernas de reconocimiento de imágenes tienen millones de parámetros y, por supuesto, entrenar una desde cero requiere una gran cantidad de datos etiquetados y potencia informática. Usando una técnica llamada Re-entrenamiento de imagen, podemos entrenar una red utilizando una cantidad de datos mucho menor y mucho menos tiempo de computación. Así es como se ve esto en TensorFlow Hub.

# Download and use NASNet feature vector module.

module = hub.Module(

“https://tfhub.dev/google/imagenet/nasnet_large/feature_vector/1")

features = module(my_images)

logits = tf.layers.dense(features, NUM_CLASSES)

probabilities = tf.nn.softmax(logits)

La idea básica es reutilizar una red de reconocimiento de imagenes existente para extraer características de sus imágenes y luego re-entrenar la red. Como podemos ver arriba, los módulos de TensorFlow Hub pueden instanciarse desde una URL (o desde una ruta del sistema de archivos). Hay una variedad de módulos en TensorFlow Hub para elegir, incluidos varios sabores de NASNet, MobileNet (incluido su reciente V2), Inception, ResNet y otros. Para usar un módulo, hay que importar TensorFlow Hub, luego copiar y pegar la URL del módulo en nuestro código.

Reentrenamiento de imagen en TensorFlow Hub

Algunos de los módulos de imagen disponibles en TensorFlow Hub. Cada módulo tiene una interfaz definida que permite utilizarlo de manera reemplazable, con poco o ningún conocimiento de sus componentes internos. En este caso, este módulo tiene un método que puede usar para recuperar el tamaño de imagen esperado. Como desarrollador, solo necesitamos proporcionar un lote de imágenes en la forma correcta y llamar al módulo sobre ellas para recuperar la representación de la característica. Este módulo se encarga de preprocesar nuestras imágenes por nosotros, para que podamos pasar directamente de un lote de imágenes a una representación de características en un solo paso. Desde aquí, podemos entrenar una red u otro tipo de clasificador, además de estos.

En este caso, observaremos que el módulo que estamos utilizando está alojado por Google y está versionado (para que podamos confiar en que el módulo no cambia mientras trabajamos en nuestros experimentos). Los módulos se pueden aplicar como una función Python ordinaria para construir parte del gráfico. Una vez exportados al disco, los módulos son independientes y pueden ser utilizados por otros sin acceso al código y los datos utilizados para crearlo y entrenarlo (aunque, por supuesto, también podemos publicarlos).

Clasificación de texto

Echaremos un vistazo a un segundo ejemplo. Imaginamos que deseamos capacitar a una red para clasificar reseñas de películas como positivas o negativas, comenzando con solo una pequeña cantidad de datos de capacitación (por ejemplo, del orden de varios cientos de críticas de películas positivas y negativas). Como tenemos un número limitado de ejemplos, decidimos aprovechar un conjunto de datos de incrustaciones de palabras, previamente capacitados en un corpus mucho más grande. Así es como se ve esto usando TensorFlow Hub.

# Download a module and use it to retrieve word embeddings.

embed = hub.Module(“https://tfhub.dev/google/nnlm-en-dim50/1")

embeddings = embed([“The movie was great!”])

Como antes, comenzamos seleccionando un módulo. TensorFlow Hub tiene una variedad de módulos de texto para explorar, incluidos las redes de idiomas (EN, JP, DE y ES), así como Word2vec capacitado en Wikipedia y las incrustaciones de NNLM capacitadas en Google News.

Clasificación de texto en TensorFlow

En este caso, utilizaremos un módulo para la inserción de palabras. El código anterior descarga un módulo, lo usa para preprocesar una oración y luego recupera las incrustaciones para cada token. Esto significa que puede pasar directamente de una oración en su conjunto de datos a un formato adecuado para un clasificador en un solo paso. El módulo se encarga de tokenizar la oración y otras lógicas como manejar palabras fuera del vocabulario. Tanto la lógica de preprocesamiento como las incrustaciones están encapsuladas en un módulo, lo que hace que sea más fácil experimentar con varios conjuntos de datos de incrustaciones de palabras o diferentes estrategias de preprocesamiento, sin tener que cambiar sustancialmente nuestro código.

Clasificación de texto en TensorFlow

Codificador de oración universal

A continuación se muestra un ejemplo con un codificador de frases universales. Es un módulo de incrustación a nivel de oración capacitado en una amplia variedad de conjuntos de datos (en otras palabras, "universal"). Algunas de las cosas en las que es bueno son la similitud semántica, la clasificación de texto personalizado y la agrupación.

Codificador de oración universal en Tensor Flow

Este cuaderno de notas muestra cómo entrenar un clasificador de texto binario simple sobre cualquier módulo TF-Hub que podamos incrustar oraciones.

Al igual que en el reentrenamiento de imágenes, se requieren relativamente pocos datos etiquetados para adaptar el módulo a su propia tarea. Probémoslo en reseñas de restaurantes, por ejemplo.


# Use pre-trained universal sentence encoder to build text vector

review = hub.text_embedding_column(

“review”, “https://tfhub.dev/google/universal-sentence-encoder/1")

features = {

“review”: np.array([“this movie is a masterpiece”, “this movie was terrible”, …])

}

labels = np.array([[1], [0], …])

input_fn = tf.estimator.input.numpy_input_fn(features, labels, shuffle=True)

estimator = tf.estimator.DNNClassifier(hidden_units, [review])

estimator.train(input_fn, max_steps=100)

Otros módulos

TensorFlow Hub es más que clasificación de imágenes y texto. En el sitio web, también encontraremos un par de módulos para las características locales profundas de Progressive GAN y Googlemarks.

Consideraciones

Hay un par de consideraciones importantes al utilizar los módulos de TensorFlow Hub. Primero, recordar que los módulos contienen código ejecutable. Conviene utilizar siempre módulos de una fuente confiable. En segundo lugar, como en todo el aprendizaje automático, la imparcialidad es una consideración importante. Los dos ejemplos que mostramos arriba aprovechan grandes conjuntos de datos pre-entrenados. Al reutilizar un conjunto de datos de este tipo, es importante tener en cuenta qué datos contiene (y si existen sesgos allí) y cómo estos podrían afectar el producto que estamos creando y sus usuarios.



No hay comentarios:

Publicar un comentario