Subclases de modelos

Avanzado
TensorFlow
TensorFlow
Actualizado: 07/01/2025

¡Desbloquea el curso de TensorFlow completo!

IA
Ejercicios
Certificado
Entrar

Mira la lección en vídeo

Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.

Desbloquear Plan Plus

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.

Guarda tu progreso

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

¿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.

Aprendizajes de esta lección de TensorFlow

  • 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.

Completa este curso de TensorFlow y certifícate

Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración