Path: blob/master/site/es-419/tfx/tutorials/transform/simple.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Preprocesamiento de datos con TensorFlow Transform
El componente de ingeniería de características de TensorFlow Extended (TFX)
Nota: Recomendamos ejecutar este tutorial en un bloc de notas de Colab, ¡no es necesario configurarlo! Simplemente haga clic en "Ejecutar en Google Colab".
Este bloc de notas de Colab de ejemplo proporciona un ejemplo muy simple de cómo se puede usar TensorFlow Transform (tf.Transform
) para preprocesar datos de manera que se use exactamente el mismo código tanto para entrenar un modelo como para hacer inferencias en producción.
TensorFlow Transform es una biblioteca que permite preprocesar datos de entrada para TensorFlow, lo que incluye la creación de características que requieren un paso completo sobre el conjunto de datos de entrenamiento. Por ejemplo, mediante el uso de TensorFlow Transform podría hacer lo siguiente:
Normalizar un valor de entrada a través del uso de la media y la desviación estándar
Convertir cadenas a números enteros mediante la generación de un vocabulario sobre todos los valores de entrada
Convertir valores flotantes en enteros al asignarlos a cubos, en función de la distribución de datos observada
TensorFlow tiene soporte integrado para manipulaciones en un solo ejemplo o un lote de ejemplos. tf.Transform
amplía estas capacidades para permitir pasos completos sobre todo el conjunto de datos de entrenamiento.
La salida de tf.Transform
se exporta como un grafo de TensorFlow que se puede usar tanto para entrenamiento como para servicio. Usar el mismo grafo tanto para el entrenamiento como para el servicio sirve para evitar sesgos, ya que se aplican las mismas transformaciones en ambas etapas.
Actualización de pip
Para evitar actualizar Pip en un sistema cuando se ejecuta localmente, verifique que se esté ejecutando en Colab. Por supuesto, los sistemas locales se pueden actualizar por separado.
Instale TensorFlow Transform
Importaciones
Datos: cree algunos datos ficticios
Crearemos algunos datos ficticios simples para nuestro ejemplo simple:
raw_data
son los datos sin procesar iniciales que vamos a preprocesarraw_data_metadata
contiene el esquema que nos indica los tipos de cada una de las columnas enraw_data
. En este caso, es muy sencillo.
Transformación: cree una función de preprocesamiento
La función de preprocesamiento es el concepto más importante de tf.Transform. Una función de preprocesamiento es la que realmente ejecuta la transformación del conjunto de datos. Acepta y devuelve un diccionario de tensores, donde tensor significa Tensor
o SparseTensor
. Hay dos grupos principales de llamadas API que normalmente constituyen el núcleo de una función de preprocesamiento:
TensorFlow Ops: cualquier función que acepte y devuelva tensores, lo que generalmente significa operaciones de TensorFlow. Estas agregan operaciones de TensorFlow al grafo que transforma datos sin procesar en datos transformados, un vector de características a la vez. Estas se ejecutarán para cada ejemplo, tanto durante el entrenamiento como durante el servicio.
Tensorflow Transform Analyzers/Mappers: cualquiera de los analizadores/asignadores que ofrece tf.Transform. Estos también aceptan y devuelven tensores y, por lo general, contienen una combinación de operaciones de Tensorflow y cálculos de Beam, pero a diferencia de las operaciones de TensorFlow, solo se ejecutan en la canalización de Beam durante el análisis, lo que requiere un paso completo por todo el conjunto de datos de entrenamiento. El cálculo de Beam se ejecuta solo una vez (antes del entrenamiento, durante el análisis) y, por lo general, hace un recorrido completo por todo el conjunto de datos de entrenamiento. Se encargan de crear tensores
tf.constant
, que se agregan a su grafo. Por ejemplo,tft.min
calcula el mínimo de un tensor sobre el conjunto de datos de entrenamiento.
Atención: Cuando aplique su función de preprocesamiento para servir inferencias, las constantes creadas por los analizadores durante el entrenamiento no cambiarán. Si sus datos tienen componentes de tendencia o estacionalidad, planifique en consecuencia.
Nota: No es posible llamar directamente la preprocessing_fn
. Esto significa que llamar preprocessing_fn(raw_data)
no funcionará. En su lugar, se debe pasar a la API Transform Beam como se muestra en las siguientes celdas.
Sintaxis
Está casi listo para armar todo y usar Apache Beam para ejecutarlo.
Apache Beam usa una sintaxis especial para definir e invocar transformaciones. Por ejemplo, en esta línea:
El método to_this_call
se invoca y se pasa el objeto llamado pass_this
, y esta operación se conocerá como name this step
en un seguimiento de pila. El resultado de la llamada a to_this_call
se devuelve en result
. A menudo verá etapas de una canalización encadenadas de esta manera:
y como comenzó con una nueva canalización, puede continuar así:
Unimos todo
Ahora estamos listos para transformar nuestros datos. Usaremos Apache Beam con un ejecutor directo y proporcionaremos tres entradas:
raw_data
: los datos de entrada sin procesar que creamos anteriormenteraw_data_metadata
: el esquema de los datos sin procesarpreprocessing_fn
: la función que creamos para ejecutar nuestra transformación.
¿Es esta la respuesta correcta?
Anteriormente, usamos tf.Transform
para hacer esto:
x_centered: con la entrada de
[1, 2, 3]
la media de x es 2, y la restamos de x para centrar nuestros valores de x en 0. Entonces, nuestro resultado de[-1.0, 0.0, 1.0]
es correcto.y_normalized: queríamos escalar nuestros valores de y entre 0 y 1. Nuestra entrada fue
[1, 2, 3]
, por lo que nuestro resultado de[0.0, 0.5, 1.0]
es correcto.s_integerized: queríamos asignar nuestras cadenas a índices en un vocabulario, y solo había 2 palabras en nuestro vocabulario ("hola" y "mundo"). Entonces, con la entrada de
["hello", "world", "hello"]
nuestro resultado de[0, 1, 0]
es correcto. Dado que "hola" aparece con mayor frecuencia en estos datos, será la primera entrada en el vocabulario.x_centered_times_y_normalized: queríamos crear una nueva característica al cruzar
x_centered
cony_normalized
mediante una multiplicación. Tenga en cuenta que esto multiplica los resultados, no los valores originales, y nuestro nuevo resultado de[-0.0, 0.0, 1.0]
es correcto.
Use la transform_fn
resultante
El directorio transform_fn/
contiene una implementación tf.saved_model
con todas las constantes de los resultados del análisis de transformación de tensorflow integrados en el grafo.
Es posible cargar esto directamente con tf.saved_model.load
, pero no es fácil de usar:
Una mejor opción sería cargarlo con tft.TFTransformOutput
. El método TFTransformOutput.transform_features_layer
devuelve un objeto tft.TransformFeaturesLayer
que se puede usar para aplicar la transformación:
El objeto tft.TransformFeaturesLayer
espera un diccionario de funciones por lotes. Por lo tanto, debe crear un Dict[str, tf.Tensor]
de List[Dict[str, Any]]
en raw_data
:
Puede usar tft.TransformFeaturesLayer
por sí solo:
Exporte
Un caso de uso más típico sería usar tf.Transform
para aplicar la transformación a los conjuntos de datos de entrenamiento y evaluación (consulte el siguiente tutorial para ver un ejemplo). Luego, después del entrenamiento, antes de exportar el modelo, adjunte tft.TransformFeaturesLayer
como primera capa para que pueda exportarlo como parte de su tf.saved_model
. Continúe leyendo para ver un ejemplo concreto.
Un modelo de entrenamiento de ejemplo
A continuación, se muestra un modelo que cumple con las siguientes características:
toma el lote transformado,
los apila todos juntos en una matriz simple
(batch, features)
,los ejecuta a través de algunas capas densas, y
produce 10 salidas lineales.
En un caso de uso real, se aplicaría una codificación única a la función s_integerized
.
Podría entrenar este modelo en un conjunto de datos transformado por tf.Transform
:
Imaginemos que entrenamos el modelo.
Este modelo se ejecuta en las entradas transformadas.
Un ejemplo de envoltorio de exportación
Imaginemos que hemos entrenado el modelo anterior y queremos exportarlo.
Será conveniente incluir la función de transformación en el modelo exportado:
Este modelo combinado funciona con los datos sin procesar y produce exactamente los mismos resultados que llamar directamente al modelo entrenado:
Este export_model
incluye tft.TransformFeaturesLayer
y es completamente autónomo. Puede guardarlo y restaurarlo en otro entorno y seguir obteniendo exactamente el mismo resultado: