Path: blob/master/site/es-419/tutorials/generative/data_compression.ipynb
25118 views
Copyright 2022 The TensorFlow Compression Authors.
Comprensión de datos aprendida
Descripción general
En este cuaderno se muestra como realizar la compresión con pérdida de datos con redes neuronales y TensorFlow Compression.
La compresión con pérdida de datos implica una compensación entre la tasa, el número previsto de bits que se necesitan para codificar una muestra, y la distorsión, el error previsto en la reconstrucción de la muestra.
Los ejemplos siguientes usan un modelo de tipo autocodificador que comprime imágenes del conjunto de datos MNIST. El método se basa en el artículo Compresión optimizada de imágenes de extremo a extremo.
Puede encontrar más información sobre la compresión aprendida de datos en este artículo destinado a personas con conocimientos de la compresión de datos clásica o en este estudio para la audiencia de aprendizaje automático.
Preparación
Instale Tensorflow Compression a través de pip
.
Importe las dependencias de la biblioteca.
Definir el modelo de entrenamiento.
Ya que el modelo se parece a un autocodificador y necesitamos que realice un conjunto de funciones diferentes durante el entrenamiento e inferencia, la instalación es un poco diferente a la de un clasificador, por ejemplo.
El modelo de entrenamiento consiste en tres partes:
la transformación de análisis (o codificador), que convierte la imagen en un espacio latente,
la transformación de síntesis (o decodificador), que vuelve a convertir el espacio latente en un espacio de imagen, y
un modelo de inferencia y entrópico, que modela las probabilidades marginales de los latentes.
Primero, defina las transformaciones:
El entrenador conserva una instancia de ambas transformaciones y también los parámetros de la inferencia.
Se instala su método call
para calcular:
la tasa, un cálculo estimado de la cantidad de bits necesarios para representar un lote de cifras y
la distorsión, la diferencia media absoluta entre los píxeles de las cifras originales y sus reconstrucciones.
Calcular la tasa y la distorsión.
Vamos paso a paso, usaremos una imagen del conjunto de datos de entrenamiento. Cargue el conjunto de datos MNIST para el entrenamiento y la validación:
Y extraiga una imagen :
Para obtener la representación latente , necesitamos convertirla en float32
, agregar una dimensión del lote y pasarla por la transformación de análisis.
Los latentes serán cuantificados durante el periodo de prueba. Para modelarlo de manera diferenciable durante el entrenamiento, agregamos ruido uniforme en el intervalo y llamamos al resultado . Esta es la misma terminología que se usa en el artículo Compresión optimizada de imágenes de extremo a extremo.
La "inferencia" es la densidad de la probabilidad que entrenamos para modelar la distribución marginal de los latentes con ruido. Por ejemplo, puede ser un conjunto de distribuciones logísticas con diferentes escalas para cada dimensión latente. tfc.NoisyLogistic
explica el hecho de que las latentes tengan ruido agregado. Ya que la escala está cerca del cero, una distribución logística se encuentra cerca de la delta de Dirac (pico), pero el ruido agregado causa la distribución "ruidosa" para acercarse más a la distribución uniforme.
Durante el entrenamiento, tfc.ContinuousBatchedEntropyModel
agrega ruido uniforme y usa el ruido y la inferencia para calcular un límite superior (diferenciable) en la tasa (cantidad promedio de bits necesarios para codificar la representación latente). Ese límite puede minimizarse como una pérdida.
Por último, se pasan las latentes con ruido a través de la transformación de síntesis para producir la reconstrucción de la imagen . La distorsión es el error entre la imagen original y la reconstrucción. Obviamente, si no se entrenan las transformaciones, la reconstrucción no es muy útil.
Para cada lote de cifras, si se llama a MNISTCompressionTrainer
, este produce la tasa y la distorsión como un promedio sobre ese lote:
En la siguiente sección, instalaremos el modelo para hacer que el gradiente descienda en las dos pérdidas.
Entrenar el modelo.
Compilamos el entrenador para que optimice la tasa y la distorsión lagareanas, es decir, la suma de la tasa y la distorsión, donde uno de los términos se evalúa con el parámetro de Lagrange.
Esta función de pérdida afecta a diferentes partes del modelo de distintas formas:
La transformación de análisis se entrena para producir una representación latente que logre la compensación deseada entre la tasa y la distorsión.
La transformación de síntesis se entrena para minimizar la distorsión, según la representación latente.
Los parámetros de la inferencia se entrenan para minimizar la tasa según la representación latente. Es idéntico a encajar la inferencia en la distribución marginal de latentes en un sentido de probabilidad máxima.
Luego, entrene el modelo. Las anotaciones de personas no son necesarias aquí, ya que solo queremos comprimir las imágenes, por eso las abandonamos con map
y en su lugar agregamos destinos "de relleno" para la tasa y la distorsión.
Comprimir algunas imágenes MNIST.
Para comprimir y descomprimir durante el periodo de prueba, dividimos el modelo de entrenamiento en dos partes:
La parte del codificador que consiste en la transformación de análisis y el modelo de entropía.
La parte del decodificador que consiste en la transformación de síntesis y el mismo modelo de entropía.
En este momento, las latentes no tienen ruido agregado, pero se cuantificarán y luego se comprimirán sin pérdida así que pondremos nombres nuevos. Los llamamos y a la imagen de reconstrucción y , respectivamente (como se presenta en Comprensión optimizada de imágenes de extremo a extremo).
Cuando se crea una instancia con compression=True
, el modelo de entropía convierte la inferencia aprendida en tablas para un algoritmo de codificación de rango. Cuando se llama a compress()
, se invoca este algoritmo para convertir el vector del espacio latente en secuencias de bit. El largo de cada cadena de texto binaria se aproxima al contenido de datos de la latente (la probabilidad logarítmica negativa de la latente bajo la inferencia).
El modelo de entropía para comprimir y descomprimir debe ser la misma instancia, porque las tablas de codificación de rango tienen que ser exactamente idénticas en ambos lados. Si no es así, pueden ocurrir errores de decodificación.
Tome 16 imágenes del conjunto de datos de validación. Puede seleccionar un subconjunto diferente si cambia el argumento a skip
.
Comprímalas en cadenas de texto y lleve la cuenta de sus contenidos de datos en bits.
Descomprima las cadena de texto a imágenes.
Muestre cada una de las 16 cifras originales junto a sus representaciones binarias y la cifra reconstruida.
Preste atención a como a longitud de la cadena codificada es diferente al contenido de datos de cada cifra.
Esto se debe a que el proceso de codificación de rango funciona con probabilidades discretas y tiene una breve sobrecarga. Por lo tanto, especialmente para las cadenas de texto cortas, la correspondencia solo es aproximada. Sin embargo, la codificación de rango es óptima de forma asintótica: en el límite, el conteo esperado de bits se acercará a la entropía cruzada (el contenido de datos esperado) para el cual el término de la tasa en el modelo de entrenamiento es un límite superior.
La compensación de tasa y distorsión
Anteriormente, se entrenó el modelo para una compensación específica (dada por lmbda=2000
) entre la cantidad promedio de bits usados para representar cada cifra y el error resultante durante la reconstrucción.
¿Qué sucede si intentamos el experimento de nuevo con diferentes valores?
Empecemos por reducir a 500.
La tasa de bits de nuestro código disminuye, al igual que la fidelidad de las cifras. Sin embargo, la mayoría de las cifras siguen siendo reconocibles.
Reduzcamos un poco más.
Ahora, las cadenas de texto se van acortando, un byte por cifra. Pero esto sucede a un costo. Cada vez más cifras se vuelven irreconocibles.
Esto demuestra que este modelo es agnóstico a la capacidad humana de reconocer los errores, solo mide la desviación absoluta en términos de valores de píxeles. Para lograr una calidad de imagen mejor percibida, tendremos que reemplazar la pérdida de píxeles con la pérdida de percepción.
Usar el decodificador como modelo generativo.
Si ingresamos bits aleatorios en el decodificador, este tomará efectivamente la distribución que el modelo aprendió para representar cifras como muestra.
Primero, vuelva a crear la instancia del compresor/descompresor sin una verificación de sanidad que pueda detectar si la cadena de texto de entrada fue decodificada completamente.
Ahora, ingrese cadenas de texto aleatorias con una buena longitud en el descompresor para que pueda decodificar/tomar la muestra de las cifras.