TensorFlow

TensorFlow

Tutorial TensorFlow: Algoritmo de backpropagation

Aprende los fundamentos del algoritmo de backpropagation, cómo calcular gradientes y ajustar pesos con TensorFlow, mejorando tus modelos neuronales.

Aprende TensorFlow GRATIS y certifícate

Fundamentos del algoritmo de backpropagation

El algoritmo de backpropagation es fundamental en el entrenamiento de redes neuronales artificiales. Su principal objetivo es ajustar los pesos sinápticos para minimizar la función de pérdida, mejorando así la capacidad de la red para generalizar a nuevos datos. Este ajuste se logra propagando el error desde la capa de salida hacia las capas anteriores, permitiendo que cada neurona contribuya a la corrección del modelo.

Durante el proceso de entrenamiento, se realiza primero una propagación hacia adelante (forward pass) donde los datos de entrada se transforman a través de las capas hasta obtener una salida. Esta salida se compara con el valor real utilizando una función de pérdida para calcular el error. El backpropagation utiliza este error para calcular los gradientes de los pesos, esenciales para el ajuste del modelo.

El cálculo de los gradientes se basa en la regla de la cadena del cálculo diferencial. Esta regla permite descomponer las derivadas parciales de la función de pérdida respecto a cada peso en productos de derivadas más sencillas. Gracias a esto, es posible calcular de manera eficiente cómo pequeños cambios en los pesos afectan al error total, incluso en redes con múltiples capas y funciones de activación no lineales.

La actualización de los pesos se realiza ajustándolos en dirección opuesta al gradiente, siguiendo el principio del descenso del gradiente. Este proceso se repite iterativamente, permitiendo que la red neuronal mejore progresivamente su rendimiento. La tasa de aprendizaje es un factor crucial en este ajuste, ya que determina la magnitud de los cambios en los pesos y afecta la convergencia del algoritmo.

Es esencial que las funciones de activación utilizadas en las neuronas sean diferenciables, puesto que el cálculo de los gradientes depende de sus derivadas. Funciones como la sigmoide, tanh o ReLU son comunes en las redes neuronales precisamente por esta propiedad. La diferenciabilidad garantiza que el algoritmo de backpropagation pueda calcular correctamente los ajustes necesarios en los pesos.

El éxito del backpropagation ha sido facilitado por su capacidad para trabajar con grandes cantidades de datos y parámetros. Además, frameworks como TensorFlow han incorporado este algoritmo de manera eficiente, permitiendo a los desarrolladores construir y entrenar modelos complejos sin tener que implementar manualmente cada detalle matemático. Esto ha acelerado el avance en áreas como el aprendizaje profundo y ha expandido las aplicaciones de las redes neuronales en diversos campos.

Cálculo de gradientes en backpropagation

El cálculo de gradientes es un paso esencial en el algoritmo de backpropagation, ya que permite ajustar los pesos de las conexiones neuronales para minimizar la función de pérdida. Este proceso implica determinar cómo influye cada peso en el error total de la red, calculando la derivada parcial del error con respecto a cada peso.

En una red neuronal, el flujo de información durante el entrenamiento ocurre en dos fases: la propagación hacia adelante (forward pass) y la propagación hacia atrás (backward pass). Durante la propagación hacia adelante, se calcula la salida de la red. En la propagación hacia atrás, se calculan los gradientes utilizando la regla de la cadena, lo que permite actualizar los pesos de manera eficiente.

La regla de la cadena es fundamental para el cálculo de gradientes en redes neuronales multicapa. Esta regla establece que la derivada de una función compuesta es el producto de las derivadas de las funciones individuales. Matemáticamente, si tenemos una función compuesta $( f(g(x)) )$, su derivada es:

$$[ \frac{df}{dx} = \frac{df}{dg} \cdot \frac{dg}{dx} ]$$

Aplicada al backpropagation, esta regla permite calcular el gradiente de la función de pérdida con respecto a cada peso, propagando el error desde la capa de salida hasta las capas iniciales.

Para una neurona $( j )$ en la capa $( l )$, el error local se define como:

