Path: blob/master/site/es-419/guide/keras/preprocessing_layers.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Cómo trabajar con capas de preprocesamiento
El preprocesamiento en Keras
La API con capas para preprocesamiento de Keras permite a los desarrolladores crear canalizaciones de procesamiento para las entradas nativas de Keras. Estas canalizaciones para el procesamiento de las entradas se pueden utilizar como un código de preprocesamiento independiente en flujos de trabajo que no sean parte de Keras, combinarse directamente con modelos de Keras y exportarse como parte de un SavedModel de Keras.
Con las capas para preprocesamiento de Keras, puede crear y exportar modelos que sean realmente integrales: modelos que acepten como entrada imágenes o datos estructurados sin procesar, modelos que controlen la normalización de características o la indexación de los valores de dichas características por su cuenta.
Preprocesamiento disponible
Preprocesamiento de texto
tf.keras.layers.TextVectorization
: convierte las cadenas sin procesar en una representación codificada que puede leerse por una capaEmbedding
o una capa de tipoDense
.
Preprocesamiento de funciones numéricas
tf.keras.layers.Normalization
: realiza la normalización de las funciones de entrada.tf.keras.layers.Discretization
: convierte a las funciones numéricas continuas en funciones categóricas enteras.
Preprocesamiento de funciones categóricas
tf.keras.layers.CategoryEncoding
: convierte a las funciones categóricas enteras en representaciones densas de one-hot, multi-hot o un número de ellas.tf.keras.layers.Hashing
: realiza el hashing de las funciones categóricas, también conocido como el "truco del hashing".tf.keras.layers.StringLookup
: convierte a los valores categóricos de la cadena en una representación cifrada que puede leerse por una capaEmbedding
o una capaDense
.tf.keras.layers.IntegerLookup
: convierte a los valores categóricos enteros en una representación cifrada que puede leerse por una capaEmbedding
o una capaDense
.
Preprocesamiento de imágenes
Estas capas sirven para estandarizar las entradas en un modelo de imagen.
tf.keras.layers.Resizing
: redimensiona un lote de imágenes a un tamaño objetivo.tf.keras.layers.Rescaling
: redimensiona y compensa los valores de un lote de imágenes (por ejemplo, pasar las entradas de un rango[0, 255]
a las entradas en el rango[0, 1]
.tf.keras.layers.CenterCrop
: devuelve el recorte central de un lote de imágenes.
Aumentar los datos de la imagen
Estas capas aplican aumento en las transformaciones de forma aleatoria a un lote de imágenes. Solo estarán activas durante el entrenamiento.
tf.keras.layers.RandomCrop
tf.keras.layers.RandomFlip
tf.keras.layers.RandomTranslation
tf.keras.layers.RandomRotation
tf.keras.layers.RandomZoom
tf.keras.layers.RandomHeight
tf.keras.layers.RandomWidth
tf.keras.layers.RandomContrast
El método adapt()
Algunas capas de preprocesamiento tienen un estado interno que puede calcularse a partir de una muestra de los datos de entrenamiento. La lista de capas de preprocesamiento con estado es:
TextVectorization
: contiene un mapeo entre tokens de cadena e índices enterosStringLookup
yIntegerLookup
: contienen una correspondencia entre valores de entrada e índices enteros.Normalization
: contiene el promedio y la desviación estándar de las características.Discretization
: contiene información sobre los límites de los cubos de valores.
Estas capas no son entrenables. Su estado no se establece durante el entrenamiento; debe establecerse antes del entrenamiento, ya sea inicializándolas a partir de una constante precalculada o "adaptándolas" a los datos.
Se establece el estado de una capa de preprocesamiento exponiéndola a los datos de entrenamiento, mediante el método adapt()
:
El método adapt()
toma un array Numpy o un objeto tf.data.Dataset
. En el caso de StringLookup
y TextVectorization
, también se puede pasar una lista de cadenas:
Además, las capas adaptables siempre exponen una opción para establecer directamente el estado mediante argumentos del constructor o asignación de pesos. Si los valores de estado deseados se conocen en el momento de la construcción de la capa, o se calculan fuera de la llamada adapt()
, pueden establecerse sin depender del cálculo interno de la capa. Por ejemplo, si ya existen archivos de vocabulario externos para las capas TextVectorization
, StringLookup
, o IntegerLookup
, pueden cargarse directamente en las tablas de búsqueda pasando una ruta al archivo de vocabulario en los argumentos del constructor de la capa.
A continuación se muestra un ejemplo en el que creamos una capa StringLookup
con vocabulario precalculado:
Preprocesamiento de datos antes del modelo o dentro del modelo
Hay dos formas de utilizar las capas de preprocesamiento:
Opción 1: Haga que sean parte del modelo, de la siguiente manera:
Con esta opción, el preprocesamiento se realizará en el dispositivo, de forma sincronizada con el resto de la ejecución del modelo, lo que significa que se beneficiará de la aceleración de la GPU. Si está entrenando en la GPU, esta es la mejor opción para la capa Normalization
, y para todas las capas de preprocesamiento de imágenes y aumento de datos.
Opción 2: aplíquelo a su tf.data.Dataset
, para obtener un conjunto de datos que produzca lotes de datos preprocesados, como este:
Con esta opción, el preprocesamiento se realizará en la CPU, de forma asíncrona, y se almacenará en el búfer antes de pasar al modelo. Además, si llama dataset.prefetch(tf.data.AUTOTUNE)
a su conjunto de datos, el preprocesamiento se realizará eficientemente en paralelo con el entrenamiento:
Esta es la mejor opción para TextVectorization
, y todas las capas de preprocesamiento de datos estructurados. También puede ser una buena opción si entrena con CPU y utiliza capas de preprocesamiento de imágenes.
Cuando se ejecuta en TPU, siempre debe colocar las capas de preprocesamiento en el pipeline tf.data
(con la excepción de Normalization
y Rescaling
, que se ejecutan bien en TPU y se utilizan comúnmente ya que la primera capa es un modelo de imagen).
Ventajas de preprocesar el modelo durante la inferencia
Incluso si opta por la opción 2, es posible que más adelante desee exportar un modelo de extremo a extremo basado solo en la inferencia que incluya las capas de preprocesamiento. La principal ventaja de hacer esto es que hace que el modelo sea portátil y ayuda a reducir la distorsión del entrenamiento/servicio.
Cuando todo el preprocesamiento de datos forma parte del modelo, otras personas pueden cargar y utilizar su modelo sin tener que saber cómo se espera que se codifique y normalice cada característica. Su modelo de inferencia podrá procesar imágenes en bruto o datos estructurados en bruto, y no requerirá que los usuarios del modelo conozcan los detalles de, por ejemplo, el esquema de tokenización utilizado para el texto, el esquema de indexación utilizado para las características categóricas, si los valores de los pixeles de la imagen se normalizan a [-1, +1]
o a [0, 1]
, etc. Esto es especialmente poderoso si exporta su modelo a otro tiempo de ejecución, como TensorFlow.js: no tendrá que volver a implementar su canal de preprocesamiento en JavaScript.
Si inicialmente coloca sus capas de preprocesamiento en su canalización tf.data
, puede exportar un modelo de inferencia que empaquete el preprocesamiento. Simplemente instancie un nuevo modelo que encadene sus capas de preprocesamiento y su modelo de entrenamiento:
Recursos rápidos
Aumentar los datos de la imagen
Tenga en cuenta que las capas de aumento de datos de la imagen solo están activas durante el entrenamiento (de forma similar a la capa Dropout
).
Puede ver una configuración similar en acción en el ejemplo clasificación de imágenes desde cero.
Normalización de las características numéricas
Codificación de funciones categóricas de las cadenas mediante la codificación en un solo paso
Observe que, aquí, el índice 0 se reserva para valores que están fuera del vocabulario (valores que no se vieron durante adapt()
).
Puede ver el StringLookup
en acción en el ejemplo Clasificación de datos estructurados desde cero.
Codificación de funciones categóricas de números enteros mediante la codificación en un solo paso
Tenga en cuenta que el índice 0 está reservado para aquellos valores que faltan (que debería especificar como el valor 0), y el índice 1 está reservado para valores fuera del vocabulario (valores que no se vieron durante adapt()
). Puede configurar esto utilizando los argumentos del constructor mask_token
y oov_token
de IntegerLookup
.
Puede ver IntegerLookup
en acción en el ejemplo clasificación de datos estructurados desde cero.
Cómo aplicar el truco hashing a una característica categórica entera
Si tiene una característica categórica que puede tomar muchos valores diferentes (del orden de 10e3 o más), en la que cada valor solo aparece unas pocas veces en los datos, resulta poco práctico e ineficaz indexar y codificar con un solo paso los valores de la característica. En cambio, puede ser una buena idea aplicar el "truco del hash": codificar los valores en un vector de tamaño fijo. De este modo, el tamaño del espacio de características se mantiene administrable y se elimina la necesidad de una indexación explícita.
Codificación de texto como secuencia de índices de tokens
Así es como debe preprocesar el texto que va a pasar a una capa Embedding
.
Puede ver la capa TextVectorization
en acción, combinada con un modo Embedding
, en el ejemplo clasificación de texto desde cero.
Tenga en cuenta que al entrenar un modelo de este tipo, para obtener el mejor rendimiento, siempre debe utilizar la capa TextVectorization
como parte del canal de entrada.
Codificación de textos como matrices densas de ngramas con codificación multi-hot
Esta es la forma en que debe preprocesar el texto que va a pasar a una capa Dense
.
Codificación de texto como matriz densa de ngramas con ponderación TF-IDF
Se trata de una forma alternativa de preprocesar el texto antes de pasarlo a una capa Dense
.
Trucos importantes
Trabajar con capas de búsqueda y vocabularios muy extensos
Puede que se encuentre trabajando con un vocabulario muy grande en una capa TextVectorization
, una capa StringLookup
o una capa IntegerLookup
. Normalmente, un vocabulario de más de 500 MB se consideraría "muy grande".
En tal caso, para obtener el mejor rendimiento, debe evitar el uso de adapt()
. En cambio, precalcule su vocabulario con antelación (puede utilizar Apache Beam o TF Transform para ello) y guárdelo en un archivo. A continuación, cargue el vocabulario en la capa en el momento de la construcción pasando la ruta del archivo como argumento vocabulary
.
Cómo utilizar capas de búsqueda en un pod TPU o con ParameterServerStrategy
.
Hay un problema pendiente que hace que el rendimiento se reduzca cuando se utiliza una capa TextVectorization
, StringLookup
, o IntegerLookup
mientras se entrena en un pod TPU o en múltiples máquinas mediante ParameterServerStrategy
. Esto está programado para ser corregido en TensorFlow 2.7.