sábado, 27 de febrero de 2021

Autoencoders y GAN´s (Redes Generativas Antagónicas)

Los Autoencoders (codificadores automáticos) son redes neuronales artificiales capaces de aprender representaciones densas de los datos de entrada, llamados representaciones latentes o codificadores (codings), sin supervisión, es decir entrenamiento no etiquetado. Estos codificadores normalmente tienen mucha menor dimensión que los datos de entrada, haciendo los codificadores útiles para la reducción dimensional, especialmente para propósitos de visualización. También funcionan como detectores de características y se pueden utilizar para preentrenar redes neuronales profundas. Finalmente algunos codificadores sirven como modelos generativos, son capaces de generar aleatoriamente nuevos datos muy similares a los datos de entrenamiento. Por ejemplo, si lo entrenamos con caras humanas, son capaces de generar nuevas aunque normalmente serán borrosas o con características que las hacen irreales.

En contraste, las caras humanas creadas por las Redes Generativas Adversarias (GAN) son bastante convincentes y es difícil cree que la gente que representan no existe. Las GAN´s son utilizadas actualmente para incrementar la resolución de una imagen, colorear imágenes en blanco y negro, hacer potentes ediciones de imágenes y convertir bocetos en fotos realistas etc.

Los codificadores y las GAN son ambos no supervisados, aprenden representaciones densas y son utilizados ambos como modelos generativos, y tienen aplicaciones muy similares sin embargo trabajan de forma muy diferente.

Autoencoders (Codificadores)

Simplemente aprenden a copiar la entrada en la salida. Esto puede sonar bastante trivial, pero veremos cómo algunas limitaciones en la red, lo convertirán en una tarea más bien difícil. Por ejemplo, podemos añadir ruido a una imagen de entrada y entrenar la red para que nos devuelva la imagen original. ,Esta limitaciones impiden que el codificador copie directamente la entrada en la salida y los fuerza a aprender vías eficientes de representación de datos.

GANs 

Están compuestas por dos redes neuronales: un generador que intenta generar datos similares a los de entrenamiento de la red y un discriminador, que trata de averiguar si la imagen recibida pertenece a los datos de entrenamiento o ha sido generada por el generador. El generador y el discriminador compiten entre sí durante el entrenamiento. El generador intenta generar imágenes nuevas pero indistinguibles de las del swet de entrenamiento, mientras que el discriminador trata de averiguar si  la imagen que procesa pertenece al set de entrenamiento o la ha generado el generador.

Autoencoders

Un autoecoder está siempre compuesto de dos partes: un codificador (o red de reconocimiento) que convierte la entrada en una representación latente, seguido de un decodificador (o red generativa) que convierte la representación interna en salidas. Un autoencoder tiene la misma arquitectura que un perceptrón multicapa (una red neuronal) excepto que el número de neuronas en la capa de salida debe ser igual al número de entradas. 

A menudo las salidas, son llamadas reconstrucciones por que el autoencoder trata de reconstruir las entradas, y la función de coste contiene una reconstrucción de pérdida que penaliza el modelo que penaliza el modelo cuando la reconstrucción difiere de la entrada.

Como la representación interna tiene una dimensionalidad inferior que los datos de entrada (por ejemplo contiene una representación en dos dimensiones 2D de un objeto de tres dimensiones 3D) el autoencoder se dice que es incompleto. Un autoencoder incompleto no puede copiar trivialmente sus entradas a los codificadores, antes debe encontrar una vía para trasladar una copia desde las entradas a las salidas, por tanto es forzado a aprender las características más importantes de los datos de entrada y eliminar las que nos son importantes.

A continuación vamos a implementar un autoencoder incompleto muy simple para reducir la dimensionalidad.

Ejecutando PCA (Principal Component Analisis) con un Autoencoder incompleto lineal

Si el autoencoder utiliza solamente activaciones lineales y la función de coste es el error cuadrático medio (MSE). Entonces termina actuando como un PCA.

Un PCA es un algoritmo que identifica el plano óptimo sobre el que representar los datos y proyecta sobre dicho plano el dataset, de modo que se produce una reducción de dimensionalidad con una pérdida mínima de información.

