TensorFlow

TensorFlow

Tutorial TensorFlow: Subclases de modelos

Descubre cómo usar la API de subclases en Keras para crear modelos avanzados y dinámicos. Ideal para arquitecturas personalizadas en aprendizaje profundo.

Aprende TensorFlow GRATIS y certifícate

Introducción a la API de subclases de modelos

La API de subclases de modelos en Keras permite crear modelos personalizados definiendo clases que heredan de keras.Model. Este enfoque proporciona una flexibilidad total para construir arquitecturas de redes neuronales que no se ajustan a los patrones estándar de los modelos secuenciales o funcionales.

Al utilizar esta API, se definen los componentes del modelo en el método __init__ y se implementa la lógica de propagación hacia adelante en el método call. Esto permite controlar detalladamente cómo los datos fluyen a través del modelo y facilita la incorporación de estructuras dinámicas o condicionales.

Por ejemplo, para crear un modelo personalizado, se puede seguir el siguiente esquema:

import tensorflow as tf

class MiModeloPersonalizado(tf.keras.Model):
    def __init__(self):
        super(MiModeloPersonalizado, self).__init__()
        self.capa_densa1 = tf.keras.layers.Dense(64, activation='relu')
        self.capa_densa2 = tf.keras.layers.Dense(10)

    def call(self, entradas):
        x = self.capa_densa1(entradas)
        return self.capa_densa2(x)

En este ejemplo, hemos definido una clase MiModeloPersonalizado que hereda de tf.keras.Model. Hemos inicializado dos capas densas en el método __init__ y hemos especificado cómo se conectan en el método call.

La API de subclases es especialmente útil cuando se necesita implementar modelos con comportamientos no lineales o que incluyen operaciones personalizadas en el flujo de datos. Por ejemplo, si se desea incorporar un bucle recurrente, condiciones lógicas o capas personalizadas, este enfoque es el más adecuado.

Es importante destacar que, al utilizar esta API, se tiene que gestionar manualmente el rastreo de las variables y las capas, ya que Keras no puede inferir automáticamente la arquitectura del modelo. Sin embargo, esto permite un control completo sobre el modelo y es ideal para experimentación avanzada y prototipado de nuevas arquitecturas.

A continuación, se muestra cómo instanciar y compilar el modelo personalizado:

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

Al igual que con los modelos estándar, se puede entrenar el modelo utilizando el método fit:

# Supongamos que tenemos datos de entrenamiento en las variables 'x_entrenamiento' y 'y_entrenamiento'
modelo.fit(x_entrenamiento, y_entrenamiento, epochs=10, batch_size=32)

La API de subclases de modelos ofrece una manera poderosa de crear modelos sofisticados que requieren una estructura más compleja de lo que permiten las APIs secuencial y funcional. Es una herramienta esencial para investigadores y desarrolladores que trabajan en soluciones de aprendizaje profundo de última generación.

Crear clase completa que herede de Model

Para construir modelos totalmente personalizados en Keras, es posible crear una clase que herede de tf.keras.Model. Esto permite definir arquitecturas con comportamientos específicos y operaciones personalizadas que no son posibles con las APIs secuencial o funcional.

A continuación, se muestra cómo crear una clase completa que hereda de Model, incluyendo la definición de capas, la ejecución del paso adelante (forward pass) y la inclusión de métodos adicionales para entrenamiento y evaluación.

import tensorflow as tf

class ModeloPersonalizado(tf.keras.Model):
    def __init__(self, unidades_ocultas):
        super(ModeloPersonalizado, self).__init__()
        self.capa_entrada = tf.keras.layers.InputLayer(input_shape=(784,))
        self.capa_oculta = tf.keras.layers.Dense(unidades_ocultas, activation='relu')
        self.capa_salida = tf.keras.layers.Dense(10, activation='softmax')

    def call(self, entradas, entrenamiento=False):
        x = self.capa_entrada(entradas)
        x = self.capa_oculta(x)
        if entrenamiento:
            x = tf.nn.dropout(x, rate=0.5)
        return self.capa_salida(x)

    def entrenar(self, datos_entrenamiento, datos_validacion, epocas, batch_size):
        optimizador = tf.keras.optimizers.Adam()
        perdida = tf.keras.losses.SparseCategoricalCrossentropy()
        metrica = tf.keras.metrics.SparseCategoricalAccuracy()

        dataset = tf.data.Dataset.from_tensor_slices(datos_entrenamiento)
        dataset = dataset.shuffle(buffer_size=1024).batch(batch_size)

        for epoca in range(epocas):
            for batch_x, batch_y in dataset:
                with tf.GradientTape() as tape:
                    predicciones = self.call(batch_x, entrenamiento=True)
                    perdida_batch = perdida(batch_y, predicciones)
                gradientes = tape.gradient(perdida_batch, self.trainable_variables)
                optimizador.apply_gradients(zip(gradientes, self.trainable_variables))
            print(f'Epoca {epoca+1} completada')

        # Evaluación en datos de validación
        x_val, y_val = datos_validacion
        pred_val = self.call(x_val)
        exactitud = metrica(y_val, pred_val)
        print(f'Exactitud en validación: {exactitud.numpy()}')

    def evaluar(self, datos_prueba):
        x_test, y_test = datos_prueba
        pred_test = self.call(x_test)
        metrica = tf.keras.metrics.SparseCategoricalAccuracy()
        exactitud = metrica(y_test, pred_test)
        print(f'Exactitud en prueba: {exactitud.numpy()}')

En este ejemplo, se ha creado una clase ModeloPersonalizado que hereda de tf.keras.Model. La clase incluye:

  • Constructor __init__: donde se definen las capas del modelo.
  • Método call: que controla el flujo de datos a través del modelo. Incluye un parámetro entrenamiento para habilitar comportamientos específicos durante el entrenamiento, como la aplicación de dropout.
  • Método entrenar: que implementa el bucle de entrenamiento personalizado utilizando un optimizador, una función de pérdida y métricas.
  • Método evaluar: para evaluar el desempeño del modelo en datos de prueba.

Es importante destacar la flexibilidad que ofrece este enfoque. Al definir métodos como entrenar y evaluar, se tiene un control total sobre el proceso de optimización, permitiendo personalizar aspectos como el cálculo de gradientes, actualizaciones de parámetros y registro de métricas.

Para utilizar este modelo, se puede instanciar y llamar a los métodos personalizados:

# Supongamos que x_train, y_train, x_val, y_val, x_test, y_test ya están preprocesados y disponibles
modelo = ModeloPersonalizado(unidades_ocultas=128)

# Entrenamiento del modelo
modelo.entrenar(
    datos_entrenamiento=(x_train, y_train),
    datos_validacion=(x_val, y_val),
    epocas=10,
    batch_size=32
)

# Evaluación del modelo
modelo.evaluar(datos_prueba=(x_test, y_test))

Al crear una clase que hereda de Model, se pueden incorporar comportamientos avanzados y estructuras complejas en el modelo. Por ejemplo, se pueden agregar mecanismos de atención, rutas condicionales o capas recurrentes con estados personalizados.

Además, este enfoque facilita la implementación de técnicas de aprendizaje automático más sofisticadas, como el aprendizaje por refuerzo, donde es necesario controlar directamente el proceso de entrenamiento y la interacción con el entorno.

Otra ventaja es la posibilidad de integrar capas personalizadas y operaciones matemáticas avanzadas directamente en el flujo del modelo:

class ModeloAvanzado(tf.keras.Model):
    def __init__(self):
        super(ModeloAvanzado, self).__init__()
        self.capa_conv = tf.keras.layers.Conv2D(32, kernel_size=3, activation='relu')
        self.capa_pool = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))
        self.capa_gru = tf.keras.layers.GRU(64)
        self.capa_salida = tf.keras.layers.Dense(1, activation='sigmoid')

    def call(self, entradas):
        x = self.capa_conv(entradas)
        x = self.capa_pool(x)
        x = tf.reshape(x, (x.shape[0], -1, x.shape[-1]))
        x = self.capa_gru(x)
        return self.capa_salida(x)

En este caso, ModeloAvanzado combina capas convolucionales, de pooling y una capa GRU recurrente. Esto muestra cómo se pueden construir arquitecturas complejas al heredar de Model.

Finalmente, la creación de clases completas que heredan de Model es esencial para proyectos que requieren una personalización extrema y donde las arquitecturas estándar no son suficientes. Este enfoque es fundamental para desarrollar modelos de investigación y soluciones innovadoras en el campo del aprendizaje profundo.