$$[ \delta_j^l = \frac{\partial E}{\partial z_j^l} ]$$

Donde:

  • $( E )$ es la función de pérdida.
  • $( z_j^l )$ es la entrada neta de la neurona $( j )$ en la capa $( l )$.

El error local se calcula de manera diferente según la capa:

  • Capa de salida:

$$[ \delta_j^L = (a_j^L - y_j) \cdot f'(z_j^L) ]$$

  • Capas ocultas:

$$[ \delta_j^l = f'(z_j^l) \cdot \sum_{k} \delta_k^{l+1} \cdot w_{jk}^{l+1} ]$$

Donde:

  • $( a_j^L )$ es la salida activada de la neurona $( j )$ en la capa de salida.
  • $( y_j )$ es el valor objetivo.
  • $( f'(z_j^l) )$ es la derivada de la función de activación evaluada en $( z_j^l )$.
  • $( w_{jk}^{l+1} )$ es el peso que conecta la neurona $( j )$ en la capa $( l )$ con la neurona $( k )$ en la capa siguiente $( l+1 )$.

Una vez calculados los errores locales, el gradiente del peso $( w_{ij}^l )$ se obtiene mediante:

$$[ \frac{\partial E}{\partial w_{ij}^l} = \delta_j^l \cdot a_i^{l-1} ]$$

Aquí, $( a_i^{l-1} )$ es la salida activada de la neurona $( i )$ en la capa anterior $( l-1 )$.

En el contexto de TensorFlow, el cálculo de gradientes se simplifica gracias a su capacidad de diferenciación automática. TensorFlow construye un grafo computacional que registra las operaciones realizadas durante la propagación hacia adelante. Al utilizar tf.GradientTape, el framework rastrea las operaciones y calcula automáticamente los gradientes necesarios.

Por ejemplo, para una capa densa personalizada, el código podría ser:

import tensorflow as tf

class MiCapaDensa(tf.keras.layers.Layer):
    def __init__(self, unidades):
        super(MiCapaDensa, self).__init__()
        self.unidades = unidades

    def build(self, input_shape):
        self.w = self.add_weight(
            shape=(input_shape[-1], self.unidades),
            initializer='random_normal',
            trainable=True)
        self.b = self.add_weight(
            shape=(self.unidades,),
            initializer='zeros',
            trainable=True)

    def call(self, entradas):
        return tf.matmul(entradas, self.w) + self.b

# Datos de entrada y objetivo
entradas = tf.constant([[1.0, 2.0]])
objetivo = tf.constant([[3.0]])

# Instancia de la capa
capa = MiCapaDensa(unidades=1)

# Cálculo de la salida y la pérdida
with tf.GradientTape() as tape:
    salida = capa(entradas)
    perdida = tf.reduce_mean(tf.square(salida - objetivo), axis=0)

# Cálculo de gradientes
gradientes = tape.gradient(perdida, capa.trainable_variables)
print(gradientes)

En este ejemplo, tf.GradientTape rastrea las operaciones para calcular los gradientes de la pérdida con respecto a los pesos $(( w ))$ y sesgos $(( b ))$ de la capa. La función de pérdida utilizada es el error cuadrático medio, y los gradientes obtenidos se pueden utilizar para actualizar los pesos mediante un algoritmo de optimización.

Es crucial seleccionar funciones de activación con propiedades de derivabilidad adecuadas. Por ejemplo, la función ReLU (Rectified Linear Unit) es ampliamente utilizada por su simplicidad computacional y porque su derivada es fácil de calcular:

$$[ f(z) = \max(0, z) ]$$
$$[ f'(z) = \begin{cases} 1 & \text{si } z > 0 \ 0 & \text{si } z \leq 0 \end{cases} ]$$

Sin embargo, en casos donde $( z \leq 0 )$, el gradiente es cero, lo que puede conducir al problema de neuronas muertas. Para evitarlo, se pueden utilizar variantes como la Leaky ReLU.

El cálculo numérico de gradientes requiere atención para evitar problemas como el desbordamiento o pérdida de precisión. El uso de técnicas como la normalización de datos y la inicialización adecuada de pesos contribuye a mantener los valores numéricos en rangos manejables.

Además, el cálculo eficiente de gradientes en redes profundas se beneficia del uso de GPU o aceleradores especializados. TensorFlow facilita la asignación de operaciones a diferentes dispositivos, optimizando el rendimiento computacional.

En resumen, el cálculo de gradientes en backpropagation es un proceso que combina conceptos matemáticos y consideraciones prácticas de implementación. Comprender este mecanismo es fundamental para desarrollar y entrenar modelos de redes neuronales de manera eficaz y para resolver desafíos que surgen durante el proceso de aprendizaje.

Actualización de pesos y tasas de aprendizaje

En el entrenamiento de una red neuronal, la actualización de los pesos es un paso crítico que se realiza utilizando los gradientes obtenidos durante el backpropagation. El objetivo es ajustar los pesos para minimizar la función de pérdida, mejorando así el rendimiento del modelo.

La tasa de aprendizaje $$(( \eta ))$$ es un hiperparámetro clave que determina el tamaño de los pasos en la actualización de los pesos. Una tasa de aprendizaje adecuada balancea la velocidad de convergencia y la estabilidad del entrenamiento.

La fórmula básica para actualizar un peso $( w )$ es:

$$[ w_{\text{nuevo}} = w_{\text{actual}} - \eta \cdot \nabla w ]$$

Donde:

  • $( \nabla w )$ es el gradiente del peso respecto a la función de pérdida.
  • $( \eta )$ es la tasa de aprendizaje.

Una tasa de aprendizaje demasiado alta puede provocar que el algoritmo diverja y los pesos oscilen sin converger. Por el contrario, una tasa de aprendizaje demasiado baja puede hacer que el entrenamiento sea excesivamente lento y quede atrapado en mínimos locales.

Para abordar este desafío, existen optimizadores adaptativos que ajustan la tasa de aprendizaje durante el entrenamiento. Adam (Adaptive Moment Estimation) es uno de los optimizadores más utilizados. Combina las ventajas de los algoritmos AdaGrad y RMSprop, adaptando la tasa de aprendizaje para cada peso individual en función de las primeras y segundas estimaciones de momentos del gradiente.

La actualización de los pesos con Adam se realiza mediante las siguientes ecuaciones:

  • Calcular las estimaciones de primer momento $(( m_t ))$ y segundo momento $(( v_t ))$:

$$[ m_t = \beta_1 m_{t-1} + (1 - \beta_1) \nabla w_t ]$$
$$[ v_t = \beta_2 v_{t-1} + (1 - \beta_2) (\nabla w_t)^2 ]$$

  • Corregir los sesgos:

$$[ \hat{m}_t = \frac{m_t}{1 - \beta_1^t} ]$$
$$[ \hat{v}_t = \frac{v_t}{1 - \beta_2^t} ]$$

  • Actualizar el peso:

$$[ w_{t+1} = w_t - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} ]$$

Donde:

  • $( \beta_1 )$ y $( \beta_2 )$ son coeficientes de decaimiento para los momentos.
  • $( \epsilon )$ es un pequeño valor para prevenir divisiones por cero.

Para implementar Adam en TensorFlow:

import tensorflow as tf

optimizador = tf.keras.optimizers.Adam(learning_rate=0.001)

modelo.compile(optimizer=optimizador, loss='categorical_crossentropy', metrics=['accuracy'])

Además de Adam, TensorFlow ofrece otros optimizadores como SGD, RMSprop y Adagrad, cada uno con diferentes estrategias para actualizar los pesos. La elección del optimizador puede influir significativamente en la convergencia y rendimiento del modelo.

El uso de programadores de tasa de aprendizaje permite modificar la tasa de aprendizaje durante el entrenamiento. Por ejemplo, se puede empezar con una tasa alta y reducirla gradualmente para afinar el modelo. TensorFlow proporciona callbacks como LearningRateScheduler y ReduceLROnPlateau para este propósito.

Ejemplo de uso de LearningRateScheduler:

def programador(epoch, lr):
    if epoch < 10:
        return lr
    else:
        return lr * tf.math.exp(-0.1)

callback_lr = tf.keras.callbacks.LearningRateScheduler(programador)

historial = modelo.fit(entradas, salidas, epochs=50, callbacks=[callback_lr])

El callback ReduceLROnPlateau disminuye la tasa de aprendizaje cuando una métrica específica no mejora:

callback_reduce_lr = tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5)

historial = modelo.fit(entradas, salidas, epochs=50, validation_data=(x_val, y_val), callbacks=[callback_reduce_lr])

Además, técnicas como el momentum ayudan a acelerar la convergencia al considerar la dirección del gradiente acumulado. El optimizador SGD con momentum es una opción para aprovechar esta estrategia:

optimizador = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9)

La selección de una tasa de aprendizaje adecuada y del optimizador correcto requiere experimentación y puede depender de factores como el tamaño del conjunto de datos, la arquitectura de la red y la complejidad del problema.

Es importante monitorizar el entrenamiento y ajustar los hiperparámetros según sea necesario. Visualizar la evolución de la función de pérdida y de las métricas de rendimiento puede ofrecer información valiosa para optimizar la actualización de pesos y la tasa de aprendizaje.

Problemas comunes y soluciones en backpropagation

Uno de los problemas comunes en el backpropagation es el fenómeno de los gradientes que desaparecen (vanishing gradients) y los gradientes que explotan (exploding gradients). En redes neuronales profundas, los gradientes pueden volverse extremadamente pequeños o grandes al propagarse hacia las capas iniciales, afectando negativamente el proceso de aprendizaje. Para mitigar los vanishing gradients, se pueden utilizar funciones de activación como ReLU, que mantienen gradientes más constantes. Además, técnicas como la normalización por lotes (batch normalization) ayudan a estabilizar y acelerar el entrenamiento. Para evitar exploding gradients, es efectivo aplicar clipping de gradientes, limitando su valor máximo durante la actualización de los pesos.

Otro desafío es el overfitting, donde el modelo se ajusta demasiado a los datos de entrenamiento y pierde capacidad de generalización. Para combatir este problema, se implementan técnicas de regularización como L2 regularization, que penaliza pesos grandes, y dropout, que desactiva aleatoriamente neuronas durante el entrenamiento. Además, es crucial contar con un conjunto de datos representativo y, si es posible, aumentar su tamaño mediante data augmentation.

La selección inapropiada de la tasa de aprendizaje también puede causar problemas. Una tasa demasiado alta puede provocar que el modelo no converja, mientras que una tasa demasiado baja puede hacer que el entrenamiento sea excesivamente lento. Optimizadores adaptativos como Adam o RMSprop ajustan la tasa de aprendizaje automáticamente. Implementar schedulers que modifican la tasa de aprendizaje durante el entrenamiento también es una práctica efectiva.

La falta de normalización de los datos puede dificultar el entrenamiento y la convergencia. Es fundamental preprocesar los datos mediante técnicas de normalización o estandarización para garantizar que las características estén en escalas comparables. Usar capas de BatchNormalization en la arquitectura de la red también contribuye a mejorar la estabilidad del entrenamiento.

Las malas inicializaciones de pesos pueden llevar a que el modelo no aprenda correctamente. Emplear inicializaciones como He o Glorot ayuda a mantener la varianza de las activaciones constante a lo largo de las capas, facilitando el flujo de gradientes y mejorando la convergencia.

En algunos casos, los modelos pueden quedar atrapados en mínimos locales o planos de meseta, ralentizando el progreso. Utilizar optimizadores con momentum o nesterov momentum puede ayudar a superar estos obstáculos al incorporar información de actualizaciones anteriores en la dirección de los pasos.

Los datos desbalanceados representan otro problema, especialmente en tareas de clasificación. Si ciertas clases están subrepresentadas, el modelo puede rendir mal en ellas. Para abordar esto, se pueden ajustar los pesos de las clases en la función de pérdida o aplicar técnicas de sobre muestreo (oversampling) y sub muestreo (undersampling).

Las inconsistencias numéricas y problemas de estabilidad pueden surgir debido a valores extremos en los cálculos. Añadir pequeños valores $( \epsilon )$ para evitar divisiones por cero y utilizar tipos de datos adecuados, como float32, ayuda a mantener la estabilidad numérica.

El tamaño del batch influye en la calidad y velocidad del entrenamiento. Batches muy pequeños pueden producir actualizaciones del gradiente ruidosas, mientras que batches grandes requieren más memoria y pueden llevar a convergencia a subóptimos. Es importante encontrar un equilibrio adecuado y, si es necesario, utilizar mini-batch gradient descent.

Por último, errores en la implementación del código, como dimensiones incorrectas de los tensores o uso inapropiado de funciones, pueden causar problemas difíciles de detectar. Es esencial realizar una depuración meticulosa, utilizar unidades de prueba y validar los resultados con conjuntos de datos pequeños o modelos simplificados.

Al abordar estos problemas comunes y aplicar las soluciones mencionadas, se mejora la eficiencia y eficacia del backpropagation en el entrenamiento de redes neuronales. Esto permite desarrollar modelos más robustos, capaces de aprender y generalizar de manera efectiva a nuevos datos.

Implementación paso a paso del backpropagation

La implementación práctica del algoritmo de backpropagation es fundamental para entender cómo se entrenan las redes neuronales en la práctica. A continuación, se presenta un ejemplo paso a paso utilizando TensorFlow para construir y entrenar una red neuronal simple, aplicando manualmente el algoritmo de backpropagation.

Definición del problema

Consideremos un conjunto de datos sintético donde el objetivo es aproximar la función $( y = 2x + 1 )$. Generaremos datos de entrada y salida para entrenar una red neuronal de una sola capa.

import tensorflow as tf
import numpy as np

# Generación de datos de entrenamiento
x_train = np.linspace(0, 10, num=100, dtype=np.float32)
y_train = 2 * x_train + 1

Creación del modelo

Definimos un modelo secuencial simple utilizando la API de Keras de TensorFlow. La red consta de una sola capa densa con una neurona, sin función de activación.

# Definición del modelo
modelo = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(1,)),
    tf.keras.layers.Dense(units=1)     
])

