TensorFlow

TensorFlow

Tutorial TensorFlow: Modelo con API Funcional

Aprende a construir modelos avanzados con la API Funcional de Keras. Diseña arquitecturas complejas, maneja múltiples entradas y salidas, y explora capas compartidas.

Aprende TensorFlow GRATIS y certifícate

Introducción a la API Funcional

La API Funcional de Keras es una forma versátil y potente de construir modelos de aprendizaje profundo en TensorFlow. A diferencia de la API Secuencial, que limita la estructura del modelo a una pila lineal de capas, la API Funcional permite crear modelos con arquitecturas más complejas y flexibles.

En la API Funcional, los modelos se definen mediante la conexión directa entre capas, formando grafos dirigidos acíclicos. Esto significa que puedes diseñar modelos con múltiples entradas, múltiples salidas, capas compartidas y conectividades arbitrarias, lo que es esencial para arquitecturas avanzadas como redes residuales o de atención.

Para utilizar la API Funcional, se comienza definiendo un objeto Input, que especifica la forma y tipo de los datos de entrada:

from tensorflow import keras
from tensorflow.keras import layers

entradas = keras.Input(shape=(784,))

A continuación, las capas se aplican directamente sobre los tensores de entrada o sobre los tensores resultantes de otras capas:

x = layers.Dense(64, activation='relu')(entradas)
x = layers.Dense(64, activation='relu')(x)
salidas = layers.Dense(10, activation='softmax')(x)

Finalmente, se crea una instancia de Model especificando las entradas y salidas del modelo:

modelo = keras.Model(inputs=entradas, outputs=salidas)

Este enfoque basado en funciones permite acceder y manipular fácilmente los tensores intermedios, lo que facilita la visualización y modificación del flujo de datos dentro del modelo. Además, la API Funcional es compatible con todas las características de Keras, como la compilación, entrenamiento y evaluación del modelo:

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

Una de las ventajas clave de la API Funcional es la capacidad de crear modelos con estructuras no lineales. Por ejemplo, es posible concatenar tensores provenientes de diferentes capas o aplicar la misma capa a múltiples tensores:

# Concatenación de tensores
tensor_concatenado = layers.Concatenate()([tensor_a, tensor_b])

# Uso de una capa compartida
capa_compartida = layers.Dense(64, activation='relu')
x1 = capa_compartida(entrada1)
x2 = capa_compartida(entrada2)

La posibilidad de reutilizar capas compartidas es especialmente útil en modelos que necesitan procesar entradas similares de manera paralela, como en redes siamesas o al modelar relaciones entre pares de datos.

Otro aspecto importante es la facilidad para construir modelos con múltiples entradas y salidas, lo que amplía las posibilidades en tareas donde se necesitan combinar diferentes fuentes de información o predecir múltiples variables simultáneamente.

En resumen, la API Funcional de Keras ofrece una forma intuitiva y flexible de diseñar modelos de aprendizaje profundo complejos. Su uso es esencial cuando se requieren arquitecturas más sofisticadas que las permitidas por la API Secuencial, manteniendo al mismo tiempo la simplicidad y elegancia del código.

Creación de un modelo con la API funcional

La creación de un modelo utilizando la API Funcional de Keras implica definir explícitamente las entradas y salidas del modelo, así como la conexión entre las capas intermedias. Este enfoque proporciona mayor flexibilidad y permite construir arquitecturas más complejas que la API Secuencial.

Para comenzar, se debe importar los módulos necesarios de TensorFlow y Keras:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

El primer paso es definir la entrada del modelo utilizando keras.Input. Por ejemplo, para un conjunto de datos con características de tamaño 784:

entrada = keras.Input(shape=(784,), name='entrada_imagenes')

A continuación, se construye el grafo computacional aplicando secuencialmente capas sobre la entrada. Cada capa se trata como una función que transforma un tensor en otro:

x = layers.Dense(64, activation='relu', name='capa_oculta_1')(entrada)
x = layers.Dense(64, activation='relu', name='capa_oculta_2')(x)

La salida del modelo se define aplicando una capa final sobre el último tensor intermedio:

salida = layers.Dense(10, activation='softmax', name='capa_salida')(x)

Con las entradas y salidas definidas, se crea una instancia del modelo utilizando keras.Model:

modelo = keras.Model(inputs=entrada, outputs=salida, name='modelo_funcional')

Es posible visualizar la estructura del modelo empleando el método summary():

modelo.summary()

Que mostrará información detallada sobre las capas y parámetros del modelo:

Model: "modelo_funcional"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 entrada_imagenes (InputLayer) [(None, 784)]            0         
                                                                 
 capa_oculta_1 (Dense)       (None, 64)                50240     
                                                                 
 capa_oculta_2 (Dense)       (None, 64)                4160      
                                                                 
 capa_salida (Dense)         (None, 10)                650       
                                                                 
=================================================================
Total params: 55050 (215.43 KB)
Trainable params: 55050 (215.43 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

Antes de compilar el modelo, se selecciona el optimizador, la función de pérdida y las métricas que se utilizarán durante el entrenamiento:

modelo.summary()

Para entrenar el modelo, se proporcionan los datos de entrenamiento y, opcionalmente, los datos de validación:

historial = modelo.fit(x_entrenamiento, y_entrenamiento,
                       epochs=10,
                       batch_size=32,
                       validation_data=(x_validacion, y_validacion))

La API Funcional permite también acceder y manipular directamente los tensores y capas del modelo, facilitando tareas como la extracción de características intermedias. Por ejemplo, se puede crear un modelo que tome la misma entrada pero proporcione como salida el tensor intermedio x:

modelo_extractor = keras.Model(inputs=entrada, outputs=x, name='modelo_extractor')

Este modelo puede utilizarse para obtener las representaciones aprendidas en las capas ocultas:

caracteristicas = modelo_extractor.predict(nuevos_datos)

Además, es posible mezclar y combinar capas de manera más flexible. Por ejemplo, se puede aplicar una capa de Dropout para regularización:

x = layers.Dropout(0.5, name='dropout')(x)
salida = layers.Dense(10, activation='softmax', name='capa_salida')(x)

Es importante destacar que la API Funcional de Keras mantiene la simplicidad en la construcción de modelos a la vez que ofrece una gran potencia para implementar arquitecturas avanzadas. Su uso es recomendado cuando se requiere mayor control sobre el flujo de datos y la estructura del modelo.

Creación de modelos con múltiples entradas y salidas

La API Funcional de Keras permite construir modelos que manejan múltiples entradas y salidas, imprescindible para arquitecturas complejas. Esta capacidad es esencial en aplicaciones donde se integran diferentes fuentes de datos o se requieren predicciones simultáneas de diversas variables.

Por ejemplo, en un sistema de recomendación, es posible que necesitemos combinar información del usuario y del producto para predecir la probabilidad de compra. Para crear un modelo con múltiples entradas, comenzamos definiendo un objeto Input para cada fuente de datos:

from tensorflow import keras
from tensorflow.keras import layers

# Definir la entrada de texto
entrada_texto = keras.Input(shape=(None,), name='entrada_texto')
# Definir la entrada numérica
entrada_numerica = keras.Input(shape=(10,), name='entrada_numerica')

Procesamos cada entrada por separado utilizando capas específicas. La entrada de texto puede pasar por una capa de embedding seguida de una capa recurrente:

# Procesamiento de la entrada de texto
x1 = layers.Embedding(input_dim=10000, output_dim=64)(entrada_texto)
x1 = layers.LSTM(32)(x1)

La entrada numérica puede procesarse mediante capas densas:

# Procesamiento de la entrada numérica
x2 = layers.Dense(64, activation='relu')(entrada_numerica)

A continuación, combinamos las salidas de ambas ramas utilizando la capa Concatenate:

# Concatenar las salidas
combinado = layers.concatenate([x1, x2])

Sobre el tensor combinado, añadimos capas adicionales para obtener la salida final:

# Añadir capas posteriores
x = layers.Dense(64, activation='relu')(combinado)
salida_principal = layers.Dense(1, activation='sigmoid', name='salida_principal')(x)

Si deseamos tener múltiples salidas, podemos agregar capas de salida adicionales. Por ejemplo, podríamos añadir una salida auxiliar para predecir otra variable:

# Salida auxiliar basada en la entrada de texto
salida_auxiliar = layers.Dense(1, activation='sigmoid', name='salida_auxiliar')(x1)

Definimos el modelo especificando las entradas y salidas:

# Crear el modelo con múltiples entradas y salidas
modelo = keras.Model(
    inputs=[entrada_texto, entrada_numerica],
    outputs=[salida_principal, salida_auxiliar]
)

Al compilar el modelo, es necesario indicar las funciones de pérdida y las métricas para cada salida. Además, podemos asignar pesos a las pérdidas para equilibrar su influencia en el entrenamiento:

# Compilar el modelo con pérdidas y métricas para cada salida
modelo.compile(
    optimizer='adam',
    loss={
        'salida_principal': 'binary_crossentropy',
        'salida_auxiliar': 'binary_crossentropy'
    },
    loss_weights={
        'salida_principal': 1.0,
        'salida_auxiliar': 0.5
    },
    metrics={
        'salida_principal': 'accuracy',
        'salida_auxiliar': 'accuracy'
    }
)

Durante el entrenamiento, proporcionamos los datos de entrada y las etiquetas correspondientes. Es importante asegurar que los nombres de las entradas y salidas coincidan con los definidos en el modelo:

# Entrenar el modelo con múltiples entradas y salidas
historial = modelo.fit(
    {
        'entrada_texto': datos_texto,
        'entrada_numerica': datos_numericos
    },
    {
        'salida_principal': etiquetas_principales,
        'salida_auxiliar': etiquetas_auxiliares
    },
    epochs=10,
    batch_size=32
)

La flexibilidad de la API Funcional permite también crear modelos con más de dos entradas o salidas. Por ejemplo, podríamos añadir una tercera entrada de tipo imagen:

# Definir una tercera entrada de imagen
entrada_imagen = keras.Input(shape=(224, 224, 3), name='entrada_imagen')
# Procesamiento de la entrada de imagen
x3 = layers.Conv2D(32, (3, 3), activation='relu')(entrada_imagen)
x3 = layers.MaxPooling2D((2, 2))(x3)
x3 = layers.Flatten()(x3)
# Combinar todas las salidas
combinado_total = layers.concatenate([x1, x2, x3])

Después de combinar todas las ramas, procedemos como antes para obtener las salidas finales. La capacidad de manejar múltiples entradas y salidas es especialmente útil en modelos que requieren integrar información heterogénea o realizar predicciones conjuntas.

Además, podemos utilizar esta funcionalidad para implementar modelos que aprendan representaciones internas más robustas mediante la retroalimentación de múltiples señales de pérdida.

En resumen, la creación de modelos con múltiples entradas y salidas en Keras amplía las posibilidades de diseño, permitiendo abordar problemas complejos y desarrollar soluciones más sofisticadas. La versatilidad de la API Funcional es clave para explotar al máximo el potencial del aprendizaje profundo en aplicaciones reales.

Modelos con capas compartidas

La utilización de capas compartidas en modelos construidos con la API Funcional de Keras es una técnica que permite que una misma capa sea empleada varias veces en distintas partes del modelo. Esto es especialmente útil cuando se desea aplicar la misma transformación a diferentes entradas o cuando se quiere reducir el número de parámetros aprendibles para prevenir el sobreajuste.

Capas compartidas significa que los pesos y bias de la capa son los mismos en todas las instancias donde se aplica. Modificar los pesos en un lugar afecta a todos los lugares donde se utiliza la capa compartida. Esto es esencial en arquitecturas como las redes siamesas, donde se busca comparar o medir similitudes entre entradas de forma consistente.

Para ilustrar el uso de capas compartidas, consideremos un ejemplo donde queremos comparar pares de palabras para determinar su similitud semántica. Primero, definimos una capa que convierte las palabras en sus representaciones vectoriales:

from tensorflow import keras
from tensorflow.keras import layers

# Definir la capa de embedding compartida
capa_embedding = layers.Embedding(input_dim=5000, output_dim=128)

Aquí, capa_embedding es una capa que convierte índices de palabras en vectores de 128 dimensiones. Al compartir esta capa entre dos entradas, garantizamos que ambas palabras son transformadas al mismo espacio vectorial de manera consistente.

Luego, definimos las entradas y aplicamos la capa compartida:

# Definir las entradas
entrada_palabra_1 = keras.Input(shape=(1,), name='entrada_palabra_1')
entrada_palabra_2 = keras.Input(shape=(1,), name='entrada_palabra_2')

# Aplicar la capa compartida
vector_palabra_1 = capa_embedding(entrada_palabra_1)
vector_palabra_2 = capa_embedding(entrada_palabra_2)

A continuación, podemos calcular la distancia o similitud entre los vectores resultantes. Por ejemplo, usando la distancia Euclidiana:

# Calcular la diferencia
diferencia = layers.Subtract()([vector_palabra_1, vector_palabra_2])
cuadrado_diferencia = layers.Multiply()([diferencia, diferencia])
distancia = layers.Lambda(lambda x: keras.backend.sum(x, axis=-1, keepdims=True))(cuadrado_diferencia)

Finalmente, añadimos una capa de salida para obtener la predicción:

# Salida del modelo
salida = layers.Dense(1, activation='sigmoid', name='salida')(distancia)

Y construimos el modelo especificando las entradas y salidas:

# Crear el modelo con capas compartidas
modelo = keras.Model(inputs=[entrada_palabra_1, entrada_palabra_2], outputs=salida)

La compilación y el entrenamiento del modelo se realizan como de costumbre:

# Compilar el modelo
modelo.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# Entrenar el modelo
historial = modelo.fit(
    [datos_palabra_1, datos_palabra_2], etiquetas,
    epochs=10,
    batch_size=32
)

El beneficio principal de utilizar capas compartidas es que el modelo aprende una representación común que es aplicable a diferentes entradas. Esto no solo reduce el número total de parámetros, sino que también puede mejorar la capacidad del modelo para generalizar.

Otro ejemplo de uso de capas compartidas es en modelos que procesan secuencias o series temporales, donde se aplica la misma operación a diferentes segmentos o ventanas de datos. Al compartir las capas, garantizamos que el procesamiento es consistente a lo largo de las secuencias.

Además, las capas compartidas son útiles cuando se necesita imponer una simetría en el modelo. Por ejemplo, en una red que compara imágenes, es esencial que ambas ramas procesen las imágenes con los mismos parámetros para que la comparación sea coherente.

Es importante destacar que para crear una capa compartida, simplemente se instancia la capa una vez y luego se reutiliza en diferentes puntos del modelo. Todas las llamadas a esta capa compartirán los mismos pesos:

# Definir una capa densa compartida
capa_densa_compartida = layers.Dense(64, activation='relu')

# Aplicar la capa compartida a diferentes tensores
salida_1 = capa_densa_compartida(tensor_1)
salida_2 = capa_densa_compartida(tensor_2)

La API Funcional de Keras maneja automáticamente el seguimiento de las conexiones y asegura que los gradientes se propaguen correctamente a través de las capas compartidas durante el entrenamiento.

Sin embargo, se debe tener cuidado al compartir capas que contengan variables de estado, como las capas de Batch Normalization o capas recurrentes con estado. El comportamiento de estas capas puede variar cuando se comparten, y es importante comprender cómo manejan el estado interno al ser aplicadas múltiples veces.

En resumen, el uso de capas compartidas en modelos con la API Funcional de Keras es una técnica poderosa para construir arquitecturas eficientes y coherentes. Al reutilizar capas, se promueve la consistencia en las transformaciones y se aprovecha al máximo la información aprendida, lo que puede conducir a modelos más efectivos y generalizables.

Modelos con conectividad compleja

La API Funcional de Keras permite construir modelos con conectividad compleja, donde las capas no siguen una secuencia lineal sino que forman grafos computacionales más elaborados. Esta capacidad es esencial para implementar arquitecturas modernas como Redes Residuales (ResNet), Inception o Redes Densas (DenseNet), que han demostrado un rendimiento superior en diversas tareas.

Una de las técnicas más comunes es el uso de conexiones residuales o skip connections. Estas conexiones permiten sumar la entrada de una capa a su salida, facilitando el flujo de información y reduciendo el problema del desvanecimiento del gradiente en redes profundas. Un ejemplo de un bloque residual es:

from tensorflow import keras
from tensorflow.keras import layers

# Entrada del modelo
entrada = keras.Input(shape=(224, 224, 3))

# Primera capa convolucional
x = layers.Conv2D(64, (3, 3), padding='same', activation='relu')(entrada)

# Camino residual
residual = x

# Bloque de capas convolucionales
x = layers.Conv2D(64, (3, 3), padding='same', activation='relu')(x)
x = layers.Conv2D(64, (3, 3), padding='same', activation='relu')(x)

# Suma de la conexión residual
x = layers.add([x, residual])

En este código, la salida de las capas convolucionales se suma a la entrada original, creando una conexión que mejora la propagación del gradiente. Este patrón es fundamental en arquitecturas como ResNet, donde se encadenan múltiples bloques residuales.

Otra forma de conectividad compleja es mediante rutas paralelas y concatenación de características, como en los bloques Inception. Estos bloques procesan la misma entrada a través de múltiples transformaciones y luego combinan las salidas:

# Ramas paralelas del bloque Inception
rama1 = layers.Conv2D(64, (1, 1), padding='same', activation='relu')(entrada)
rama2 = layers.Conv2D(64, (3, 3), padding='same', activation='relu')(entrada)
rama3 = layers.Conv2D(64, (5, 5), padding='same', activation='relu')(entrada)
rama4 = layers.MaxPooling2D((3, 3), strides=(1, 1), padding='same')(entrada)
rama4 = layers.Conv2D(64, (1, 1), padding='same', activation='relu')(rama4)

# Concatenación de las salidas
salida_inception = layers.concatenate([rama1, rama2, rama3, rama4], axis=-1)

Aquí, las diferentes ramas procesan la entrada en paralelo, y sus salidas se concatenan para formar una representación enriquecida. Este enfoque permite al modelo capturar características en múltiples escalas y resoluciones.

Las Redes Densas (DenseNet) llevan esta idea más allá al conectar cada capa con todas las capas posteriores:

def bloque_denso(entrada, unidades):
    concatenado = entrada
    for _ in range(3):
        x = layers.BatchNormalization()(concatenado)
        x = layers.Activation('relu')(x)
        x = layers.Conv2D(unidades, (3, 3), padding='same')(x)
        concatenado = layers.concatenate([concatenado, x])
    return concatenado

# Aplicación del bloque denso
x = bloque_denso(entrada, 32)

En este ejemplo, cada capa recibe como entrada todas las salidas previas, promoviendo la reutilización de características y mejorando el flujo de información.

Además, la API Funcional permite combinaciones personalizadas utilizando operaciones matemáticas entre tensores. Por ejemplo, se pueden realizar multiplicaciones o aplicar funciones lambda para operaciones específicas:

# Multiplicación de tensores
x1 = layers.Conv2D(64, (3, 3), activation='relu')(entrada)
x2 = layers.Conv2D(64, (3, 3), activation='relu')(entrada)
producto = layers.multiply([x1, x2])

# Aplicación de una función personalizada
def funcion_personalizada(tensor):
    return tensor * keras.backend.sqrt(keras.backend.mean(tensor))

x_modificado = layers.Lambda(funcion_personalizada)(producto)

La flexibilidad para crear modelos con conectividad arbitraria es crucial para explorar nuevas arquitecturas y adaptar modelos a necesidades específicas. Por ejemplo, al diseñar redes de atención o modelos con mecanismos de memoria, es común establecer conexiones complejas entre capas.

Es importante considerar las dimensiones y formas de los tensores al conectar capas no linealmente. Operaciones como suma o concatenación requieren que los tensores tengan dimensiones compatibles. Utilizar capas como layers.Reshape, layers.Flatten o layers.Permute puede ser necesario para ajustar las formas de los tensores.

Para mantener el código limpio y modular, es recomendable encapsular bloques de construcción en funciones o clases:

def bloque_incepcion(entrada, filtros):
    rama1 = layers.Conv2D(filtros, (1, 1), activation='relu', padding='same')(entrada)
    rama2 = layers.Conv2D(filtros, (3, 3), activation='relu', padding='same')(entrada)
    rama3 = layers.Conv2D(filtros, (5, 5), activation='relu', padding='same')(entrada)
    rama4 = layers.MaxPooling2D((3, 3), strides=(1, 1), padding='same')(entrada)
    rama4 = layers.Conv2D(filtros, (1, 1), activation='relu', padding='same')(rama4)
    salida = layers.concatenate([rama1, rama2, rama3, rama4], axis=-1)
    return salida

# Uso del bloque Inception
x = bloque_incepcion(entrada, 32)

La creación de submodelos o funciones reutilizables ayuda a manejar la complejidad y facilita la experimentación con diferentes configuraciones.

Además, al combinar técnicas como capas compartidas, múltiples entradas y salidas, y conectividad compleja, es posible construir modelos avanzados como redes siamesas o modelos multi-modalidad. Un ejemplo de red con múltiples rutas y conexiones complejas podría ser:

# Entrada adicional
entrada_auxiliar = keras.Input(shape=(10,))

# Procesamiento de la entrada principal
x1 = layers.Conv2D(64, (3, 3), activation='relu')(entrada)
x1 = layers.GlobalAveragePooling2D()(x1)

# Procesamiento de la entrada auxiliar
x2 = layers.Dense(64, activation='relu')(entrada_auxiliar)

# Combinación de características
combinado = layers.concatenate([x1, x2])

# Red densa final
salida = layers.Dense(5, activation='softmax')(combinado)

# Definición del modelo
modelo = keras.Model(inputs=[entrada, entrada_auxiliar], outputs=salida)

En este modelo, se combinan características extraídas de imágenes y datos tabulares, demostrando la versatilidad de la API Funcional para manejar diferentes tipos de datos y conectividades.

Al trabajar con modelos de conectividad compleja, es fundamental aprovechar herramientas como TensorBoard para visualizar el grafo computacional y verificar que las conexiones son las deseadas. Además, asegurar una correcta inicialización de pesos y utilizar regularización apropiada puede ser decisivo para el éxito del entrenamiento.

La API Funcional de Keras abre un amplio abanico de posibilidades para la investigación y desarrollo de modelos innovadores. Su capacidad para definir arquitecturas con conectividad compleja es una poderosa herramienta en el repertorio de cualquier profesional del aprendizaje profundo.

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 la estructura basada en grafos de la API Funcional.
  • Construir modelos con múltiples entradas y salidas.
  • Utilizar capas compartidas en redes avanzadas.
  • Diseñar arquitecturas complejas como ResNet e Inception.
  • Manipular tensores intermedios para personalizar el flujo de datos.