¿Qué ventajas aporta crear subclases de modelos vs. las APIs secuencial y funcional?

Crear subclases de modelos en Keras, heredando de tf.keras.Model, ofrece una flexibilidad superior que va más allá de lo que permiten las APIs secuencial y funcional. Este enfoque es especialmente útil para arquitecturas personalizadas y aplicaciones avanzadas que requieren comportamientos dinámicos y adaptativos.

Control total sobre el método call

Una de las principales ventajas de las subclases de modelos es el control absoluto sobre el método call. Esto permite implementar lógicas complejas que incluyen:

  • Bucles personalizados.
  • Condiciones adaptativas.
  • Operaciones dinámicas.

Esta flexibilidad es esencial en modelos que deben adaptarse en tiempo de ejecución según los datos de entrada, una capacidad que las APIs secuencial y funcional no pueden ofrecer.

Ideal para investigación y desarrollo

El enfoque de subclasificación es perfecto para la experimentación, ya que permite:

  • Diseñar arquitecturas innovadoras sin restricciones predefinidas.
  • Incorporar conectividades inusuales o mecanismos no lineales.
  • Desarrollar nuevas técnicas de aprendizaje que requieran personalización.

Esto la convierte en una herramienta valiosa para investigadores que exploran modelos más allá de las arquitecturas estándar.

Manejo de datos de entrada variables

En aplicaciones como el procesamiento de secuencias de longitud variable o el análisis de grafos, las subclases de modelos sobresalen debido a su capacidad para:

  • Adaptarse dinámicamente a diferentes estructuras de datos.
  • Procesar entradas no uniformes sin complicaciones adicionales.

Integración de operaciones personalizadas

Las subclases permiten incorporar fácilmente:

  • Capas definidas por el usuario.
  • Funciones de pérdida personalizadas.
  • Mecanismos de regularización específicos.

Esto es crucial para proyectos que requieren una personalización completa. Por ejemplo, se puede implementar un modelo con atención personalizada:

import tensorflow as tf

class ModeloConAtencion(tf.keras.Model):
    def __init__(self):
        super(ModeloConAtencion, self).__init__()
        self.embedding = tf.keras.layers.Embedding(input_dim=1000, output_dim=64)
        self.lstm = tf.keras.layers.LSTM(128, return_sequences=True)
        self.atencion = tf.keras.layers.Attention()
        self.densa = tf.keras.layers.Dense(1, activation='sigmoid')

    def call(self, entradas):
        x = self.embedding(entradas)
        x = self.lstm(x)
        contexto = self.atencion([x, x])
        salida = self.densa(contexto)
        return salida

En este ejemplo:

  • Se implementa un mecanismo de atención que procesa información contextual.
  • El flujo de datos puede ser diseñado específicamente para las necesidades del modelo.

Depuración y comprensión del modelo

La subclasificación facilita la inspección y modificación de cada paso del flujo de datos. Esto es especialmente valioso en:

  • Proyectos complejos, donde es fundamental entender cómo y por qué el modelo toma decisiones.
  • Entornos de depuración, donde cada paso puede ser ajustado individualmente.

Capacidad para técnicas avanzadas

Con subclases de modelos, se pueden explorar áreas avanzadas del aprendizaje profundo, como:

  • Aprendizaje meta, donde el modelo adapta su arquitectura o parámetros durante el entrenamiento.
  • Modelos con comportamientos evolutivos que se ajustan a datos cambiantes.

Comparación con las APIs secuencial y funcional

  • API secuencial: Ideal para arquitecturas simples con un flujo lineal de capas. No permite personalización dinámica.
  • API funcional: Más flexible que la secuencial, permite grafos computacionales complejos, pero sigue limitada a configuraciones más estructuradas.
  • Subclases de modelos: Ofrecen control completo, permitiendo arquitecturas y comportamientos altamente personalizados.
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

  • Comprender la flexibilidad de las subclases en la creación de modelos personalizados.
  • Aprender a definir capas y la lógica de propagación hacia adelante mediante __init__ y call.
  • Implementar bucles de entrenamiento y evaluación personalizados.
  • Explorar arquitecturas dinámicas y condicionales para tareas complejas.
  • Conocer las ventajas de las subclases frente a las APIs secuencial y funcional.