Definición de la función de pérdida y el optimizador

Utilizaremos el Error Cuadrático Medio como función de pérdida y el optimizador SGD (Stochastic Gradient Descent) con una tasa de aprendizaje de 0.01.

# Función de pérdida y optimizador
funcion_perdida = tf.keras.losses.MeanSquaredError()
optimizador = tf.keras.optimizers.SGD(learning_rate=0.01)

Implementación del ciclo de entrenamiento

Implementamos el ciclo de entrenamiento manualmente, utilizando tf.GradientTape para calcular los gradientes, y actualizando los pesos en cada época.

# Conversión de los datos a tensores de TensorFlow
x_train_tf = tf.convert_to_tensor(x_train.reshape(-1, 1))
y_train_tf = tf.convert_to_tensor(y_train.reshape(-1, 1))

# Número de épocas de entrenamiento
epocas = 100

# Ciclo de entrenamiento
for epoca in range(epocas):
    with tf.GradientTape() as tape:
        # Forward pass: cálculo de las predicciones
        y_pred = modelo(x_train_tf, training=True)
        # Cálculo de la pérdida
        perdida = funcion_perdida(y_train_tf, y_pred)
    # Cálculo de los gradientes respecto a las variables entrenables
    gradientes = tape.gradient(perdida, modelo.trainable_variables)
    # Actualización de los pesos
    optimizador.apply_gradients(zip(gradientes, modelo.trainable_variables))
    
    # Impresión del estado cada 10 épocas
    if (epoca + 1) % 10 == 0:
        perdida_valor = perdida.numpy()
        print(f"Época {epoca + 1}: Pérdida = {perdida_valor:.4f}")

En este código, dentro del bloque with tf.GradientTape(), realizamos la propagación hacia adelante calculando las predicciones y_pred para las entradas x_train_tf. Luego, calculamos la pérdida comparando las predicciones con los valores reales y_train_tf.

Después, con tape.gradient, computamos los gradientes de la pérdida respecto a las variables entrenables del modelo, que son los pesos y sesgos de la capa densa. Finalmente, el optimizador actualiza los pesos aplicando los gradientes calculados.

Verificación de los resultados

Una vez completado el entrenamiento, podemos verificar los pesos aprendidos para corroborar que el modelo ha aproximado correctamente la función objetivo.

# Obtención de los pesos y sesgos entrenados
peso = modelo.layers[0].weights[0].numpy()
sesgo = modelo.layers[0].weights[1].numpy()

print(f"Peso aprendido: {peso[0][0]:.4f}")
print(f"Sesgo aprendido: {sesgo[0]:.4f}")

Idealmente, el peso debería ser cercano a 2 y el sesgo cercano a 1, que son los parámetros de la función original $( y = 2x + 1 )$.

Explicación detallada de cada paso

  • Generación de datos de entrenamiento: Creamos un conjunto de datos de entrada x_train y calculamos las salidas correspondientes y_train utilizando la función lineal objetivo. Es importante usar datos apropiados para entrenar eficazmente el modelo.
  • Definición del modelo: Utilizamos tf.keras.Sequential para construir un modelo simple. La capa Dense con units=1 y input_shape=(1,) define una neurona que recibe una entrada y produce una salida. No especificamos una función de activación, por lo que se utiliza una función identidad.
  • Función de pérdida y optimizador: Elegimos el Error Cuadrático Medio (MeanSquaredError) porque es adecuado para problemas de regresión. El optimizador SGD es un algoritmo de optimización sencillo que utiliza el gradiente para actualizar los pesos.
  • Conversión de datos a tensores: Convertimos los datos de NumPy a tensores de TensorFlow para que puedan ser procesados por el modelo y las operaciones del grafo computacional.
  • Ciclo de entrenamiento:
    • Forward pass: Calculamos las predicciones del modelo para las entradas actuales.
    • Cálculo de la pérdida: Evaluamos qué tan buenas son las predicciones comparándolas con los valores reales.
    • Cálculo de gradientes: Usamos tf.GradientTape para calcular los gradientes de la pérdida respecto a los pesos entrenables del modelo.
    • Actualización de pesos: El optimizador aplica los gradientes para ajustar los pesos y minimizar la pérdida.
  • Monitoreo del entrenamiento: Cada 10 épocas, imprimimos el valor de la pérdida para observar el progreso del entrenamiento. Es una buena práctica monitorear la pérdida para detectar posibles problemas.
  • Verificación de pesos aprendidos: Después del entrenamiento, extraemos los valores de los pesos y sesgos aprendidos para verificar si el modelo ha capturado correctamente la relación entre las variables.