El siguiente código sirve para construir un Autoencoder lineal simple para ejecutar PCA desde un dataset de 3D y proyectarlo sobre un plano 2D.

Lo primero de todo es activar nuestro entorno virtual aislado y abrir un notebook de Jupyter apuntando a nuestro entorno virtual aislado. 

Entorno virtual aislado

Entorno virtual aislado


Primero, importaremos algunos módulos comunes, y nos aseguramos de que MatplotLib traza las figuras online y prepararemos una función para guardar las imágenes. También verificamos que la versión de Python sea 3.5 o posterior y esté instalado, así como Scikit-Learn ≥0.20 y TensorFlow ≥2.0.


# Se necesita una versión de Python ≥3.5

import sys

assert sys.version_info >= (3, 5)

 

# Se require una version de Scikit-Learn ≥0.20

import sklearn

assert sklearn.__version__ >= "0.20"

 

try:

    # %tensorflow_version solo existe en Colab.

    %tensorflow_version 2.x

    IS_COLAB = True

except Exception:

    IS_COLAB = False

 

# Se requiere TensorFlow ≥2.0

import tensorflow as tf

from tensorflow import keras

assert tf.__version__ >= "2.0"

 

if not tf.config.list_physical_devices('GPU'):

    print("No se ha detectado una GPU. LSTMs y CNNs pueden ser muy lentas sin una GPU")

    if IS_COLAB:

        print("Ir a Runtime > Change runtime y seleccionar GPU hardware accelerator.")

 

# Impoeraciones comunes

import numpy as np

import os

 

# para hacer este cuaderno estable

np.random.seed(42)

tf.random.set_seed(42)

 

# Para mostrar en pantalla gráficos

%matplotlib inline

import matplotlib as mpl

import matplotlib.pyplot as plt

mpl.rc('axes', labelsize=14)

mpl.rc('xtick', labelsize=12)

mpl.rc('ytick', labelsize=12)

 

# Directorio donde se guardarán las imágenes

PROJECT_ROOT_DIR = "."

CHAPTER_ID = "autoencoders"

IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, "imagenes", CHAPTER_ID)

os.makedirs(IMAGES_PATH, exist_ok=True)

 

def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):

    path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)

    print("Guardando imagen", fig_id)

    if tight_layout:

        plt.tight_layout()

    plt.savefig(path, format=fig_extension, dpi=resolution)

Implementamos un par de funciones de utilidad para trazar una imagen en escala de grises de 28x28:

def plot_image(image):

    plt.imshow(image, cmap="binary")

    plt.axis("off")

 Creamos un dataset de tres dimensiones

np.random.seed(4)

def generate_3d_data(m, w1=0.1, w2=0.3, noise=0.1):

    angles = np.random.rand(m) * 3 * np.pi / 2 - 0.5

    data = np.empty((m, 3))

    data[:, 0] = np.cos(angles) + np.sin(angles)/2 + noise * np.random.randn(m) / 2

    data[:, 1] = np.sin(angles) * 0.7 + noise * np.random.randn(m) / 2

    data[:, 2] = data[:, 0] * w1 + data[:, 1] * w2 + noise * np.random.randn(m)

    return data

X_train = generate_3d_data(60)

X_train = X_train - X_train.mean(axis=0, keepdims=0)

Y creamos el autoencoder

np.random.seed(42)

tf.random.set_seed(42)

encoder = keras.models.Sequential([keras.layers.Dense(2, input_shape=[3])])

decoder = keras.models.Sequential([keras.layers.Dense(3, input_shape=[2])])

autoencoder = keras.models.Sequential([encoder, decoder])

autoencoder.compile(loss="mse", optimizer=keras.optimizers.SGD(lr=1.5))

Este código en realidad no es muy diferente de cualquier MLP (Perceptrón multicapa) pero tiene algunas diferencias:

Hemos organizado el autoencoder en dos subcomponentes: el codificador y el decodificador. Ambos son modelos de secuencia regular cada uno con una capa densa simple y el autoencoder es un modelo secuencial que contiene el codificador seguido por el decodificador (cada modelo puede ser utilizado como una capa en otro modelo).

El número de salidas del autoencoder es igual al número de entradas, en este caso tres.

Al ejecutar un PCA simple no podemos usar ninguna función de activación, es decir, todas las neuronas tienen activación lineal, y la función de coste es el error cuadrático medio.

Vamos a entrenar el modelo con un dataset 3D simple y lo vamos a utilizar para codificar el mismo dataset y proyectarlo sobre dos dimensiones 2D. 

history = autoencoder.fit(X_train, X_train, epochs=20)

codings = encoder.predict(X_train)

fig = plt.figure(figsize=(4,3))

plt.plot(codings[:,0], codings[:, 1], "b.")

plt.xlabel("$z_1$", fontsize=18)

plt.ylabel("$z_2$", fontsize=18, rotation=0)

plt.grid(True)

save_fig("autoencoder lineal_pca")

plt.show()

El mismo dataset X_train se utiliza en las entradas y en los objetivos (la proyección de dicho dataset en un plano de 2D) que es la salida de la capa oculta del autoencoder. El autoencoder encuentra el mejor plano para proyectrar el dataset en 2D preservando la máxima varianza de los datos sobre dicho plano, justo como haría un PCA.

Podemos pensar que los autoencoders son una forma de aprendizaje autosupervisado, utilizando una técnica de aprendizaje con etiquetas generadas automáticamente.

Si vamos a la carpeta imágenes de nuestro entorno virtual aislado podemos ver que nos ha guardado la imagen del dataset de 3D proyectado sobre un plano 2D.

 

Ejecutando PCA (Principal Component Analisis) con un Autoencoder incompleto lineal

Traducido del capítulo 17 de “Hands-On Machine Learning with Scikit-Learn, Keras and Tensorflow, 2nd Edition by Aurelien Géron (O’Reilly). Copyright 2019 Kiwisoft S.A.S., 978-1-492-03264-9”




sábado, 20 de febrero de 2021

AWS in a nutshell 10: Despliegue de una Instancia EC2

10.1 Despliegue desde la GUI


Amazon EC2 (Elastic Compute Cloud)  proporciona una amplia selección de tipos de instancias optimizados para adaptarse a diferentes casos de uso. La abrimos desde la consola de AWS → EC2 → (panel lateral izquierdo ) Instances

Despliegue de una Instancia EC2



Se puede hacer también a través de comandos CLI y PowerShell tomando de la consola el número ID de la instancia deseada.

10.2 Administración de instancias de Windows EC2

Podemos administrar de forma remota instancias EC2 basadas en Windows mediante el Protocolo de escritorio remoto o RDP. Nuestra instancia puede tener una dirección IP pública, por lo que se puede conectar directamente a través de RDP, lo que podría presentar un riesgo de seguridad. O puede tener un cuadro de salto a través del cual se conecta para, en última instancia, administrar de forma remota nuestras instancias de Windows en AWS.

Administración de instancias de Windows EC2 en AWS


Lo mismo si elegimos Linux

10.3 Tamaño de la instancia EC2

El tipo de instancia EC2, también llamado a veces tamaño de instancia, determina la potencia subyacente en términos de CPU virtuales y la cantidad de RAM. Estas cosas controlan la cantidad de recursos disponibles para ejecutar una carga de trabajo dentro de una instancia EC2. Podemos configurarlo al iniciar la instancia, o una vez creada esta. Cuando configuremos nuestra instancia es importante asegurarse de esté detenida. 

Tamaño de la instancia EC2 de AWS


10.4 Scripts de lanzamiento de EC2

Cuando lanzamos una nueva instancia EC2, hay ocasiones en las que es posible que deseemos que ciertos comandos se ejecuten automáticamente cuando se inicie. Por ejemplo al instalar ciertos paquetes o aplicar ciertas actualizaciones. Para hacerlo podemos utilizar un script de lanzamiento de EC2 que podemos colocar dentro de la sección de datos del usuario cuando lanzamos una instancia de EC2. 

10.5 Reservas de instancias programadas de EC2

Por conveniencia y ahorro de costos, podemos utilizar las reservas de instancias EC2 programadas. Una reserva significa que nos estamos comprometiendo, por ejemplo, por un período de un año, pero también podemos programar instancias EC2 para que se ejecuten en determinados momentos. Diariamente o semanalmente, por ejemplo para el procesamiento por lotes de algún tipo.

