Deep Learning con TensorFlow y Keras
Esta formación está diseñada para presentar y profundizar en las herramientas TensorFlow y Keras, introduciendo el área del...
¿Te gustaría aprender a construir modelos de aprendizaje automático con las herramientas más avanzadas? TensorFlow y Keras son fundamentales para ello. Si quieres introducirte en ambas bibliotecas, en este artículo te explicamos sus fundamentos y te mostramos ejemplos prácticos para que puedas empezar a desarrollar tus propios modelos de IA hoy mismo.
Tabla de contenidos
¿Alguna vez te has preguntado qué librerías se utilizan para crear redes neuronales?
¿Cuántas veces has querido programar tu propia red neuronal y no has sabido por dónde empezar?
¿Quieres conocer en mayor profundidad las librerías de inteligencia artificial de Python?
TensorFlow y Keras son las dos librerías de aprendizaje automático más utilizadas a nivel industrial. Estas librerías nos permiten diseñar, entrenar y evaluar de forma sencilla redes neuronales.
En este artículo vamos a responder estas y muchas más preguntas a la vez que te guiamos paso a paso sobre tres ejemplos prácticos diferentes.
El aprendizaje automático, especialmente el Deep Learning, es actualmente la técnica de inteligencia artificial más utilizada.
A través de modelos de aprendizaje automático llevamos a cabo tareas de procesamiento del lenguaje natural (NLP), Visión por Computador (CV). Estos modelos aprenden a realizar diversas tareas a partir de datos, de manera que nos permite reutilizar datos del pasado para automatizar tareas y mejorar el rendimiento de sistemas inteligentes.
Nuestra ruta de especialista en inteligencia artificial te permitirá conocer en mayor detalle todas las tareas abordables mediante aprendizaje automático.
TensorFlow y Keras son dos de las bibliotecas más populares para diseñar, entrenar y evaluar modelos de aprendizaje automático, especialmente en el campo del Deep Learning.
Estas bibliotecas nos permiten diseñar, entrenar y evaluar de forma sencilla redes neuronales, lo que ha llevado a una gran adopción en una variedad de industrias.
TensorFlow es una biblioteca open source desarrollada por Google Brain para llevar a cabo tareas de Machine Learning y Deep Learning.
Es una de las librerías de aprendizaje automático más utilizadas a nivel industrial debido a su flexibilidad y escalabilidad.
Las tres características principales de TensorFlow son:
TensorFlow se basa en cuatro tareas para llevar a cabo tareas de aprendizaje automático. Estas tareas son fundamentales para construir modelos de aprendizaje automático precisos y escalables.
TensorFlow tiene su funcionalidades gracias al uso de diferentes componentes. Algunos de los componentes clave de TensorFlow incluyen:
TensorFlow proporciona acceso a varios conjuntos de datos (datasets) populares para el entrenamiento y evaluación de modelos de aprendizaje automático. Algunos de los datasets más conocidos son:
TensorFlow ofrece más de 35 APIs y librerías que permiten a los desarrolladores crear y entrenar modelos de aprendizaje automático de manera eficiente.
Algunas de las librerías y APIs más destacadas incluyen:
Keras es una biblioteca de código abierto para el aprendizaje automático y el deep learning. Fue desarrollada por François Chollet y actualmente es mantenida por Google.
Se caracteriza por ser una biblioteca de alto nivel, fácil de usar y flexible, que permite a los desarrolladores crear y entrenar modelos de aprendizaje automático de manera rápida y eficiente.
Keras tiene varias características que lo hacen ideal para la construcción de modelos de aprendizaje automático. Algunas de las características más destacadas de Keras incluyen:
Keras se basa en un concepto llamado “modelo”, que es un conjunto de capas que se utilizan para construir modelos de aprendizaje automático.
Los modelos en Keras se pueden construir utilizando una variedad de capas, algunas de las capas más comunes las veremos más adelante.
Keras utiliza la misma estructura de componentes que TensorFlow y la amplía. Algunos de los componentes más importantes de Keras incluyen:
Keras incluye dos tipos de modelos según las necesidades del desarrollador:
TensorFlow y Keras incluyen una variedad de capas que se pueden utilizar para construir modelos de aprendizaje automático. Algunas de las capas más utilizadas son:
En nuestro curso de aprendizaje automático y PLN podrás conocer en mayor medida en funcionamiento de estas capas.
TensorFlow y Keras se pueden utilizar juntos para construir modelos de aprendizaje automático de alta complejidad.
La integración de TensorFlow y Keras permite a los desarrolladores aprovechar las ventajas de ambas bibliotecas.
La compatibilidad y sinergia entre TensorFlow y Keras permiten a los desarrolladores construir modelos de aprendizaje automático de alta complejidad.
La integración de TensorFlow y Keras permite a los desarrolladores aprovechar las ventajas de ambas bibliotecas, lo que les permite construir modelos de aprendizaje automático más precisos y eficientes.
A continuación, veremos tres ejemplos prácticos en los que combinamos TensorFlow y Keras para llevar a cabo algunas tareas clásicas de Inteligencia Artificial.
En los tres ejemplos que presentamos a continuación vamos a dividir el proceso de crear y entrenar una red neuronal mediante Keras y TensorFlow en cuatro fases:
En primer lugar vamos a utilizar el conjunto de datos MNIST para clasificar imágenes de dígitos escritos a mano. Nuestro objetivo es entrenar un modelo que pueda detectar el número que aparece en cada imagen.
El primer paso es importar las librerías que utilizaremos.
import numpy as np
import keras
from keras import layers
A continuación, normalizamos los datos. Concretamente se reescalamos los grises a una escala con 255 valores.
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)
print("x_train shape:", x_train.shape)
print(x_train.shape[0], "train samples")
print(x_test.shape[0], "test samples")
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
Después crearemos el modelo que utilizaremos para clasificar el dígito de la imagen. Concretamente utilizaremos un modelo secuencial.
num_classes = 10
input_shape = (28, 28, 1)
model = keras.Sequential(
[
keras.Input(shape=input_shape),
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dropout(0.5),
layers.Dense(num_classes, activation="softmax"),
]
)
model.summary()
Finalmente entrenaremos el modelo y lo evaluaremos.
batch_size = 128
epochs = 15
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)
score = model.evaluate(x_test, y_test, verbose=0)
print("Test loss:", score[0])
print("Test accuracy:", score[1])
La segunda tarea a realizar pertenece al campo de NLP. Concretamente utilizaremos el conjunto de datos imdb para clasificar reseñas como positivas o negativas.
import numpy as np
import keras
from keras import layers
Al igual que en la tarea anterior importaremos las librerías anteriores y cargaremos los datos. En esta ocasión la única transformación que llevaremos a cabo es convertir los textos en secuencias. Esto es necesario ya que utilizaremos capas LSTM.
max_features = 20000
maxlen = 200
(x_train, y_train), (x_val_test, y_val_test) = keras.datasets.imdb.load_data(
num_words=max_features
)
x_val = x_val_test[:int (len(x_val_test)/2)]
y_val = y_val_test[:int (len(y_val_test)/2)]
x_test = x_val_test[int (len(x_val_test)/2):]
y_test = y_val_test[int (len(y_val_test)/2):]
print(len(x_train), "Training sequences")
print(len(x_val), "Validation sequences")
print(len(x_val), "Test sequences")
x_train = keras.utils.pad_sequences(x_train, maxlen=maxlen)
x_val = keras.utils.pad_sequences(x_val, maxlen=maxlen)
x_test = keras.utils.pad_sequences(x_test, maxlen=maxlen)
Una vez tenemos los datos en el formato correcto creamos el modelo.
inputs = keras.Input(shape=(None,), dtype="int32")
x = layers.Embedding(max_features, 128)(inputs)
x = layers.Bidirectional(layers.LSTM(64, return_sequences=True))(x)
x = layers.Bidirectional(layers.LSTM(64))(x)
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.summary()
Y finalmente entrenamos y evaluamos el modelo.
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
model.fit(x_train, y_train, batch_size=32, epochs=2, validation_data=(x_val, y_val))
score = model.evaluate(x_test, y_test, verbose=0)
print("Test loss:", score[0])
print("Test accuracy:", score[1])
Si quieres seguir conociendo más tareas de NLP en profundidad te recomendamos nuestro curso de introducción al PLN .
La última tarea que vamos a analizar es la creación de un sistema de recomendaciones.
Este ejemplo es más complejo que los vistos previamente. Por este motivo realizaremos un preprocesado de los datos más exhaustivo y utilizaremos un modelo funcional.
import pandas as pd
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
from zipfile import ZipFile
import keras
from keras import layers
from keras import ops
Al igual que en los ejemplos anteriores el primer paso es importar las librerías que utilizaremos. Una vez hecho esto procederemos a descargar el conjunto de datos y preprocesarlos.
movielens_data_file_url = (
"http://files.grouplens.org/datasets/movielens/ml-latest-small.zip"
)
movielens_zipped_file = keras.utils.get_file(
"ml-latest-small.zip", movielens_data_file_url, extract=False
)
keras_datasets_path = Path(movielens_zipped_file).parents[0]
movielens_dir = keras_datasets_path / "ml-latest-small"
if not movielens_dir.exists():
with ZipFile(movielens_zipped_file, "r") as zip:
print("Extracting all the files now...")
zip.extractall(path=keras_datasets_path)
print("Done!")
ratings_file = movielens_dir / "ratings.csv"
df = pd.read_csv(ratings_file)
user_ids = df["userId"].unique().tolist()
user2user_encoded = {x: i for i, x in enumerate(user_ids)}
userencoded2user = {i: x for i, x in enumerate(user_ids)}
movie_ids = df["movieId"].unique().tolist()
movie2movie_encoded = {x: i for i, x in enumerate(movie_ids)}
movie_encoded2movie = {i: x for i, x in enumerate(movie_ids)}
df["user"] = df["userId"].map(user2user_encoded)
df["movie"] = df["movieId"].map(movie2movie_encoded)
num_users = len(user2user_encoded)
num_movies = len(movie_encoded2movie)
df["rating"] = df["rating"].values.astype(np.float32)
min_rating = min(df["rating"])
max_rating = max(df["rating"])
print(
"Number of users: {}, Number of Movies: {}, Min rating: {}, Max rating: {}".format(
num_users, num_movies, min_rating, max_rating
)
)
df = df.sample(frac=1, random_state=42)
x = df[["user", "movie"]].values
y = df["rating"].apply(lambda x: (x - min_rating) / (max_rating - min_rating)).values
train_indices = int(0.9 * df.shape[0])
x_train, x_val, y_train, y_val = (
x[:train_indices],
x[train_indices:],
y[:train_indices],
y[train_indices:],
)
En el preprocesamiento realizado nos hemos quedado como datos los usuarios y las películas que ha calificado cada usuario. Como etiqueta hemos almacenado el valor de la reseña normalizado.
A partir de estos datos hemos creado un modelo llamado “RecommenderNet” que calcula la recomendación para un usuario.
EMBEDDING_SIZE = 50
class RecommenderNet(keras.Model):
def __init__(self, num_users, num_movies, embedding_size, **kwargs):
super().__init__(**kwargs)
self.num_users = num_users
self.num_movies = num_movies
self.embedding_size = embedding_size
self.user_embedding = layers.Embedding(
num_users,
embedding_size,
embeddings_initializer="he_normal",
embeddings_regularizer=keras.regularizers.l2(1e-6),
)
self.user_bias = layers.Embedding(num_users, 1)
self.movie_embedding = layers.Embedding(
num_movies,
embedding_size,
embeddings_initializer="he_normal",
embeddings_regularizer=keras.regularizers.l2(1e-6),
)
self.movie_bias = layers.Embedding(num_movies, 1)
def call(self, inputs):
user_vector = self.user_embedding(inputs[:, 0])
user_bias = self.user_bias(inputs[:, 0])
movie_vector = self.movie_embedding(inputs[:, 1])
movie_bias = self.movie_bias(inputs[:, 1])
dot_user_movie = ops.tensordot(user_vector, movie_vector, 2)
# Add all the components (including bias)
x = dot_user_movie + user_bias + movie_bias
# The sigmoid activation forces the rating to between 0 and 1
return ops.nn.sigmoid(x)
Una vez creado el modelo hemos procedido a entrenarlo y a calcular las 10 películas recomendadas para un usuario.
model = RecommenderNet(num_users, num_movies, EMBEDDING_SIZE)
model.compile(
loss=keras.losses.BinaryCrossentropy(),
optimizer=keras.optimizers.Adam(learning_rate=0.001),
)
history = model.fit(
x=x_train,
y=y_train,
batch_size=64,
epochs=5,
verbose=1,
validation_data=(x_val, y_val),
)
movie_df = pd.read_csv(movielens_dir / "movies.csv")
user_id = df.userId.sample(1).iloc[0]
movies_watched_by_user = df[df.userId == user_id]
movies_not_watched = movie_df[
~movie_df["movieId"].isin(movies_watched_by_user.movieId.values)
]["movieId"]
movies_not_watched = list(
set(movies_not_watched).intersection(set(movie2movie_encoded.keys()))
)
movies_not_watched = [[movie2movie_encoded.get(x)] for x in movies_not_watched]
user_encoder = user2user_encoded.get(user_id)
user_movie_array = np.hstack(
([[user_encoder]] * len(movies_not_watched), movies_not_watched)
)
ratings = model.predict(user_movie_array).flatten()
top_ratings_indices = ratings.argsort()[-10:][::-1]
recommended_movie_ids = [
movie_encoded2movie.get(movies_not_watched[x][0]) for x in top_ratings_indices
]
print("Showing recommendations for user: {}".format(user_id))
print("====" * 9)
print("Movies with high ratings from user")
print("----" * 8)
top_movies_user = (
movies_watched_by_user.sort_values(by="rating", ascending=False)
.head(5)
.movieId.values
)
movie_df_rows = movie_df[movie_df["movieId"].isin(top_movies_user)]
for row in movie_df_rows.itertuples():
print(row.title, ":", row.genres)
print("----" * 8)
print("Top 10 movie recommendations")
print("----" * 8)
recommended_movies = movie_df[movie_df["movieId"].isin(recommended_movie_ids)]
for row in recommended_movies.itertuples():
print(row.title, ":", row.genres)
TensorFlow y Keras no solo se utilizan en la industria de la tecnología, sino que también tienen aplicaciones en otras industrias, como:
Entre los múltiples beneficios de emplear TensorFlow y Keras queremos destacar tres.
Flexibilidad y escalabilidad: TensorFlow y Keras ofrecen una gran flexibilidad y escalabilidad, lo que permite a los desarrolladores construir modelos de aprendizaje automático de alta complejidad y escalarlos según sea necesario.
Eficiencia en el desarrollo de modelos: TensorFlow y Keras ofrecen una gran eficiencia en el desarrollo de modelos, permitiendo construir modelos de aprendizaje automático más rápidamente y con menos esfuerzo.
Soporte y comunidad activa: TensorFlow y Keras tienen una comunidad activa y un soporte oficial de Google. Una de las consecuencias de este beneficio es que la calidad de la documentación de Keras y TensorFlow es excelsa.
TensorFlow y Keras son dos de las bibliotecas más populares y poderosas para el aprendizaje automático. Ofrecen una gran flexibilidad y escalabilidad, eficiencia en el desarrollo de modelos y soporte y comunidad activa. Estas bibliotecas tienen aplicaciones en una variedad de industrias y son fundamentales para el desarrollo de modelos de aprendizaje automático de alta complejidad.
Con su continua actualización y soporte, es probable que sigan siendo líderes en el campo del aprendizaje automático durante mucho tiempo.
¿Quieres comenzar a crear redes neuronales? ¡Usa TensorFlow y Keras!
También te puede interesar
Esta formación está diseñada para presentar y profundizar en las herramientas TensorFlow y Keras, introduciendo el área del...
Introdúcete con este curso en el mundo del “Data Scientist”. Está orientado tanto a personas que nunca han...