Extensión a modelos más complejos

Este procedimiento puede extenderse a redes neuronales más profundas o con arquitecturas más complejas. Por ejemplo, podemos implementar una red con múltiples capas y utilizar funciones de activación no lineales como ReLU.

# Definición de un modelo más complejo
modelo_complejo = tf.keras.Sequential([
    tf.keras.layers.Dense(units=16, activation='relu', input_shape=(1,)),
    tf.keras.layers.Dense(units=16, activation='relu'),
    tf.keras.layers.Dense(units=1)
])

# Repetimos los pasos de definición de pérdida, optimizador y ciclo de entrenamiento

Al aumentar la complejidad del modelo, es posible capturar relaciones más complejas en los datos. Sin embargo, esto también requiere una gestión cuidadosa de los hiperparámetros y del proceso de entrenamiento para evitar problemas como el overfitting.

Uso de datasets y batching

En problemas con conjuntos de datos más grandes, es recomendable utilizar la API tf.data para manejar eficientemente los datos y aplicar técnicas como el batching y el shuffle.

# Creación del dataset
dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
# Mezcla aleatoria y división en batches
dataset = dataset.shuffle(buffer_size=100).batch(32)

# Ciclo de entrenamiento ajustado
for epoca in range(epocas):
    for x_batch, y_batch in dataset:
        with tf.GradientTape() as tape:
            y_pred = modelo(x_batch, training=True)
            perdida = funcion_perdida(y_batch, y_pred)
        gradientes = tape.gradient(perdida, modelo.trainable_variables)
        optimizador.apply_gradients(zip(gradientes, modelo.trainable_variables))
    # Monitorización (opcional)