Consola → EC2 → (panel lateral izquierdo ) Scheduled Instances → Purchase Scheduled Instances (botón)

10.6 AMI personalizadas

na imagen de máquina de Amazon, o AMI,  define el volumen de arranque raíz siguiendo el sistema operativo y el tipo de sistema operativo. Aunque hay muchas AMI entre las que podemos elegir, también podemos crear nuestra propia AMI personalizada.

sábado, 13 de febrero de 2021

Instalar TensorFlow en un entorno virtual de Windows (Corrige warning is not on PATH)

Hace un tiempo publiqué cómo crear un  entorno Virtual para Machine Learning e instalar TensorFlow sobre él.

Pero cuando lo intenté en otro equipo, falló la actualización de pip. Aquí reproduzco un camino alternativo por si la primera opción falla, igual que me sucedió a mi.

Siguiendo las instrucciones iniciales, para actualizar pip a la última versión tecleamos en el editor de Anaconda  

Python –m pip install –user –U pip

Pero nos devuelve un warning, si lo ignoramos y continuamos, TensorFlow no se instala correctamente.

Instalar TensorFlow en un entorno virtual de Windows

Nos devuelve un WARNING diciendo: ‘The scripts pip.exe, pip3.7.exe and pip3.exe are installed in ‘C:\Users\[mi usuario]\AppData\Roaming\Python\Python37\Scripts’ wich is not on PATH’

Para solucionar este warning tenemos que copiar en el portapapeles la dirección indicada 

"C:\Users\[mi usuario]\AppData\Roaming\Python\Python37\Scripts" 

Vamos al explorador de Windows y pulsamos sobre ‘Este equipo’ con el botón derecho del ratón, nos abre un diálogo y elegimos propiedades y configuración avanzada del sistema.

 

The scripts pip.exe, pip3.7.exe and pip3.exe are installed in ‘C:\Users\[mi usuario]\AppData\Roaming\Python\Python37\Scripts

También podemos acceder desde Panel de control -> Sistema y seguridad -> sistema

Configuración avanzada de sistema

Y pulsamos sobre el botón 'Variables de entorno'.

Se nos abre una pantalla con las variables de entorno, en la caja inferior de variables de sistema pulsamos sobre nueva y en la caja de Nombre de variable, pegamos la ruta copiada anteriormente en el portapapeles. Y en el valor de la variable ponemos punto y coma “;”aceptamos y continuamos con el proceso de instalar TensorFlow.

 

Variables de entorno del sistema

 

Variables de entorno

Actualizar pip

Creamos el Nuevo entorno virtual

                Creamos el Nuevo entorno virtual

Volvemos al entorno con cd..

Antes de traer Tensorflow actualizamos 

Instalar TensorFlow en un entorno virtual de Windows

python.exe -m pip install --upgrade pip

y finalmente instalamos TensorFlow

python -m pip install -U tensorflow

Ya podemos ejecutar un cuaderno Jupyter desde nuestro entorno virtual (tecleamos Jupyter en inicio de windows) para probar si se ha instalado correctamente, nos debe devolver la versión de TensorFlow al escribir

import tensorflow as tf

from tensorflow import keras

tf.__version__

keras.__version__

Comprobar instalación Tensorflow



 



sábado, 6 de febrero de 2021

AWS in a nutshell 9: Estrategias de desarrollo

 9.1 Framework bien diseñado WA de AWS 

Un Framework bien diseñado de AWS permite medir cargas de trabajo de software, la arquitectura de nuestras cargas de trabajo, y se encuadra en las buenas prácticas de AWS. La idea es que buscamos una mejora constante. Esto significa analizar la excelencia operativa, la optimización de costos, la confiabilidad, la eficiencia del desempeño y, por supuesto, la seguridad. Las herramientas de AWS bien diseñada, o WA, está disponible directamente en la Consola de administración de AWS para medir las cargas de trabajo de aplicaciones existentes y luego documentarlas. El primer pilar de un marco bien diseñado es la excelencia operativa.

Framework bien diseñado WA de AWS


