class: center, middle, inverse, title-slide # Reconocimiento de patrones digitales ### JPAG ### Modelación Predictiva ### 2021/05/06 --- # MNIST El conjunto de datos MNIST (*Modified National Institute of Standards and Technology*) usa un modelo de aprendizaje automático para clasificar correctamente dígitos escritos a mano del `\(0\)` al `\(9\)` dadas imágenes en blanco y negro de `\(28 \times 28\)` pixeles. El conjunto de datos contiene `\(60000\)` ejemplos de entrenamiento y un conjunto de prueba con `\(10000\)` ejemplos. MNIST es el conjunto por de facto de la visión por computadora. Este conjunto ha servido como base de la evaluación comparativa en algoritmos de clasificación. `DeepChem` usa la clase `TensorGraph` para construir la arquitectura convolucional para MNIST con dos capas convolucionales para identificar características locales dentro de la imagen siguidas por dos capas completamente conectadas para predecir el dígito a partir de esas características locales. Los comandos de descarga de los datos son ```bash mkdir MNIST_data cd MNIST_data wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz cd .. ``` --- # Modelación Las importaciones necesarias para entrenar el modelo son ```python import deepchem as dc import tensorflow as tf import tensorflow.keras.layers as layers ``` Se cargan los datos y se codifica de tal manera que cada etiqueta de MNIST de longitud `\(10\)` se le asigna a un solo elemento un `\(1\)` y a todos los demás un `\(0\)`. Si el valor distinto de cero está en el índice `\(0\)`, entonces la etiqueta corresponde al dígito `\(0\)`. Si el valor distinto de cero está en el noveno índice, luego la etiqueta corresponde al dígito `\(9\)` (*one-hot*). ```python (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() y_train = tf.one_hot(y_train, 10).numpy() y_test = tf.one_hot(y_test, 10).numpy() train_dataset = dc.data.NumpyDataset(x_train, y_train) test_dataset = dc.data.NumpyDataset(x_test, y_test) ``` --- # El submódulo `tensorflow.keras.layers` contiene una colección de capas que sirven como bloques para ir construyendo arquitecturas profundas. Los objetos `NumpyDataset` envuelven a los conjuntos de datos de prueba y entrenamiento. Conviertuiéndo los vectores de características planas en matrices de `\(28\times 28\)`. ```python features = tf.keras.Input(shape=(28, 28, 1)) ``` Ahora con esta featurización, podemos pasarla a las capas convolucionales: ```python conv2d_1 = layers.Conv2D(filters=32, kernel_size=5, activation=tf.nn.relu)(features) conv2d_2 = layers.Conv2D(filters=64, kernel_size=5, activation=tf.nn.relu)(conv2d_1) flatten = layers.Flatten()(conv2d_2) dense1 = layers.Dense(units=1024, activation=tf.nn.relu)(flatten) dense2 = layers.Dense(units=10, activation=None)(dense1) output = layers.Activation(tf.math.softmax)(dense2) keras_model = tf.keras.Model(inputs=features, outputs=[output, dense2]) model = dc.models.KerasModel( keras_model, loss=dc.models.losses.SoftmaxCrossEntropy(), output_types=['prediction', 'loss'], model_dir='mnist') ``` --- # `Conv2D` aplica una convolución en 2D a cada muestra de la entrada luego la pasa a través de una función ReLU. Se van pasando las capas anteriores como entradas a las capas siguientes y se aplana a una dimensión con una capa `Flatten`. El argumento `units` en `Dense` especifica el ancho de la capa. La primera capa genera `\(1024\)` valores por muestra y la segunda capa genera `\(10\)` valores correspondientes a los dígitos del *one-hot*. Con esto se define un nuevo objeto `KerasModel`. La opción `model_dir` especifica un directorio donde se deben guardar los parámetros del modelo. `KerasModel` se hereda de `Model`, por lo que el objeto `model` es una instancia de `dc.models.Model` y admite las funciones `fit()` y `evaluate()`. ```python model.fit(train_dataset, nb_epoch=10) metric = dc.metrics.Metric(dc.metrics.accuracy_score) train_scores = model.evaluate(train_dataset, [metric]) test_scores = model.evaluate(test_dataset, [metric]) print(train_scores) print(test_scores) ``` `## {'accuracy_score': 0.9992833333333333}` <br> `## {'accuracy_score': 0.9950800000000001}` La precisión es `\(0.999\)` en el entrenamiento y `\(0.995\)` en la prueba, i.e., se identifica más del `\(99\%\)` de las muestras del conjunto de prueba. --- class: inverse, center, middle # Revisión de terminología --- Se ha destacado la aplicación del aprendizaje automático para la modelación y simulación molecular para descubrir y diseñar sistemas con perfiles personalizados, revelar intrincadas relaciones estructura-propiedad (SPR) y explorar la inmensidad del espacio químico. El aprendizaje automático se clasifica por la cantidad de información que está disponible para la variable objetivo en aprendizaje supervisado, semi-supervisado, por refuerzo y no supervisado, este último con una formulación heurística similar a la comprensión de las relaciones estructura-proteína. Se puede pensar en un modelo de predicción supervisada como una función `\(f: X → Y\)` que mapea una una estructura química `\(x\)` a su propiedad objetivo `\(y\)`. Los algoritmos que se han utilizado ampliamente para entrenar y optimizar el modelo `\(f\)` han sido las *redes neuronales artificiales* (ANN) ya que transforman la entrada `\(x\)` en un nuevo espacio de características (variable latente) inicialmente correlacionado con la salida `\(y\)`. Las principales ventajas de las ANN es su capacidad para transformar características secuencialmente a través de varias capas, o aprendizaje profundo. --- # A diferencia de las ANN, los *métodos de kernel* son procesos predefinidos antes del ajuste de los parámetros del modelo y, por lo tanto, es menos flexible para aprender el mejor espacio de variables latentes, pero que ofrecen rendimiento superior en la búsqueda de soluciones globales, incluso para conjuntos de datos de tamaño pequeño donde las ANN tienen déficits. Las máquinas de soporte vectorial y la regresión kernel de Ridge son dos ejemplos comunes. La ecuación de Schrödinger ofrece un mapeo determinista entre una estructura molecular y sus propiedades, base para las técnicas tradicionales de modelación y simulación. En el teorema de aproximación universal para ANN se expresa la flexibilidad para aprender y recuperar las SPR subyacentes de un problema a partir de representaciones químicas simples, sin pérdidas significativa de información. La representación de características como una función `\(g: M → X\)` que mapea una representación química básica `\(m ∈ M\)` a una entrada de característica `\(x\)` *descriptora*. `\(m\)` puede contener información molecular espacial o topológica y se expresa, por ejemplo, en coordenadas atómicas SMILES (*simplified molecular-input line-entry system*) u otros formatos. También hay representaciones físicas o químicas como descriptores, de modo que `\(g\)` corresponde a una simulación o algún otro cálculo. --- # El costo computacional de obtener descriptores limitará su utilidad como un sustituto eficiente para la predicción de `\(y\)`. Otra clase de descriptores considera una molécula como un gráfica átomo(nodo)-enlace(borde). Cada átomo interactúa en su vecindad inmediata, lo que actualiza las características atómicas locales correspondientes. Las gráficas dinámicas irregulares proporciona la base de las redes neuronales convolucionales de gráficas. La generación de características `\(g\)` también se puede fusionar en el modelo de predicción `\(f\)` y optimizar conjuntamente a través de capas ocultas. Esta clase de descriptores se denomina *características aprendidas*. Así, el flujo de trabajo general preprocesa un conjunto de datos `\(\{M, Y\}\)`, compilando una serie de descriptores a través de `\(g\)`, y entrena, evalúa y valida el modelo de predicción `\(f\)`. Las áreas computacionales de las ciencias de materiales se explotan de manera eficiente mediante el intercambio de datos considerando todos los aspectos de lo que ahora se llama FAIR. --- # Los datos se pueden encontrar para cualquier persona interesada (**F**indable); se almacenan de manera que sean fácilmente accesibles (**A**ccessible); su representación sigue los estándares aceptados y todas las especificaciones son abiertas (**I**nteroperable). Todo esto permite que los datos puedan ser utilizados para finalidades a las que fueron creados; por lo tanto son reutilizables (**R**e-purposable). La ciencia de materiales basada en datos se está convirtiendo en el cuarto paradigma de investigación. Se han realizado investigaciones experimentales desde las edades de piedra y cobre, y a partir del S. XVI se comienzan a describir las relaciones físicas mediante ecuaciones. La década de `\(1950\)` marcó el comienzo de la modelación computacionales y las simulaciones El reconocimiento de que muchas propiedades de los materiales no pueden describirse mediante una forma matemática cerrada, ya que están determinadas por varios conceptos teóricos intrincados de varios niveles, establece el cuarto paradigma. El desafío es encontrar los descriptores adecuados detrás de las propiedades y funciones de los materiales.