El uso de batches ayuda a estabilizar el cálculo de gradientes y a mejorar la eficiencia computacional, especialmente cuando se trabaja con grandes volúmenes de datos.

Aprende TensorFlow GRATIS online

Todas las lecciones de TensorFlow

Accede a todas las lecciones de TensorFlow y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción Al Deep Learning Y Redes Neuronales

TensorFlow

Introducción Y Entorno

Introducción A Tensorflow

TensorFlow

Introducción Y Entorno

Introducción A Keras

TensorFlow

Introducción Y Entorno

Redes Neuronales De Múltiples Capas

TensorFlow

Introducción Y Entorno

Algoritmo De Backpropagation

TensorFlow

Introducción Y Entorno

Implementación De Una Red Neuronal Con Numpy

TensorFlow

Introducción Y Entorno

Modelo Con Api Secuencial

TensorFlow

Construcción De Modelos Con Keras

Modelo Con Api Funcional

TensorFlow

Construcción De Modelos Con Keras

Subclases De Modelos

TensorFlow

Construcción De Modelos Con Keras

Capas En Keras

TensorFlow

Construcción De Modelos Con Keras

Funciones De Activación

TensorFlow

Construcción De Modelos Con Keras

Redes Neuronales Densas De Regresión

TensorFlow