9.2 Aplicaciones web de varios niveles

Una aplicación web de varios niveles es aquella que consta esencialmente de varias capas para cada parte principal de una aplicación. Como ejemplo, si tenemos un dispositivo cliente que se conecta a una aplicación web. Esa conexión podría establecerse con un equilibrador de carga que se encuentra entre el cliente y la aplicación. Lo que seguiría después, es que el balanceador de carga enrute las solicitudes del cliente a un servidor backend activo o receptivo que admita la interfaz de la aplicación. Eso se llamaría el nivel de presentación.

9.3 Integración e implementación continuas

Actualmente la mayoría de las organizaciones tienen algún tipo de presencia en la web, y ahí es donde la integración y entrega continuas, o CI y CD, realmente pueden ayudar, aunque no está vinculado específicamente a una presencia web o una aplicación web para el caso. En realidad, se trata de DevOps, lo que realmente significa que estamos combinando el desarrollo de soluciones de software y el lado operativo, que incluirá la implementación y el parcheo a lo largo del tiempo. Por lo tanto, combina desarrollo de software, operación de software y mantenimiento de software.

9.4 Soluciones AWS CI / CD 

Para los desarrolladores, una parte importante de los servicios web de Amazon es saber cuándo utilizar los servicios disponibles para desarrolladores, para eso están las soluciones AWS CI / CD, CI y CD, lo que significa Integración continua e Implementación continua. El principal beneficio de las soluciones CI / CD es un tiempo de comercialización más rápido, por así decirlo, para las soluciones de software, y eso siempre es importante. Tener una solución implementada más temprano que tarde siempre es beneficioso para una organización. La primera solución es AWS CodePipeline, luego tenemos AWS CodeCommit,  AWS CodeBuild. y finalmente AWS CodeDeploy. 

9.5 API de AWS 

Los desarrolladores de software estarán familiarizados con las API o interfaces de programación de aplicaciones. Las API tienen un ciclo de vida específico. El ciclo de vida de la API comienza cuando el desarrollador crea o define una API. Por ejemplo, en Amazon Web Services, un equipo en algún momento tuvo que crear la API de S3 para permitir el acceso programático al entorno de S3. La siguiente fase del ciclo de vida de la API es implementar la solución, lo que generalmente significa ponerla a disposición en un servidor.

API de AWS

9.6 Microservicios y desacoplamiento 

El microservicio no es una oferta de servicios de AWS. En cambio, es más un enfoque o estrategia de desarrollo de software. Con microservicios, estamos hablando de desarrollo de software modular. Entonces, en lugar de crear una aplicación gigante, los equipos de desarrollo pueden trabajar juntos para crear funciones específicas de tareas o API, o incluso contenedores aislados que contienen componentes de software específicos. Con un entorno de microservicio, cada módulo o microservicio puede comunicarse con otros a través de la red. También podemos habilitar el acoplamiento suelto. Así es realmente cómo se construye el código.

9.7 Servicio de notificación simple 

El servicio de notificación simple, o SNS, en Amazon Web Services proporciona una forma de publicar notificaciones o mensajes. También proporciona una forma para que otros recursos se suscriban a los mensajes que se publican. La forma en que esto funciona con SNS es que permite el desacoplamiento de software, esto significa que se permite el uso de microservicios para suscribirse a mensajes que podrían ser publicados por otros componentes de software. La parte de desacoplamiento significa que los componentes de software, no tienen que estar disponibles en la red al mismo tiempo y no tienen que estar ejecutándose al mismo tiempo necesariamente para intercambiar esos mensajes.

Para acceder a ellos desde la Consola de AWS escribimos 

SNS → Escribimos nombre de topic y botón Next

Servicio de notificación simple AWS

9.8 Servicio de cola simple  

En Amazon Web Services, Simple Queue Service, o SQS, se utiliza como mecanismo para microservicios. Ahora no tiene por qué ser así, pero los microservicios se benefician de esto cuando el censo de los microservicios que son software modular o componentes de código, podemos pensar en ellos como fragmentos de código enfocados, que juntos muchos microservicios pueden formar una sola aplicación.

Consola → SQS -> get started now 

Servicio de cola simple AWS