Menu iconMenu icon
Aprendizaje Profundo Generativo Edición Actualizada

Capítulo 10: Proyecto: Generación de Imágenes con Modelos de Difusión

10.2 Creación del Modelo

Crear un modelo de difusión para la generación de imágenes implica diseñar e implementar una arquitectura de red neuronal capaz de aprender el proceso de eliminación de ruido. En esta sección, construiremos un modelo de difusión paso a paso, incluyendo la capa de adición de ruido, la red de eliminación de ruido y la codificación de pasos. También compilaremos el modelo con un optimizador y una función de pérdida adecuados.

10.2.1 Capa de Adición de Ruido

La capa de adición de ruido simula el proceso de difusión hacia adelante al agregar ruido gaussiano a las imágenes de entrada en cada paso. Esta capa se utilizará tanto durante el entrenamiento como en la inferencia para transformar progresivamente las imágenes en una distribución de ruido.

Ejemplo: Capa de Adición de Ruido

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

class NoiseAddition(Layer):
    def __init__(self, noise_scale=0.1, **kwargs):
        super(NoiseAddition, self).__init__(**kwargs)
        self.noise_scale = noise_scale

    def call(self, inputs, training=None):
        if training:
            noise = tf.random.normal(shape=tf.shape(inputs), mean=0.0, stddev=self.noise_scale, dtype=tf.float32)
            return inputs + noise
        return inputs

# Example usage with a batch of images
noise_layer = NoiseAddition(noise_scale=0.1)
noisy_images = noise_layer(train_images[:10], training=True)

# Plot original and noisy images for comparison
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 4))
for i in range(10):
    plt.subplot(2, 10, i + 1)
    plt.imshow((train_images[i] * 0.5) + 0.5)
    plt.axis('off')
    plt.subplot(2, 10, i + 11)
    plt.imshow((noisy_images[i] * 0.5) + 0.5)
    plt.axis('off')
plt.show()

Este código utiliza la biblioteca TensorFlow para definir una clase de capa personalizada llamada NoiseAddition. Esta clase añade ruido aleatorio a sus datos de entrada, pero solo cuando está en modo de entrenamiento. El ruido tiene una distribución normal con una media de 0 y una desviación estándar especificada por noise_scale. El método call verifica si la capa está en modo de entrenamiento y, si es así, añade el ruido a los datos de entrada.

El código luego demuestra cómo usar la capa NoiseAddition creando una instancia de ella, aplicándola a un lote de imágenes de entrenamiento y almacenando las imágenes ruidosas. Luego, traza las imágenes originales y ruidosas para compararlas utilizando la biblioteca matplotlib.

10.2.2 Red de Eliminación de Ruido

La red de eliminación de ruido es el componente central del modelo de difusión. Predice y elimina el ruido añadido a las imágenes en cada paso. Utilizaremos una Red Neuronal Convolucional (CNN) para este propósito, ya que las CNN son muy adecuadas para tareas de procesamiento de imágenes.

Ejemplo: Red de Eliminación de Ruido

from tensorflow.keras.layers import Conv2D, BatchNormalization, LeakyReLU, UpSampling2D

