Path: blob/master/site/es-419/quantum/tutorials/mnist.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Clasificación MNIST
En este tutorial creamos una red neuronal cuántica (QNN) para clasificar una versión simplificada de MNIST, similar al método utilizado en Farhi et al. Se compara el desempeño de una red neuronal cuántica con el de una clásica frente a un problema de datos clásico.
Preparación
Instalar TensorFlow Quantum:
Ahora, hay que importar TensorFlow y las dependencias del módulo:
1. Carga de los datos
En este tutorial crearemos un clasificador binario para distinguir entre los dígitos 3 y 6, siguiendo lo expuesto por Farhi et al.. En esta sección se tratan los temas de manipulación de datos que incluye lo siguiente:
Cargar los datos sin procesar desde Keras.
Filtrar el conjunto de datos a solamente los 3 y los 6.
Reducir la escala de las imágenes para que quepan en una computadora cuántica.
Quitar cualquier ejemplo contradictorio.
Convertir las imágenes binarias a circuitos Cirq.
Convertir los circuitos Cirq a circuitos de TensorFlow Quantum.
1.1 Carga de los datos sin procesar
Cargamos el conjunto de datos MNIST distribuido con Keras.
Filtramos el conjunto de datos para conservar solamente los 3 y los 6, y eliminar las otras clases. Al mismo tiempo, convertimos la etiqueta y
al booleano: True
para 3
and False
para 6.
Mostramos el primer ejemplo:
1.2 Reducción de las imágenes a escala
El tamaño de una imagen de 28×28 es demasiado grande para las computadores cuánticas actuales. Hay que cambiarles el tamaño a 4×4:
Nuevamente, mostramos el primer ejemplo de entrenamiento; después del cambio de tamaño:
1.3 Eliminación de los ejemplos contradictorios
De la sección 3.3 Learning to Distinguish Digits (Cómo aprender a distinguir dígitos) de Farhi et al., filtre el conjunto de datos para quitar las imágenes etiquetadas como pertenecientes a ambas clases.
No es un procedimiento de aprendizaje automático estándar, pero se incluye a fin de seguir lo expuesto en la publicación.
Los resultados de los conteos no coinciden con los valores informados, pero no se ha especificado un procedimiento exacto.
Tampoco importa, en este caso, que la aplicación de filtros a ejemplos contradictorios en este punto no evite por completo que el modelo reciba ejemplos contradictorios de entrenamiento: en el paso siguiente se binarizan los datos que causarán más colisiones.
1.4 Codificación de los datos como circuitos cuánticos
Para procesar las imágenes con una computadora cuántica, Farhi et al. propusieron representar cada pixel con un bit cuántico, con el estado pendiente con respecto al valor del pixel. El primer paso es convertir la codificación binaria.
Si quitáramos las imágenes contradictorias en este punto, solamente quedarían 193 y, probablemente, no serían suficientes para hacer un entrenamiento efectivo.
Los bits cuánticos de los índices del pixel con valores que exceden el límite se rotan a través de una puerta .
El siguiente es el circuito creado para el primer ejemplo (en los diagramas del circuito no se muestran los bits cuánticos con puertas en cero):
Comparamos este circuito con los índices en los que el valor de la imagen excede al límite:
Convertimos estos circuitos Cirq
a tensores para tfq
:
2. Red neuronal cuántica
Hay poca información relacionada con la estructura de los circuitos cuánticos que clasifican imágenes. Dado que la clasificación se basa en la esperanza del bit cuántico que se lee, Farhi et al. proponen utilizar dos puertas de bit cuántico con el cúbit leído sobre el que siempre nos basamos. Es parecido, en cierto modo, a ejecutar en una pequeña proporción una red neuronal recurrente unitaria a través de los pixeles.
2.1 Creación del circuito modelo
En el siguiente ejemplo se muestra esta aproximación por capas. Cada capa usa n instancias de la misma puerta, con cada uno de los bits cuánticos de datos que actúan sobre le bit cuántico leído.
Empezamos con una clase simple que agregará una capa de estas puertas a un circuito:
Creamos una capa del circuito de ejemplo para ver cómo queda:
Ahora, construimos un modelo con dos capas, que coincida con el tamaño del circuito y los datos, e incluimos las operaciones de preparación y lectura.
2.2 Encapsulamiento de un circuito modelo en un modelo tfq-keras
Creamos el modelo Keras con componentes cuánticos. Este modelo se alimenta con "datos cuánticos", de x_train_circ
, que codifican los datos clásicos. Usa una capa del circuito cuántico parametrizado, tfq.layers.PQC
, para entrenar el circuito del modelo sobre los datos cuánticos.
Para clasificar estas imágenes, Farhi et al. propuso tomar la esperanza de un bit cuántico de lectura en un circuito parametrizado. La esperanza devuelve un valor entre 1 y -1.
A continuación, describimos el procedimiento de entrenamiento para el modelo, con el método compile
.
Como la lectura esperada se encuentra en el rango de [-1,1]
, la optimización de la pérdida de articulación es, en cierto modo, natural.
Nota: Otra opción válida sería cambiar el rango de salida a [0,1]
y tratarlo como la probabilidad que le asigna el modelo a la clase 3
. Se podría usar con un estándar, una pérdida tf.losses.BinaryCrossentropy
.
Para usar la pérdida de articulación es necesario hacer dos ajustes pequeños. Primero debemos convertir las etiquetas y_train_nocon
, de booleanas a [-1,1]
, tal como se espera para la pérdida de articulación.
En segundo lugar, usaremos una métrica de hinge_accuracy
personalizada que administra correctamente [-1, 1]
como el argumento de las etiquetas y_true
. tf.losses.BinaryAccuracy(threshold=0.0)
espera que y_true
sea booleano y, por lo tanto, no se puede usar con la pérdida de articulación.
Entrenamiento del modelo cuántico
Ahora, entrenemos el modelo. Tomará alrededor de 45 minutos. Si no queremos esperar tanto tiempo, podemos usar un subconjunto pequeño de datos (establecer NUM_EXAMPLES=500
, como a continuación). Realmente no afectará al progreso del modelo durante el entrenamiento (solamente tiene 32 parámetros y no necesita muchos datos que los restrinjan). Con menos ejemplos, simplemente, termina antes (en 5 minutos), pero se ejecuta el tiempo suficiente como para mostrar que se producen avances con los registros de validación.
El entrenamiento de este modelo para la convergencia debería alcanzar >85% de precisión en el conjunto de la prueba.
Nota: La exactitud del entrenamiento presenta el promedio sobre la época. La exactitud de la validación se evalúa al final de cada época.
3. Red neuronal clásica
Mientras que la red neuronal cuántica funciona bien con este problema de MNIST simplificado, una red neuronal clásica, fácilmente, puede tener un mejor desempeño que una QNN en esta tarea. Después de una sola época, la red neuronal clásica puede lograr >98% de exactitud con el conjunto retenido.
En el siguiente ejemplo, se usa una red neuronal clásica para el problema de clasificación de 3-6 con una imagen entera de 28×28, en vez de utilizar una submuestra de la imagen. Fácilmente converge en aproximadamente un 100% de exactitud del conjunto de prueba.
Este modelo anterior tiene aproximadamente 1 200 000 parámetros. Para que la comparación resulte más justa, probemos con un modelo de 37 parámetros, con las submuestras de las imágenes:
4. Comparación
Mientras más alta sea la entrada de la resolución y más potente sea el modelo, el problema se hará más sencillo para la CNN. Mientras que un modelo clásico de potencia similar (con ~32 parámetros) entrena hasta lograr una exactitud similar en una fracción de tiempo. De un modo u otro, la red neuronal clásica tiene un mejor desempeño que la red neuronal cuántica. Para los datos clásicos, es difícil ganarle a una red neuronal clásica.