Path: blob/master/site/es-419/io/tutorials/avro.ipynb
25118 views
Copyright 2020 The TensorFlow IO Authors.
API de conjunto de datos de Avro
Descripción general
El objetivo de la API del conjunto de datos de Avro es cargar datos formateados en Avro de forma nativa en TensorFlow como un conjunto de datos de TensorFlow. Avro es un sistema de serialización de datos similar a Protocol Buffers. Se usa mucho en Apache Hadoop, donde puede proporcionar un formato de serialización para datos persistentes y un formato de conexión para la comunicación entre nodos de Hadoop. Los datos de Avro son un formato de datos binarios compactados y orientados a filas. Se basa en un esquema que se almacena como un archivo JSON independiente. Para conocer las especificaciones del formato Avro y la declaración del esquema, consulte el manual oficial.
Paquete de preparación
Instalar el paquete tensorflow-io necesario
Importe paquetes
Validar las importaciones de tf y de tfio
Uso
Explorar el conjunto de datos
Para los fines de este tutorial, descarguemos el conjunto de datos de muestra de Avro.
Descargue un archivo Avro de muestra:
Descargue el archivo de esquema correspondiente del archivo Avro de muestra:
En el ejemplo anterior, se creó un conjunto de datos de Avro de prueba basado en el conjunto de datos mnist. El conjunto de datos mnist original en formato TFRecord se genera a partir del conjunto de datos con nombre TF. Sin embargo, el conjunto de datos mnist es demasiado grande como conjunto de datos de demostración. Para simplificar, se recortó bastante y solo se conservaron los primeros registros. Además, se realizó un recorte adicional para el campo image
en el conjunto de datos original de mnist y se asignó al campo features
en Avro. Entonces, el archivo avro train.avro
tiene 4 registros, cada uno de los cuales tiene 3 campos: features
, que es un arreglo de int, label
, un int o nulo y dataType
, una enum. Para ver el train.avro
decodificado (tenga en cuenta que el archivo de datos de Avro original no es legible por humanos ya que avro es un formato compactado):
Instale el paquete requerido para leer el archivo Avro:
Para leer e imprimir un archivo Avro en un formato legible por humanos:
Y el esquema de train.avro
representado por train.avsc
es un archivo con formato JSON. Para ver el train.avsc
:
Preparar el conjunto de datos
Cargue train.avro
como conjunto de datos de TensorFlow con la API del conjunto de datos de Avro:
En el ejemplo anterior se convierte train.avro
en un conjunto de datos de TensorFlow. Cada elemento del conjunto de datos es un diccionario cuya clave es el nombre de la función, el valor es el tensor denso o disperso convertido. Por ejemplo, convierte el campo features
, label
y dataType
en VarLenFeature(SparseTensor), FixedLenFeature(DenseTensor) y FixedLenFeature(DenseTensor) respectivamente. Dado que batch_size es 3, coacciona 3 registros de train.avro
en un elemento en el conjunto de datos resultante. Para el primer registro en train.avro
cuya etiqueta es nula, el lector de Avro lo reemplaza con el valor predeterminado especificado (-100). En este ejemplo, hay 4 registros en total en train.avro
. Dado que el tamaño del lote es 3, el conjunto de datos resultante contiene 3 elementos, el último de los cuales tiene un tamaño de lote de 1. Sin embargo, el usuario también puede descartar el último lote si el tamaño es menor que el tamaño del lote habilitando drop_final_batch
. Por ejemplo:
También se puede aumentar num_parallel_reads para acelerar el procesamiento de datos de Avro aumentando el paralelismo de parseo/lectura de Avro.
Para conocer el uso detallado de make_avro_record_dataset
, consulte el documento de API.
Entrenar modelos tf.keras con el conjunto de datos de Avro
Ahora veamos un ejemplo de principio a fin de entrenamiento del modelo tf.keras con un conjunto de datos de Avro basado en un conjunto de datos mnist.
Cargue train.avro
como conjunto de datos de TensorFlow con la API del conjunto de datos de Avro:
Defina un modelo keras simple:
Entrene el modelo keras con el conjunto de datos de Avro:
El conjunto de datos de Avro puede parsear y convertir cualquier dato de Avro en tensores de TensorFlow, incluidos registros en registros, mapas, arreglos, ramas y enumeraciones. La información de parseo se pasa a la implementación del conjunto de datos de Avro como un mapa donde las claves codifican cómo parsear los valores de datos y codifican cómo convertir los datos en tensores de TensorFlow. Así se decide el tipo primitivo (por ejemplo, bool, int, long, float, double, string) así como también el tipo de tensor (por ejemplo, disperso o denso). A continuación, se proporciona una lista de los tipos de parseadores de TensorFlow (consulte la Tabla 1) y la coerción de los tipos primitivos (Tabla 2).
Tabla 1: tipos de parseadores de TensorFlow admitidos:
Tipos de parseadores de TensorFlow | Tensores de TensorFlow | Explicación |
---|---|---|
tf.FixedLenFeature([], tf.int32) | tensor denso | Parsee una característica de longitud fija; es decir, todas las filas tienen una misma cantidad constante de elementos, por ejemplo, solo un elemento o un arreglo que siempre tiene la misma cantidad de elementos para cada fila. |
tf.SparseFeature(index_key=['key_1st_index', 'key_2nd_index'], value_key='key_value', dtype=tf.int64, size=[20, 50]) | tensor disperso | Parsee una característica dispersa donde cada fila tiene una lista de índices y valores de longitud variable. La 'index_key' identifica los índices. La 'value_key' identifica el valor. El 'dtype' es el tipo de datos. El 'size' es el valor de índice máximo esperado para cada entrada de índice. |
tfio.experimental.columnar.VarLenFeatureWithRank([],tf.int64) | tensor disperso | Parsee una característica de longitud variable; eso significa que cada fila de datos puede tener una cantidad variable de elementos, por ejemplo, la primera fila tiene 5 elementos, la segunda fila tiene 7 elementos |
Tabla 2, conversión admitida de tipos Avro a tipos de TensorFlow:
Tipo primitivo de Avro | Tipo primitivo de TensorFlow |
---|---|
booleano: un valor binario | tf.bool |
bytes: una secuencia de bytes de 8 bits sin signo | tf.string |
double: número de punto flotante IEEE de 64 bits de doble precisión | tf.float64 |
enum: tipo de enumeración | tf.string con el nombre del símbolo |
float: número de punto flotante IEEE de 32 bits de precisión simple | tf.float32 |
int: entero de 32 bits con signo | tf.int32 |
int: entero de 64 bits con signo | tf.int64 |
null: sin valor | usa el valor predeterminado |
string: secuencia de caracteres de Unicode | tf.string |
En las pruebas puede encontrar un conjunto completo de ejemplos de la API del conjunto de datos de Avro.