def build_denoising_network(input_shape):
    """
    Builds a denoising network using a Convolutional Neural Network (CNN).

    Parameters:
    - input_shape: Shape of the input images.

    Returns:
    - A Keras model for denoising.
    """
    inputs = Input(shape=input_shape)

    # Encoder
    x = Conv2D(64, (3, 3), padding='same')(inputs)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    x = Conv2D(128, (3, 3), padding='same', strides=2)(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    # Bottleneck
    x = Conv2D(256, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    # Decoder
    x = UpSampling2D()(x)
    x = Conv2D(128, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    x = Conv2D(64, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    outputs = Conv2D(3, (3, 3), padding='same', activation='tanh')(x)
    return Model(inputs, outputs)

# Example usage with CIFAR-10 image shape
input_shape = (32, 32, 3)
denoising_network = build_denoising_network(input_shape)
denoising_network.summary()

Este código define una función que construye una Red Neuronal Convolucional (CNN) para eliminar el ruido de las imágenes. Utiliza Keras, una biblioteca de aprendizaje automático en Python.

La red se divide en tres partes: codificador, cuello de botella y decodificador.

El codificador reduce las dimensiones espaciales de la entrada mientras aumenta la profundidad. El cuello de botella es la capa más profunda, donde la imagen se comprime. El decodificador luego reconstruye la imagen a partir de la representación comprimida, con el objetivo de eliminar el ruido mientras se conserva la información original.

Luego, la función se usa para construir una red de eliminación de ruido para imágenes con forma (32, 32, 3), que es la forma de las imágenes en el conjunto de datos CIFAR-10, y se imprime la estructura de la red construida.

10.2.3 Codificación de Pasos

La codificación de pasos se utiliza para proporcionar a la red de eliminación de ruido información sobre el paso temporal actual del proceso de difusión. Esto ayuda a la red a entender el nivel de ruido en las imágenes de entrada y hacer predicciones precisas. Utilizaremos la codificación sinusoidal para este propósito.

Ejemplo: Codificación de Pasos

def sinusoidal_step_encoding(t, d_model):
    """
    Computes sinusoidal step encoding.

    Parameters:
    - t: Current time step.
    - d_model: Dimensionality of the model.

    Returns:
    - Sinusoidal step encoding vector.
    """
    angle_rates = 1 / np.power(10000, (2 * (np.arange(d_model) // 2)) / np.float32(d_model))
    angle_rads = t * angle_rates
    angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])
    angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])
    return angle_rads

# Example usage with a specific time step and model dimensionality
t = np.arange(10).reshape(-1, 1)
d_model = 128
step_encoding = sinusoidal_step_encoding(t, d_model)

# Print the step encoding
print(step_encoding)

Este código define una función llamada sinusoidal_step_encoding, que calcula una codificación de paso sinusoidal. Esta es una técnica utilizada a menudo en el procesamiento del lenguaje natural para codificar la posición de las palabras en una oración.

La función toma dos parámetros:

  • t (el paso temporal actual),
  • d_model (la dimensionalidad del modelo).

Luego calcula angle_rates y angle_rads, aplicando seno a los índices pares y coseno a los índices impares en el array angle_rads. Esto crea un patrón de ondas sinusoidales y cosenoidales que proporciona codificaciones únicas para diferentes posiciones en una secuencia.

La parte inferior del código proporciona un ejemplo de cómo usar esta función. Crea un array de numpy t con un rango de 0 a 9 (reformado en un vector columna), establece d_model en 128, usa estos valores para calcular la codificación de paso y luego imprime el resultado.

10.2.4 Modelo Completo de Difusión

Combinando la capa de adición de ruido, la red de eliminación de ruido y la codificación de pasos, podemos construir el modelo completo de difusión. Este modelo eliminará iterativamente el ruido de las imágenes de entrada, guiado por la codificación de pasos y la función de pérdida.

Ejemplo: Modelo Completo de Difusión

from tensorflow.keras.layers import Input, Concatenate

def build_full_diffusion_model(input_shape, d_model):
    """
    Builds the full diffusion model.

    Parameters:
    - input_shape: Shape of the input images.
    - d_model: Dimensionality of the model.

    Returns:
    - A Keras model for the full diffusion process.
    """
    # Input layers for images and step encoding
    image_input = Input(shape=input_shape)
    step_input = Input(shape=(d_model,))

    # Apply noise addition layer
    noisy_images = NoiseAddition()(image_input)

    # Flatten and concatenate inputs
    x = Conv2D(64, (3, 3), padding='same')(noisy_images)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    step_embedding = Dense(np.prod(input_shape))(step_input)
    step_embedding = Reshape(input_shape)(step_embedding)
    x = Concatenate()([x, step_embedding])

    # Apply denoising network
    denoised_images = build_denoising_network(input_shape)(x)

    return Model([image_input, step_input], denoised_images)

# Example usage with CIFAR-10 image shape
input_shape = (32, 32, 3)
d_model = 128
diffusion_model = build_full_diffusion_model(input_shape, d_model)
diffusion_model.summary()

Este fragmento de código define una función para construir el modelo completo de difusión utilizando Keras. Este modelo se usa en el aprendizaje automático para tareas como la eliminación de ruido en imágenes. La función toma la forma de las imágenes de entrada y la dimensionalidad del modelo como argumentos. Primero crea capas de entrada para las imágenes y la codificación de pasos.

Luego, añade ruido a las imágenes, las aplana y concatena las entradas. La red de eliminación de ruido se aplica a las imágenes ruidosas. La función devuelve el modelo construido.

10.2.5 Compilación del Modelo

Para compilar el modelo de difusión, necesitamos especificar un optimizador y una función de pérdida. La función de pérdida de error cuadrático medio (MSE) se usa comúnmente para entrenar modelos de difusión, ya que mide la diferencia entre el ruido predicho y el ruido real.

Ejemplo: Compilación del Modelo

from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import MeanSquaredError

# Compile the diffusion model
diffusion_model.compile(optimizer=Adam(learning_rate=1e-4), loss=MeanSquaredError())

# Print the model summary
diffusion_model.summary()

El código utiliza las bibliotecas Tensorflow y Keras. Se usa para compilar un modelo de aprendizaje automático llamado diffusion_model con configuraciones específicas. Se selecciona el algoritmo de optimización Adam con una tasa de aprendizaje de 0.0001. La función de pérdida, que mide el rendimiento del modelo, se establece en el error cuadrático medio (MSE). Después de establecer estas configuraciones, se compila el modelo y se imprime el resumen de la arquitectura del modelo.

Resumen

En esta sección, creamos con éxito el modelo de difusión para nuestro proyecto de generación de imágenes. Comenzamos implementando la capa de adición de ruido, que simula el proceso de difusión hacia adelante. A continuación, construimos una red de eliminación de ruido utilizando una red neuronal convolucional (CNN) para predecir y eliminar el ruido de las imágenes. También implementamos la codificación de pasos para proporcionar información temporal a la red de eliminación de ruido.

Combinando estos componentes, construimos el modelo de difusión completo, que elimina iterativamente el ruido de las imágenes de entrada. Finalmente, compilamos el modelo con un optimizador y una función de pérdida apropiados, preparándolo para el entrenamiento.

Con nuestro modelo listo, podemos pasar al siguiente paso: entrenar el modelo de difusión con los datos preparados. En las siguientes secciones, entrenaremos el modelo, generaremos imágenes y evaluaremos su rendimiento, proporcionando una comprensión completa de cómo aplicar modelos de difusión a tareas de generación de imágenes en el mundo real.

10.2 Creación del Modelo

Crear un modelo de difusión para la generación de imágenes implica diseñar e implementar una arquitectura de red neuronal capaz de aprender el proceso de eliminación de ruido. En esta sección, construiremos un modelo de difusión paso a paso, incluyendo la capa de adición de ruido, la red de eliminación de ruido y la codificación de pasos. También compilaremos el modelo con un optimizador y una función de pérdida adecuados.

10.2.1 Capa de Adición de Ruido

La capa de adición de ruido simula el proceso de difusión hacia adelante al agregar ruido gaussiano a las imágenes de entrada en cada paso. Esta capa se utilizará tanto durante el entrenamiento como en la inferencia para transformar progresivamente las imágenes en una distribución de ruido.

Ejemplo: Capa de Adición de Ruido

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

class NoiseAddition(Layer):
    def __init__(self, noise_scale=0.1, **kwargs):
        super(NoiseAddition, self).__init__(**kwargs)
        self.noise_scale = noise_scale

    def call(self, inputs, training=None):
        if training:
            noise = tf.random.normal(shape=tf.shape(inputs), mean=0.0, stddev=self.noise_scale, dtype=tf.float32)
            return inputs + noise
        return inputs

# Example usage with a batch of images
noise_layer = NoiseAddition(noise_scale=0.1)
noisy_images = noise_layer(train_images[:10], training=True)

# Plot original and noisy images for comparison
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 4))
for i in range(10):
    plt.subplot(2, 10, i + 1)
    plt.imshow((train_images[i] * 0.5) + 0.5)
    plt.axis('off')
    plt.subplot(2, 10, i + 11)
    plt.imshow((noisy_images[i] * 0.5) + 0.5)
    plt.axis('off')
plt.show()

Este código utiliza la biblioteca TensorFlow para definir una clase de capa personalizada llamada NoiseAddition. Esta clase añade ruido aleatorio a sus datos de entrada, pero solo cuando está en modo de entrenamiento. El ruido tiene una distribución normal con una media de 0 y una desviación estándar especificada por noise_scale. El método call verifica si la capa está en modo de entrenamiento y, si es así, añade el ruido a los datos de entrada.

El código luego demuestra cómo usar la capa NoiseAddition creando una instancia de ella, aplicándola a un lote de imágenes de entrenamiento y almacenando las imágenes ruidosas. Luego, traza las imágenes originales y ruidosas para compararlas utilizando la biblioteca matplotlib.

10.2.2 Red de Eliminación de Ruido

La red de eliminación de ruido es el componente central del modelo de difusión. Predice y elimina el ruido añadido a las imágenes en cada paso. Utilizaremos una Red Neuronal Convolucional (CNN) para este propósito, ya que las CNN son muy adecuadas para tareas de procesamiento de imágenes.

Ejemplo: Red de Eliminación de Ruido

from tensorflow.keras.layers import Conv2D, BatchNormalization, LeakyReLU, UpSampling2D

def build_denoising_network(input_shape):
    """
    Builds a denoising network using a Convolutional Neural Network (CNN).

    Parameters:
    - input_shape: Shape of the input images.

    Returns:
    - A Keras model for denoising.
    """
    inputs = Input(shape=input_shape)

    # Encoder
    x = Conv2D(64, (3, 3), padding='same')(inputs)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    x = Conv2D(128, (3, 3), padding='same', strides=2)(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    # Bottleneck
    x = Conv2D(256, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    # Decoder
    x = UpSampling2D()(x)
    x = Conv2D(128, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    x = Conv2D(64, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    outputs = Conv2D(3, (3, 3), padding='same', activation='tanh')(x)
    return Model(inputs, outputs)

# Example usage with CIFAR-10 image shape
input_shape = (32, 32, 3)
denoising_network = build_denoising_network(input_shape)
denoising_network.summary()

Este código define una función que construye una Red Neuronal Convolucional (CNN) para eliminar el ruido de las imágenes. Utiliza Keras, una biblioteca de aprendizaje automático en Python.

La red se divide en tres partes: codificador, cuello de botella y decodificador.

El codificador reduce las dimensiones espaciales de la entrada mientras aumenta la profundidad. El cuello de botella es la capa más profunda, donde la imagen se comprime. El decodificador luego reconstruye la imagen a partir de la representación comprimida, con el objetivo de eliminar el ruido mientras se conserva la información original.

Luego, la función se usa para construir una red de eliminación de ruido para imágenes con forma (32, 32, 3), que es la forma de las imágenes en el conjunto de datos CIFAR-10, y se imprime la estructura de la red construida.

10.2.3 Codificación de Pasos

La codificación de pasos se utiliza para proporcionar a la red de eliminación de ruido información sobre el paso temporal actual del proceso de difusión. Esto ayuda a la red a entender el nivel de ruido en las imágenes de entrada y hacer predicciones precisas. Utilizaremos la codificación sinusoidal para este propósito.

Ejemplo: Codificación de Pasos

def sinusoidal_step_encoding(t, d_model):
    """
    Computes sinusoidal step encoding.

    Parameters:
    - t: Current time step.
    - d_model: Dimensionality of the model.

    Returns:
    - Sinusoidal step encoding vector.
    """
    angle_rates = 1 / np.power(10000, (2 * (np.arange(d_model) // 2)) / np.float32(d_model))
    angle_rads = t * angle_rates
    angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])
    angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])
    return angle_rads

# Example usage with a specific time step and model dimensionality
t = np.arange(10).reshape(-1, 1)
d_model = 128
step_encoding = sinusoidal_step_encoding(t, d_model)

# Print the step encoding
print(step_encoding)

Este código define una función llamada sinusoidal_step_encoding, que calcula una codificación de paso sinusoidal. Esta es una técnica utilizada a menudo en el procesamiento del lenguaje natural para codificar la posición de las palabras en una oración.

La función toma dos parámetros:

  • t (el paso temporal actual),
  • d_model (la dimensionalidad del modelo).

Luego calcula angle_rates y angle_rads, aplicando seno a los índices pares y coseno a los índices impares en el array angle_rads. Esto crea un patrón de ondas sinusoidales y cosenoidales que proporciona codificaciones únicas para diferentes posiciones en una secuencia.

La parte inferior del código proporciona un ejemplo de cómo usar esta función. Crea un array de numpy t con un rango de 0 a 9 (reformado en un vector columna), establece d_model en 128, usa estos valores para calcular la codificación de paso y luego imprime el resultado.

10.2.4 Modelo Completo de Difusión

Combinando la capa de adición de ruido, la red de eliminación de ruido y la codificación de pasos, podemos construir el modelo completo de difusión. Este modelo eliminará iterativamente el ruido de las imágenes de entrada, guiado por la codificación de pasos y la función de pérdida.

Ejemplo: Modelo Completo de Difusión

from tensorflow.keras.layers import Input, Concatenate

def build_full_diffusion_model(input_shape, d_model):
    """
    Builds the full diffusion model.

    Parameters:
    - input_shape: Shape of the input images.
    - d_model: Dimensionality of the model.

    Returns:
    - A Keras model for the full diffusion process.
    """
    # Input layers for images and step encoding
    image_input = Input(shape=input_shape)
    step_input = Input(shape=(d_model,))

    # Apply noise addition layer
    noisy_images = NoiseAddition()(image_input)

    # Flatten and concatenate inputs
    x = Conv2D(64, (3, 3), padding='same')(noisy_images)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    step_embedding = Dense(np.prod(input_shape))(step_input)
    step_embedding = Reshape(input_shape)(step_embedding)
    x = Concatenate()([x, step_embedding])

    # Apply denoising network
    denoised_images = build_denoising_network(input_shape)(x)

    return Model([image_input, step_input], denoised_images)

# Example usage with CIFAR-10 image shape
input_shape = (32, 32, 3)
d_model = 128
diffusion_model = build_full_diffusion_model(input_shape, d_model)
diffusion_model.summary()

Este fragmento de código define una función para construir el modelo completo de difusión utilizando Keras. Este modelo se usa en el aprendizaje automático para tareas como la eliminación de ruido en imágenes. La función toma la forma de las imágenes de entrada y la dimensionalidad del modelo como argumentos. Primero crea capas de entrada para las imágenes y la codificación de pasos.

Luego, añade ruido a las imágenes, las aplana y concatena las entradas. La red de eliminación de ruido se aplica a las imágenes ruidosas. La función devuelve el modelo construido.

10.2.5 Compilación del Modelo

Para compilar el modelo de difusión, necesitamos especificar un optimizador y una función de pérdida. La función de pérdida de error cuadrático medio (MSE) se usa comúnmente para entrenar modelos de difusión, ya que mide la diferencia entre el ruido predicho y el ruido real.

Ejemplo: Compilación del Modelo

from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import MeanSquaredError

# Compile the diffusion model
diffusion_model.compile(optimizer=Adam(learning_rate=1e-4), loss=MeanSquaredError())

# Print the model summary
diffusion_model.summary()

El código utiliza las bibliotecas Tensorflow y Keras. Se usa para compilar un modelo de aprendizaje automático llamado diffusion_model con configuraciones específicas. Se selecciona el algoritmo de optimización Adam con una tasa de aprendizaje de 0.0001. La función de pérdida, que mide el rendimiento del modelo, se establece en el error cuadrático medio (MSE). Después de establecer estas configuraciones, se compila el modelo y se imprime el resumen de la arquitectura del modelo.

Resumen

En esta sección, creamos con éxito el modelo de difusión para nuestro proyecto de generación de imágenes. Comenzamos implementando la capa de adición de ruido, que simula el proceso de difusión hacia adelante. A continuación, construimos una red de eliminación de ruido utilizando una red neuronal convolucional (CNN) para predecir y eliminar el ruido de las imágenes. También implementamos la codificación de pasos para proporcionar información temporal a la red de eliminación de ruido.

Combinando estos componentes, construimos el modelo de difusión completo, que elimina iterativamente el ruido de las imágenes de entrada. Finalmente, compilamos el modelo con un optimizador y una función de pérdida apropiados, preparándolo para el entrenamiento.

Con nuestro modelo listo, podemos pasar al siguiente paso: entrenar el modelo de difusión con los datos preparados. En las siguientes secciones, entrenaremos el modelo, generaremos imágenes y evaluaremos su rendimiento, proporcionando una comprensión completa de cómo aplicar modelos de difusión a tareas de generación de imágenes en el mundo real.

10.2 Creación del Modelo

Crear un modelo de difusión para la generación de imágenes implica diseñar e implementar una arquitectura de red neuronal capaz de aprender el proceso de eliminación de ruido. En esta sección, construiremos un modelo de difusión paso a paso, incluyendo la capa de adición de ruido, la red de eliminación de ruido y la codificación de pasos. También compilaremos el modelo con un optimizador y una función de pérdida adecuados.

10.2.1 Capa de Adición de Ruido

La capa de adición de ruido simula el proceso de difusión hacia adelante al agregar ruido gaussiano a las imágenes de entrada en cada paso. Esta capa se utilizará tanto durante el entrenamiento como en la inferencia para transformar progresivamente las imágenes en una distribución de ruido.

Ejemplo: Capa de Adición de Ruido

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

class NoiseAddition(Layer):
    def __init__(self, noise_scale=0.1, **kwargs):
        super(NoiseAddition, self).__init__(**kwargs)
        self.noise_scale = noise_scale

    def call(self, inputs, training=None):
        if training:
            noise = tf.random.normal(shape=tf.shape(inputs), mean=0.0, stddev=self.noise_scale, dtype=tf.float32)
            return inputs + noise
        return inputs

# Example usage with a batch of images
noise_layer = NoiseAddition(noise_scale=0.1)
noisy_images = noise_layer(train_images[:10], training=True)

# Plot original and noisy images for comparison
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 4))
for i in range(10):
    plt.subplot(2, 10, i + 1)
    plt.imshow((train_images[i] * 0.5) + 0.5)
    plt.axis('off')
    plt.subplot(2, 10, i + 11)
    plt.imshow((noisy_images[i] * 0.5) + 0.5)
    plt.axis('off')
plt.show()

Este código utiliza la biblioteca TensorFlow para definir una clase de capa personalizada llamada NoiseAddition. Esta clase añade ruido aleatorio a sus datos de entrada, pero solo cuando está en modo de entrenamiento. El ruido tiene una distribución normal con una media de 0 y una desviación estándar especificada por noise_scale. El método call verifica si la capa está en modo de entrenamiento y, si es así, añade el ruido a los datos de entrada.

El código luego demuestra cómo usar la capa NoiseAddition creando una instancia de ella, aplicándola a un lote de imágenes de entrenamiento y almacenando las imágenes ruidosas. Luego, traza las imágenes originales y ruidosas para compararlas utilizando la biblioteca matplotlib.

10.2.2 Red de Eliminación de Ruido

La red de eliminación de ruido es el componente central del modelo de difusión. Predice y elimina el ruido añadido a las imágenes en cada paso. Utilizaremos una Red Neuronal Convolucional (CNN) para este propósito, ya que las CNN son muy adecuadas para tareas de procesamiento de imágenes.

Ejemplo: Red de Eliminación de Ruido

from tensorflow.keras.layers import Conv2D, BatchNormalization, LeakyReLU, UpSampling2D

def build_denoising_network(input_shape):
    """
    Builds a denoising network using a Convolutional Neural Network (CNN).

    Parameters:
    - input_shape: Shape of the input images.

    Returns:
    - A Keras model for denoising.
    """
    inputs = Input(shape=input_shape)

    # Encoder
    x = Conv2D(64, (3, 3), padding='same')(inputs)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    x = Conv2D(128, (3, 3), padding='same', strides=2)(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    # Bottleneck
    x = Conv2D(256, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    # Decoder
    x = UpSampling2D()(x)
    x = Conv2D(128, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    x = Conv2D(64, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    outputs = Conv2D(3, (3, 3), padding='same', activation='tanh')(x)
    return Model(inputs, outputs)

# Example usage with CIFAR-10 image shape
input_shape = (32, 32, 3)
denoising_network = build_denoising_network(input_shape)
denoising_network.summary()

Este código define una función que construye una Red Neuronal Convolucional (CNN) para eliminar el ruido de las imágenes. Utiliza Keras, una biblioteca de aprendizaje automático en Python.

La red se divide en tres partes: codificador, cuello de botella y decodificador.

El codificador reduce las dimensiones espaciales de la entrada mientras aumenta la profundidad. El cuello de botella es la capa más profunda, donde la imagen se comprime. El decodificador luego reconstruye la imagen a partir de la representación comprimida, con el objetivo de eliminar el ruido mientras se conserva la información original.

Luego, la función se usa para construir una red de eliminación de ruido para imágenes con forma (32, 32, 3), que es la forma de las imágenes en el conjunto de datos CIFAR-10, y se imprime la estructura de la red construida.

10.2.3 Codificación de Pasos

La codificación de pasos se utiliza para proporcionar a la red de eliminación de ruido información sobre el paso temporal actual del proceso de difusión. Esto ayuda a la red a entender el nivel de ruido en las imágenes de entrada y hacer predicciones precisas. Utilizaremos la codificación sinusoidal para este propósito.

Ejemplo: Codificación de Pasos

def sinusoidal_step_encoding(t, d_model):
    """
    Computes sinusoidal step encoding.

    Parameters:
    - t: Current time step.
    - d_model: Dimensionality of the model.

    Returns:
    - Sinusoidal step encoding vector.
    """
    angle_rates = 1 / np.power(10000, (2 * (np.arange(d_model) // 2)) / np.float32(d_model))
    angle_rads = t * angle_rates
    angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])
    angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])
    return angle_rads

# Example usage with a specific time step and model dimensionality
t = np.arange(10).reshape(-1, 1)
d_model = 128
step_encoding = sinusoidal_step_encoding(t, d_model)

# Print the step encoding
print(step_encoding)

Este código define una función llamada sinusoidal_step_encoding, que calcula una codificación de paso sinusoidal. Esta es una técnica utilizada a menudo en el procesamiento del lenguaje natural para codificar la posición de las palabras en una oración.

La función toma dos parámetros:

  • t (el paso temporal actual),
  • d_model (la dimensionalidad del modelo).

Luego calcula angle_rates y angle_rads, aplicando seno a los índices pares y coseno a los índices impares en el array angle_rads. Esto crea un patrón de ondas sinusoidales y cosenoidales que proporciona codificaciones únicas para diferentes posiciones en una secuencia.

La parte inferior del código proporciona un ejemplo de cómo usar esta función. Crea un array de numpy t con un rango de 0 a 9 (reformado en un vector columna), establece d_model en 128, usa estos valores para calcular la codificación de paso y luego imprime el resultado.

10.2.4 Modelo Completo de Difusión

Combinando la capa de adición de ruido, la red de eliminación de ruido y la codificación de pasos, podemos construir el modelo completo de difusión. Este modelo eliminará iterativamente el ruido de las imágenes de entrada, guiado por la codificación de pasos y la función de pérdida.

Ejemplo: Modelo Completo de Difusión

from tensorflow.keras.layers import Input, Concatenate

def build_full_diffusion_model(input_shape, d_model):
    """
    Builds the full diffusion model.

    Parameters:
    - input_shape: Shape of the input images.
    - d_model: Dimensionality of the model.

    Returns:
    - A Keras model for the full diffusion process.
    """
    # Input layers for images and step encoding
    image_input = Input(shape=input_shape)
    step_input = Input(shape=(d_model,))

    # Apply noise addition layer
    noisy_images = NoiseAddition()(image_input)

    # Flatten and concatenate inputs
    x = Conv2D(64, (3, 3), padding='same')(noisy_images)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    step_embedding = Dense(np.prod(input_shape))(step_input)
    step_embedding = Reshape(input_shape)(step_embedding)
    x = Concatenate()([x, step_embedding])

    # Apply denoising network
    denoised_images = build_denoising_network(input_shape)(x)

    return Model([image_input, step_input], denoised_images)

# Example usage with CIFAR-10 image shape
input_shape = (32, 32, 3)
d_model = 128
diffusion_model = build_full_diffusion_model(input_shape, d_model)
diffusion_model.summary()

Este fragmento de código define una función para construir el modelo completo de difusión utilizando Keras. Este modelo se usa en el aprendizaje automático para tareas como la eliminación de ruido en imágenes. La función toma la forma de las imágenes de entrada y la dimensionalidad del modelo como argumentos. Primero crea capas de entrada para las imágenes y la codificación de pasos.

Luego, añade ruido a las imágenes, las aplana y concatena las entradas. La red de eliminación de ruido se aplica a las imágenes ruidosas. La función devuelve el modelo construido.

10.2.5 Compilación del Modelo

Para compilar el modelo de difusión, necesitamos especificar un optimizador y una función de pérdida. La función de pérdida de error cuadrático medio (MSE) se usa comúnmente para entrenar modelos de difusión, ya que mide la diferencia entre el ruido predicho y el ruido real.

Ejemplo: Compilación del Modelo

from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import MeanSquaredError

# Compile the diffusion model
diffusion_model.compile(optimizer=Adam(learning_rate=1e-4), loss=MeanSquaredError())

# Print the model summary
diffusion_model.summary()

El código utiliza las bibliotecas Tensorflow y Keras. Se usa para compilar un modelo de aprendizaje automático llamado diffusion_model con configuraciones específicas. Se selecciona el algoritmo de optimización Adam con una tasa de aprendizaje de 0.0001. La función de pérdida, que mide el rendimiento del modelo, se establece en el error cuadrático medio (MSE). Después de establecer estas configuraciones, se compila el modelo y se imprime el resumen de la arquitectura del modelo.

Resumen

En esta sección, creamos con éxito el modelo de difusión para nuestro proyecto de generación de imágenes. Comenzamos implementando la capa de adición de ruido, que simula el proceso de difusión hacia adelante. A continuación, construimos una red de eliminación de ruido utilizando una red neuronal convolucional (CNN) para predecir y eliminar el ruido de las imágenes. También implementamos la codificación de pasos para proporcionar información temporal a la red de eliminación de ruido.

Combinando estos componentes, construimos el modelo de difusión completo, que elimina iterativamente el ruido de las imágenes de entrada. Finalmente, compilamos el modelo con un optimizador y una función de pérdida apropiados, preparándolo para el entrenamiento.

Con nuestro modelo listo, podemos pasar al siguiente paso: entrenar el modelo de difusión con los datos preparados. En las siguientes secciones, entrenaremos el modelo, generaremos imágenes y evaluaremos su rendimiento, proporcionando una comprensión completa de cómo aplicar modelos de difusión a tareas de generación de imágenes en el mundo real.

10.2 Creación del Modelo

Crear un modelo de difusión para la generación de imágenes implica diseñar e implementar una arquitectura de red neuronal capaz de aprender el proceso de eliminación de ruido. En esta sección, construiremos un modelo de difusión paso a paso, incluyendo la capa de adición de ruido, la red de eliminación de ruido y la codificación de pasos. También compilaremos el modelo con un optimizador y una función de pérdida adecuados.

10.2.1 Capa de Adición de Ruido

La capa de adición de ruido simula el proceso de difusión hacia adelante al agregar ruido gaussiano a las imágenes de entrada en cada paso. Esta capa se utilizará tanto durante el entrenamiento como en la inferencia para transformar progresivamente las imágenes en una distribución de ruido.

Ejemplo: Capa de Adición de Ruido

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

class NoiseAddition(Layer):
    def __init__(self, noise_scale=0.1, **kwargs):
        super(NoiseAddition, self).__init__(**kwargs)
        self.noise_scale = noise_scale

    def call(self, inputs, training=None):
        if training:
            noise = tf.random.normal(shape=tf.shape(inputs), mean=0.0, stddev=self.noise_scale, dtype=tf.float32)
            return inputs + noise
        return inputs

# Example usage with a batch of images
noise_layer = NoiseAddition(noise_scale=0.1)
noisy_images = noise_layer(train_images[:10], training=True)

# Plot original and noisy images for comparison
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 4))
for i in range(10):
    plt.subplot(2, 10, i + 1)
    plt.imshow((train_images[i] * 0.5) + 0.5)
    plt.axis('off')
    plt.subplot(2, 10, i + 11)
    plt.imshow((noisy_images[i] * 0.5) + 0.5)
    plt.axis('off')
plt.show()

Este código utiliza la biblioteca TensorFlow para definir una clase de capa personalizada llamada NoiseAddition. Esta clase añade ruido aleatorio a sus datos de entrada, pero solo cuando está en modo de entrenamiento. El ruido tiene una distribución normal con una media de 0 y una desviación estándar especificada por noise_scale. El método call verifica si la capa está en modo de entrenamiento y, si es así, añade el ruido a los datos de entrada.

El código luego demuestra cómo usar la capa NoiseAddition creando una instancia de ella, aplicándola a un lote de imágenes de entrenamiento y almacenando las imágenes ruidosas. Luego, traza las imágenes originales y ruidosas para compararlas utilizando la biblioteca matplotlib.

10.2.2 Red de Eliminación de Ruido

La red de eliminación de ruido es el componente central del modelo de difusión. Predice y elimina el ruido añadido a las imágenes en cada paso. Utilizaremos una Red Neuronal Convolucional (CNN) para este propósito, ya que las CNN son muy adecuadas para tareas de procesamiento de imágenes.

Ejemplo: Red de Eliminación de Ruido

from tensorflow.keras.layers import Conv2D, BatchNormalization, LeakyReLU, UpSampling2D

def build_denoising_network(input_shape):
    """
    Builds a denoising network using a Convolutional Neural Network (CNN).

    Parameters:
    - input_shape: Shape of the input images.

    Returns:
    - A Keras model for denoising.
    """
    inputs = Input(shape=input_shape)

    # Encoder
    x = Conv2D(64, (3, 3), padding='same')(inputs)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    x = Conv2D(128, (3, 3), padding='same', strides=2)(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    # Bottleneck
    x = Conv2D(256, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    # Decoder
    x = UpSampling2D()(x)
    x = Conv2D(128, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    x = Conv2D(64, (3, 3), padding='same')(x)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)

    outputs = Conv2D(3, (3, 3), padding='same', activation='tanh')(x)
    return Model(inputs, outputs)

# Example usage with CIFAR-10 image shape
input_shape = (32, 32, 3)
denoising_network = build_denoising_network(input_shape)
denoising_network.summary()

Este código define una función que construye una Red Neuronal Convolucional (CNN) para eliminar el ruido de las imágenes. Utiliza Keras, una biblioteca de aprendizaje automático en Python.

La red se divide en tres partes: codificador, cuello de botella y decodificador.

El codificador reduce las dimensiones espaciales de la entrada mientras aumenta la profundidad. El cuello de botella es la capa más profunda, donde la imagen se comprime. El decodificador luego reconstruye la imagen a partir de la representación comprimida, con el objetivo de eliminar el ruido mientras se conserva la información original.

Luego, la función se usa para construir una red de eliminación de ruido para imágenes con forma (32, 32, 3), que es la forma de las imágenes en el conjunto de datos CIFAR-10, y se imprime la estructura de la red construida.

10.2.3 Codificación de Pasos

La codificación de pasos se utiliza para proporcionar a la red de eliminación de ruido información sobre el paso temporal actual del proceso de difusión. Esto ayuda a la red a entender el nivel de ruido en las imágenes de entrada y hacer predicciones precisas. Utilizaremos la codificación sinusoidal para este propósito.

Ejemplo: Codificación de Pasos

def sinusoidal_step_encoding(t, d_model):
    """
    Computes sinusoidal step encoding.

    Parameters:
    - t: Current time step.
    - d_model: Dimensionality of the model.

    Returns:
    - Sinusoidal step encoding vector.
    """
    angle_rates = 1 / np.power(10000, (2 * (np.arange(d_model) // 2)) / np.float32(d_model))
    angle_rads = t * angle_rates
    angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])
    angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])
    return angle_rads

# Example usage with a specific time step and model dimensionality
t = np.arange(10).reshape(-1, 1)
d_model = 128
step_encoding = sinusoidal_step_encoding(t, d_model)

# Print the step encoding
print(step_encoding)

Este código define una función llamada sinusoidal_step_encoding, que calcula una codificación de paso sinusoidal. Esta es una técnica utilizada a menudo en el procesamiento del lenguaje natural para codificar la posición de las palabras en una oración.

La función toma dos parámetros:

  • t (el paso temporal actual),
  • d_model (la dimensionalidad del modelo).

Luego calcula angle_rates y angle_rads, aplicando seno a los índices pares y coseno a los índices impares en el array angle_rads. Esto crea un patrón de ondas sinusoidales y cosenoidales que proporciona codificaciones únicas para diferentes posiciones en una secuencia.

La parte inferior del código proporciona un ejemplo de cómo usar esta función. Crea un array de numpy t con un rango de 0 a 9 (reformado en un vector columna), establece d_model en 128, usa estos valores para calcular la codificación de paso y luego imprime el resultado.

10.2.4 Modelo Completo de Difusión

Combinando la capa de adición de ruido, la red de eliminación de ruido y la codificación de pasos, podemos construir el modelo completo de difusión. Este modelo eliminará iterativamente el ruido de las imágenes de entrada, guiado por la codificación de pasos y la función de pérdida.

Ejemplo: Modelo Completo de Difusión

from tensorflow.keras.layers import Input, Concatenate

def build_full_diffusion_model(input_shape, d_model):
    """
    Builds the full diffusion model.

    Parameters:
    - input_shape: Shape of the input images.
    - d_model: Dimensionality of the model.

    Returns:
    - A Keras model for the full diffusion process.
    """
    # Input layers for images and step encoding
    image_input = Input(shape=input_shape)
    step_input = Input(shape=(d_model,))

    # Apply noise addition layer
    noisy_images = NoiseAddition()(image_input)

    # Flatten and concatenate inputs
    x = Conv2D(64, (3, 3), padding='same')(noisy_images)
    x = BatchNormalization()(x)
    x = LeakyReLU()(x)
    step_embedding = Dense(np.prod(input_shape))(step_input)
    step_embedding = Reshape(input_shape)(step_embedding)
    x = Concatenate()([x, step_embedding])

    # Apply denoising network
    denoised_images = build_denoising_network(input_shape)(x)

    return Model([image_input, step_input], denoised_images)

# Example usage with CIFAR-10 image shape
input_shape = (32, 32, 3)
d_model = 128
diffusion_model = build_full_diffusion_model(input_shape, d_model)
diffusion_model.summary()

Este fragmento de código define una función para construir el modelo completo de difusión utilizando Keras. Este modelo se usa en el aprendizaje automático para tareas como la eliminación de ruido en imágenes. La función toma la forma de las imágenes de entrada y la dimensionalidad del modelo como argumentos. Primero crea capas de entrada para las imágenes y la codificación de pasos.

Luego, añade ruido a las imágenes, las aplana y concatena las entradas. La red de eliminación de ruido se aplica a las imágenes ruidosas. La función devuelve el modelo construido.

10.2.5 Compilación del Modelo

Para compilar el modelo de difusión, necesitamos especificar un optimizador y una función de pérdida. La función de pérdida de error cuadrático medio (MSE) se usa comúnmente para entrenar modelos de difusión, ya que mide la diferencia entre el ruido predicho y el ruido real.

Ejemplo: Compilación del Modelo

from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import MeanSquaredError

# Compile the diffusion model
diffusion_model.compile(optimizer=Adam(learning_rate=1e-4), loss=MeanSquaredError())

# Print the model summary
diffusion_model.summary()

El código utiliza las bibliotecas Tensorflow y Keras. Se usa para compilar un modelo de aprendizaje automático llamado diffusion_model con configuraciones específicas. Se selecciona el algoritmo de optimización Adam con una tasa de aprendizaje de 0.0001. La función de pérdida, que mide el rendimiento del modelo, se establece en el error cuadrático medio (MSE). Después de establecer estas configuraciones, se compila el modelo y se imprime el resumen de la arquitectura del modelo.

Resumen

En esta sección, creamos con éxito el modelo de difusión para nuestro proyecto de generación de imágenes. Comenzamos implementando la capa de adición de ruido, que simula el proceso de difusión hacia adelante. A continuación, construimos una red de eliminación de ruido utilizando una red neuronal convolucional (CNN) para predecir y eliminar el ruido de las imágenes. También implementamos la codificación de pasos para proporcionar información temporal a la red de eliminación de ruido.

Combinando estos componentes, construimos el modelo de difusión completo, que elimina iterativamente el ruido de las imágenes de entrada. Finalmente, compilamos el modelo con un optimizador y una función de pérdida apropiados, preparándolo para el entrenamiento.

Con nuestro modelo listo, podemos pasar al siguiente paso: entrenar el modelo de difusión con los datos preparados. En las siguientes secciones, entrenaremos el modelo, generaremos imágenes y evaluaremos su rendimiento, proporcionando una comprensión completa de cómo aplicar modelos de difusión a tareas de generación de imágenes en el mundo real.