Construcción De Modelos Con Keras

Redes Neuronales Densas De Clasificación Binaria

TensorFlow

Construcción De Modelos Con Keras

Redes Neuronales Densas De Clasificación Multiclase

TensorFlow

Construcción De Modelos Con Keras

Redes Convolucionales Cnn

TensorFlow

Construcción De Modelos Con Keras

Redes Recurrentes Rnn

TensorFlow

Construcción De Modelos Con Keras

Redes Neuronales Mixtas

TensorFlow

Construcción De Modelos Con Keras

Api Dataset

TensorFlow

Procesamiento De Datos

Manejo De Valores Faltantes

TensorFlow

Procesamiento De Datos

Encoding De Valores Categóricos En Continuos

TensorFlow

Procesamiento De Datos

Preprocesados De Escalado, Normalización Y Estandarización

TensorFlow

Procesamiento De Datos

Generación De Nuevas Características

TensorFlow

Procesamiento De Datos

Algoritmos De Optimización

TensorFlow

Entrenamiento Y Evaluación De Modelos

Técnicas De Validación

TensorFlow

Entrenamiento Y Evaluación De Modelos

Monitorización De Entrenamiento

TensorFlow

Entrenamiento Y Evaluación De Modelos

Redes Generativas Adversariales Gans

TensorFlow

Técnicas Avanzadas

Transformers

TensorFlow

Técnicas Avanzadas

Autoencoders

TensorFlow

Técnicas Avanzadas

Carga De Capas Ya Hechas

TensorFlow

Técnicas Avanzadas

Regularización De Modelos

TensorFlow

Herramientas Y Optimización

Hiperparámetros Con Keras Tuner

TensorFlow

Herramientas Y Optimización

Tensorboard

TensorFlow

Herramientas Y Optimización

Uso De Tensorflow Keras En Gpu

TensorFlow

Herramientas Y Optimización

Accede GRATIS a TensorFlow y certifícate

Objetivos de aprendizaje de esta lección

  • Entender el flujo de datos en el backpropagation: forward y backward pass.
  • Aplicar la regla de la cadena para calcular gradientes en redes multicapa.
  • Usar TensorFlow para implementar backpropagation con tf.GradientTape.
  • Ajustar pesos utilizando optimizadores como SGD y Adam en TensorFlow.
  • Identificar y solucionar problemas comunes en backpropagation, como vanishing gradients.