Ejemplo de una neurona en Deep Learning

| Última modificación: 9 de julio de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Si tenemos en cuenta que normalmente cualquier problema que se os ocurra puede ser descompuesto y modelado en forma de funciones matemáticas, considerar un ejemplo de una neurona en Deep Learning es de suma importancia. Esto se debe a que, de acuerdo con este teorema, una red neuronal en Deep Learning debería ser capaz de resolver cualquier problema. A partir de ello, se convierte en algo esencial realizar una práctica en los análisis que se pueden desarrollar a partir de esta.

Por esta razón, en el desarrollo de este post, te exponemos un breve ejemplo de una neurona en Deep Learning, a partir de la implementación de gradient descent o gradiente descendente como parte del procesamiento de los datos.

Ejemplo de una neurona en Deep Learning

Pues bien, conocer cómo se presenta una neurona se comprende mucho mejor si se aprende implementándolo, por ello, te presentamos este ejemplo de una neurona en Deep Learning para ver cómo se implementa con TensorFlow.

# implementación de gradient descent en una red neuronal
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np
# Implementamos nuestra función de activación: la función logística
def sigmoid_activation(x):
  return 1.0 / (1 + np.exp(-x))
# Implementamos la función que nos calcula las predicciones (Forward pass)
def predict(X,W):
  preds = sigmoid_activation(X.dot(W))
  # preds devuelve una probabilidad para cada posible clase, cuya suma da 1
  # necesitamos pasar este vector de probabilidades a un vector de clases:
  # umbralizamos
  preds[preds <= 0.5] = 0
  preds[preds > 0.5] = 1
  
  #Devolvemos las predicciones
  return preds
# Generamos un dataset de juguete
(X, y) = make_blobs(n_samples=500, n_features=2, centers=2, cluster_std=2.5, random_state=1)
y = y.reshape((y.shape[0], 1))
# Lo visualizamos
plt.scatter(X[:, 0], X[:, 1], c=y[:, 0])
<matplotlib.collections.PathCollection at 0x7f008b8249b0>
# Shape de X
X.shape

(500, 2)

# Incluimos la columna de bias para poder realizar los cálculos de forma 
# eficiente (bias trick)
X = np.c_[X, np.ones((X.shape[0]))]
# Veamos las dimensiones de X
X.shape

(500, 3)

# Partimos en training y testing
(train_X, test_X, train_Y, test_Y) = train_test_split(X, y, test_size=0.3, random_state=1)
# Veamos los tamaños
train_X.shape

(350, 3)

train_Y.shape

(350, 1)

test_X.shape

(150, 3)

test_Y.shape

(150, 1)

# Inicializamos nuestra matriz de pesos de forma aleatoria y el vector de 
# históricos de pérdidas
W = np.random.randn(X.shape[1], 1)
losses = []
print(W)

[[-0.96418793]
[-0.53384948]
[ 0.7176862 ]]

# Empezamos con el FORWARD PROPAGATION

# Este es un proceso iterativo en el que poco a poco se van 
# actualizando los pesos usando el gradient descent para llegar a una mejor
# solución => épocas

n_epochs = 100
for epoch in np.arange(0, n_epochs):

  # calculamos las predicciones que da nuestra red con sus pesos actuales
  preds = sigmoid_activation(train_X.dot(W))

  # calculamos el error con respecto a las etiquetas
  error = preds - train_Y

  # definimos la función de pérdidas: en este caso, el error cuadrático
  # hay una gran variedad de funciones de pérdidas distintas que iremos viendo
  loss = np.sum(error ** 2)

  # añadimos nuestra pérdida al vector histórico de pérdidas
  losses.append(loss)

  # y comenzamos con el BACK PROPAGATION
  gradient = train_X.T.dot(error)

  # ahora actualizamos nuestros pesos
  # pero primero definimos nuestro learning rate
  learning_rate = 0.01
  W += -learning_rate * gradient
  
  # escribimos en pantalla cómo va el asunto
  print("[{}] loss: {}".format(epoch, loss))

  # en cuanto acaba de entrenar, vemos lo que ha estudiado nuestra red
preds = predict(test_X, W)
print(classification_report(test_Y, preds))
# y ahora algo que os recomiendo que hagáis siempre que podáis, comprobar 
# vuestras entradas, las predicciones y la curva de pérdidas
plt.scatter(test_X[:, 0], test_X[:, 1], c=test_Y[:,0])
<matplotlib.collections.PathCollection at 0x7f0088b0c748>
# veámoslo ahora con las predicciones
plt.scatter(test_X[:, 0], test_X[:, 1], c=preds[:,0])
<matplotlib.collections.PathCollection at 0x7f0088a68e48>
# veamos nuestra curva de pérdidas
plt.plot(np.arange(0, n_epochs), losses)
plt.title("Training Loss")
plt.xlabel("Epoch #")
plt.ylabel("Loss")
Text(0, 0.5, 'Loss')

En este post, te has podido relacionar con un breve ejemplo de una neurona en Deep Learning. Recuerda que debes apropiar este tipo de cálculos y desarrollo de redes neuronales a los datos que te encuentres trabajando y que, cada uno de estos, estará guiado por los resultados esperados para el procesamiento de los macrodatos.

Por otra parte, desde KeepCodging te traemos el Bootcamp Full Stack Big Data, gracias al que podrás aprender mucho más sobre este servicio de Google y, en general, sobre los sistemas y herramientas más importantes en el universo del Big Data. De la mano de profesionales y en menos de nueve meses, te podrás convertir en todo un experto y conocer e identificar las alternativas de gestión de datos más apropiadas para los estudios de los macrodatos. ¿A qué estás esperando para empezar? ¡Inscríbete ahora!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado