Skip to content

Autoencoders en Keras#

Teoría Autoencoders

Ejemplo de Autoencoders con Keras#

Preparación de datos#

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.datasets import make_blobs

# Esta nueva funcion sirve para crear datasets rápidamente.
## Centers = número de clusters.
## random_state = semilla para reproducibilidad.
data = make_blobs(n_samples=1000, n_features=2, centers=2, cluster_std=0.60, random_state=101)

X,y = data
# X = datos (valores de n_features)
# y = etiquetas (valores de centers/clusters), 0 o 1 en este ejemplo.

# Generamos nueva serie de valores que representan ruido
np.random.seed(seed=101)
z_noise = np.random.normal(size=len(X))
z_noise = pd.Series(z_noise)

# Añadimos el ruido a los datos en una nueva columna
feat = pd.DataFrame(X)
feat = pd.concat([feat, z_noise], axis=1)
feat.columns = ['X1', 'X2', 'X3']

plt.scatter(feat['X1'], feat['X2'], c=y)
plt.show()
# Aquí veremos que los datos están bien separados.

from mpl_toolkits.mplot3d import Axes3D

# Para crear una gráfica interactiva en notebook
# %matplotlib notebook

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(feat['X1'], feat['X2'], feat['X3'], c=y)
plt.show()
# Aquí veremos que los datos no están bien separados en el nuevo eje X3.

Crear el modelo#

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import SGD

# Vamos a crear un autoencoder 3 -> 2 -> 3

# Creamos el encoder
encoder = Sequential()
encoder.add(Dense(units=2, input_shape=[3], activation='relu'))

# Creamos el decoder
decoder = Sequential()
decoder.add(Dense(units=3, input_shape=[2], activation='relu'))

# Creamos el autoencoder uniendo encoder y decoder
autoencoder = Sequential([encoder, decoder])

# lr = learning_rate
autoencoder.compile(optimizer=SGD(lr=1.5), loss='mse')

Escalar los datos#

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(feat)

Predecir datos#

autoencoder.fit(scaled_data, scaled_data, epochs=5)

encoded_2dim = encoder.predict(scaled_data)

encoded_2dim.shape # (300, 2)
scaled_data.shape # (300, 3)

# Ver datos codificados
plt.scatter(encoded_2dim[:,0], encoded_2dim[:,1], c=y)
plt.show()
# Aquí veremos que los datos están bien separados.