Capítulo 7: Ingeniería de características para el aprendizaje profundo
7.3 Ejercicios prácticos: Capítulo 7
En esta sección de ejercicios, aplicaremos técnicas de ingeniería de características dentro de canalizaciones de TensorFlow/Keras, centrándonos en la preparación de datos, manejo de capas de preprocesamiento y construcción de flujos de trabajo de extremo a extremo con tf.data
. Estos ejercicios están diseñados para reforzar los conceptos de integrar los pasos de preprocesamiento dentro de la canalización del modelo.
Ejercicio 1: Normalizar y codificar datos usando capas de preprocesamiento de Keras
Objetivo: Utilizar capas de preprocesamiento de Keras para normalizar datos numéricos y codificar datos categóricos one-hot dentro de una canalización de modelo.
Instrucciones:
- Crear un conjunto de datos pequeño con dos características numéricas y una categórica.
- Aplicar la capa
Normalization
para los datos numéricos y las capasStringLookup
conCategoryEncoding
para los datos categóricos. - Construir un modelo sencillo que integre estos pasos de preprocesamiento.
Solución:
import tensorflow as tf
from tensorflow.keras.layers import Normalization, StringLookup, CategoryEncoding, Input, Dense, concatenate
from tensorflow.keras.models import Model
import numpy as np
# Sample data
numeric_data = np.array([[25.0, 50000.0], [30.0, 60000.0], [35.0, 70000.0], [40.0, 80000.0]])
categorical_data = np.array(['A', 'B', 'A', 'C'])
# Define preprocessing layers
normalizer = Normalization()
normalizer.adapt(numeric_data)
string_lookup = StringLookup(vocabulary=['A', 'B', 'C'])
category_encoder = CategoryEncoding(num_tokens=string_lookup.vocabulary_size())
# Define model inputs
numeric_input = Input(shape=(2,), name="numeric_input")
categorical_input = Input(shape=(1,), dtype="string", name="categorical_input")
# Apply preprocessing
normalized_numeric = normalizer(numeric_input)
encoded_category = category_encoder(string_lookup(categorical_input))
# Combine features and build a simple model
combined_features = concatenate([normalized_numeric, encoded_category])
output = Dense(1, activation="sigmoid")(combined_features)
model = Model(inputs=[numeric_input, categorical_input], outputs=output)
# Display model summary
model.summary()
En este ejercicio:
- Utilizamos la capa
Normalization
para estandarizar los datos numéricos yStringLookup
seguido deCategoryEncoding
para codificar datos categóricos one-hot. - Esta canalización integrada permite que el modelo procese datos en bruto, manejando todo el preprocesamiento dentro del modelo.
Ejercicio 2: Construcción de una capa de augmentación de datos de imágenes con Keras
Objetivo: Utilizar las capas de augmentación de datos de imágenes de Keras para preprocesar datos de imágenes directamente en el modelo.
Instrucciones:
- Cargar un conjunto de imágenes de ejemplo.
- Aplicar capas de augmentación de datos, incluyendo rotación, volteo y zoom, para crear variaciones de las imágenes de entrada.
- Construir un modelo CNN sencillo que incluya estas capas de augmentación.
Solución:
from tensorflow.keras.layers import RandomFlip, RandomRotation, RandomZoom, Conv2D, MaxPooling2D, Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
# Define data augmentation layers
data_augmentation = Sequential([
RandomFlip("horizontal"),
RandomRotation(0.2),
RandomZoom(0.1),
])
# Build a CNN model with data augmentation
model = Sequential([
Input(shape=(224, 224, 3)),
data_augmentation,
Conv2D(32, (3, 3), activation="relu"),
MaxPooling2D(),
Conv2D(64, (3, 3), activation="relu"),
MaxPooling2D(),
Flatten(),
Dense(128, activation="relu"),
Dense(10, activation="softmax") # Assuming 10 classes
])
# Display model summary
model.summary()
En este ejercicio:
- La capa de augmentación de datos se integra como parte del modelo, aplicando transformaciones aleatorias a las imágenes durante el entrenamiento.
- El modelo CNN puede generalizar mejor a nuevas imágenes, ya que se entrena con datos aumentados, haciéndolo más robusto.
Ejercicio 3: Construcción de una canalización tf.data
para datos mixtos
Objetivo: Construir una canalización tf.data
que preprocese tanto datos de imágenes como estructurados, integrando normalización para características numéricas y redimensionamiento para imágenes.
Instrucciones:
- Cargar rutas de imágenes de ejemplo, datos numéricos y datos categóricos.
- Crear funciones de preprocesamiento para imágenes (redimensionamiento y normalización) y datos numéricos.
- Combinarlas en una única canalización
tf.data
y verificar la salida.
Solución:
import tensorflow as tf
import numpy as np
# Sample image paths, numeric, and categorical data
image_paths = ["path/to/image1.jpg", "path/to/image2.jpg"]
numeric_data = np.array([[25.0, 50000.0], [30.0, 60000.0]])
categorical_data = np.array(["A", "B"])
# Define image processing function
def load_and_preprocess_image(path):
image = tf.io.read_file(path)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [224, 224])
return image / 255.0
# Define numeric preprocessing
normalizer = Normalization()
normalizer.adapt(numeric_data)
# Define categorical encoding
string_lookup = StringLookup(vocabulary=["A", "B", "C"], output_mode="one_hot")
# Process data function
def process_data(image_path, numeric, category):
image = load_and_preprocess_image(image_path)
numeric = normalizer(numeric)
category = string_lookup(category)
return {"image_input": image, "numeric_input": numeric, "categorical_input": category}
# Combine data into a tf.data.Dataset
dataset = tf.data.Dataset.from_tensor_slices((image_paths, numeric_data, categorical_data))
dataset = dataset.map(process_data).batch(2)
# Verify output
for batch in dataset.take(1):
print(batch)
En este ejercicio:
- Creamos una canalización
tf.data
que preprocesa rutas de imágenes (carga, redimensionamiento y normalización) y datos estructurados (normalización de datos numéricos y codificación de datos categóricos). - El formato de salida coincide con los requisitos de entrada del modelo, lo que facilita alimentar los datos directamente a una red neuronal.
Ejercicio 4: Combinación de múltiples entradas con capas de preprocesamiento de Keras en un modelo
Objetivo: Crear un modelo que integre múltiples tipos de entrada (imágenes, datos numéricos y categóricos) con ingeniería de características directamente incrustada en el modelo.
Instrucciones:
- Definir entradas separadas para datos de imágenes, numéricos y categóricos.
- Utilizar capas de preprocesamiento de Keras para normalizar y codificar las entradas.
- Combinar las entradas preprocesadas en un modelo de red neuronal.
Solución:
from tensorflow.keras.layers import Input, concatenate, Dense, Flatten
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Model
# Define image input and ResNet model for feature extraction
image_input = Input(shape=(224, 224, 3), name="image_input")
resnet = ResNet50(weights="imagenet", include_top=False, input_tensor=image_input)
flattened_image = Flatten()(resnet.output)
# Define numeric input and apply normalization
numeric_input = Input(shape=(2,), name="numeric_input")
normalized_numeric = normalizer(numeric_input)
# Define categorical input and apply encoding
categorical_input = Input(shape=(1,), dtype="string", name="categorical_input")
encoded_category = string_lookup(categorical_input)
# Concatenate all processed inputs
combined = concatenate([flattened_image, normalized_numeric, encoded_category])
# Final model layers
output = Dense(128, activation="relu")(combined)
output = Dense(10, activation="softmax")(output) # Assuming 10 classes
# Build the model
model = Model(inputs=[image_input, numeric_input, categorical_input], outputs=output)
# Display model summary
model.summary()
En este ejercicio:
- El modelo maneja múltiples tipos de entrada: una imagen procesada por ResNet, datos numéricos normalizados a través de
Normalization
y datos categóricos codificados conStringLookup
. - Todas las entradas se concatenan, permitiendo una visión integral de los datos en el modelo.
Estos ejercicios ilustran aplicaciones prácticas de la ingeniería de características para aprendizaje profundo, desde la integración de capas de preprocesamiento hasta la construcción de canalizaciones de datos eficientes. Al incrustar estos pasos en TensorFlow/Keras, las transformaciones de datos se convierten en parte del modelo, creando una canalización de extremo a extremo que garantiza la consistencia de los datos y simplifica la implementación.
7.3 Ejercicios prácticos: Capítulo 7
En esta sección de ejercicios, aplicaremos técnicas de ingeniería de características dentro de canalizaciones de TensorFlow/Keras, centrándonos en la preparación de datos, manejo de capas de preprocesamiento y construcción de flujos de trabajo de extremo a extremo con tf.data
. Estos ejercicios están diseñados para reforzar los conceptos de integrar los pasos de preprocesamiento dentro de la canalización del modelo.
Ejercicio 1: Normalizar y codificar datos usando capas de preprocesamiento de Keras
Objetivo: Utilizar capas de preprocesamiento de Keras para normalizar datos numéricos y codificar datos categóricos one-hot dentro de una canalización de modelo.
Instrucciones:
- Crear un conjunto de datos pequeño con dos características numéricas y una categórica.
- Aplicar la capa
Normalization
para los datos numéricos y las capasStringLookup
conCategoryEncoding
para los datos categóricos. - Construir un modelo sencillo que integre estos pasos de preprocesamiento.
Solución:
import tensorflow as tf
from tensorflow.keras.layers import Normalization, StringLookup, CategoryEncoding, Input, Dense, concatenate
from tensorflow.keras.models import Model
import numpy as np
# Sample data
numeric_data = np.array([[25.0, 50000.0], [30.0, 60000.0], [35.0, 70000.0], [40.0, 80000.0]])
categorical_data = np.array(['A', 'B', 'A', 'C'])
# Define preprocessing layers
normalizer = Normalization()
normalizer.adapt(numeric_data)
string_lookup = StringLookup(vocabulary=['A', 'B', 'C'])
category_encoder = CategoryEncoding(num_tokens=string_lookup.vocabulary_size())
# Define model inputs
numeric_input = Input(shape=(2,), name="numeric_input")
categorical_input = Input(shape=(1,), dtype="string", name="categorical_input")
# Apply preprocessing
normalized_numeric = normalizer(numeric_input)
encoded_category = category_encoder(string_lookup(categorical_input))
# Combine features and build a simple model
combined_features = concatenate([normalized_numeric, encoded_category])
output = Dense(1, activation="sigmoid")(combined_features)
model = Model(inputs=[numeric_input, categorical_input], outputs=output)
# Display model summary
model.summary()
En este ejercicio:
- Utilizamos la capa
Normalization
para estandarizar los datos numéricos yStringLookup
seguido deCategoryEncoding
para codificar datos categóricos one-hot. - Esta canalización integrada permite que el modelo procese datos en bruto, manejando todo el preprocesamiento dentro del modelo.
Ejercicio 2: Construcción de una capa de augmentación de datos de imágenes con Keras
Objetivo: Utilizar las capas de augmentación de datos de imágenes de Keras para preprocesar datos de imágenes directamente en el modelo.
Instrucciones:
- Cargar un conjunto de imágenes de ejemplo.
- Aplicar capas de augmentación de datos, incluyendo rotación, volteo y zoom, para crear variaciones de las imágenes de entrada.
- Construir un modelo CNN sencillo que incluya estas capas de augmentación.
Solución:
from tensorflow.keras.layers import RandomFlip, RandomRotation, RandomZoom, Conv2D, MaxPooling2D, Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
# Define data augmentation layers
data_augmentation = Sequential([
RandomFlip("horizontal"),
RandomRotation(0.2),
RandomZoom(0.1),
])
# Build a CNN model with data augmentation
model = Sequential([
Input(shape=(224, 224, 3)),
data_augmentation,
Conv2D(32, (3, 3), activation="relu"),
MaxPooling2D(),
Conv2D(64, (3, 3), activation="relu"),
MaxPooling2D(),
Flatten(),
Dense(128, activation="relu"),
Dense(10, activation="softmax") # Assuming 10 classes
])
# Display model summary
model.summary()
En este ejercicio:
- La capa de augmentación de datos se integra como parte del modelo, aplicando transformaciones aleatorias a las imágenes durante el entrenamiento.
- El modelo CNN puede generalizar mejor a nuevas imágenes, ya que se entrena con datos aumentados, haciéndolo más robusto.
Ejercicio 3: Construcción de una canalización tf.data
para datos mixtos
Objetivo: Construir una canalización tf.data
que preprocese tanto datos de imágenes como estructurados, integrando normalización para características numéricas y redimensionamiento para imágenes.
Instrucciones:
- Cargar rutas de imágenes de ejemplo, datos numéricos y datos categóricos.
- Crear funciones de preprocesamiento para imágenes (redimensionamiento y normalización) y datos numéricos.
- Combinarlas en una única canalización
tf.data
y verificar la salida.
Solución:
import tensorflow as tf
import numpy as np
# Sample image paths, numeric, and categorical data
image_paths = ["path/to/image1.jpg", "path/to/image2.jpg"]
numeric_data = np.array([[25.0, 50000.0], [30.0, 60000.0]])
categorical_data = np.array(["A", "B"])
# Define image processing function
def load_and_preprocess_image(path):
image = tf.io.read_file(path)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [224, 224])
return image / 255.0
# Define numeric preprocessing
normalizer = Normalization()
normalizer.adapt(numeric_data)
# Define categorical encoding
string_lookup = StringLookup(vocabulary=["A", "B", "C"], output_mode="one_hot")
# Process data function
def process_data(image_path, numeric, category):
image = load_and_preprocess_image(image_path)
numeric = normalizer(numeric)
category = string_lookup(category)
return {"image_input": image, "numeric_input": numeric, "categorical_input": category}
# Combine data into a tf.data.Dataset
dataset = tf.data.Dataset.from_tensor_slices((image_paths, numeric_data, categorical_data))
dataset = dataset.map(process_data).batch(2)
# Verify output
for batch in dataset.take(1):
print(batch)
En este ejercicio:
- Creamos una canalización
tf.data
que preprocesa rutas de imágenes (carga, redimensionamiento y normalización) y datos estructurados (normalización de datos numéricos y codificación de datos categóricos). - El formato de salida coincide con los requisitos de entrada del modelo, lo que facilita alimentar los datos directamente a una red neuronal.
Ejercicio 4: Combinación de múltiples entradas con capas de preprocesamiento de Keras en un modelo
Objetivo: Crear un modelo que integre múltiples tipos de entrada (imágenes, datos numéricos y categóricos) con ingeniería de características directamente incrustada en el modelo.
Instrucciones:
- Definir entradas separadas para datos de imágenes, numéricos y categóricos.
- Utilizar capas de preprocesamiento de Keras para normalizar y codificar las entradas.
- Combinar las entradas preprocesadas en un modelo de red neuronal.
Solución:
from tensorflow.keras.layers import Input, concatenate, Dense, Flatten
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Model
# Define image input and ResNet model for feature extraction
image_input = Input(shape=(224, 224, 3), name="image_input")
resnet = ResNet50(weights="imagenet", include_top=False, input_tensor=image_input)
flattened_image = Flatten()(resnet.output)
# Define numeric input and apply normalization
numeric_input = Input(shape=(2,), name="numeric_input")
normalized_numeric = normalizer(numeric_input)
# Define categorical input and apply encoding
categorical_input = Input(shape=(1,), dtype="string", name="categorical_input")
encoded_category = string_lookup(categorical_input)
# Concatenate all processed inputs
combined = concatenate([flattened_image, normalized_numeric, encoded_category])
# Final model layers
output = Dense(128, activation="relu")(combined)
output = Dense(10, activation="softmax")(output) # Assuming 10 classes
# Build the model
model = Model(inputs=[image_input, numeric_input, categorical_input], outputs=output)
# Display model summary
model.summary()
En este ejercicio:
- El modelo maneja múltiples tipos de entrada: una imagen procesada por ResNet, datos numéricos normalizados a través de
Normalization
y datos categóricos codificados conStringLookup
. - Todas las entradas se concatenan, permitiendo una visión integral de los datos en el modelo.
Estos ejercicios ilustran aplicaciones prácticas de la ingeniería de características para aprendizaje profundo, desde la integración de capas de preprocesamiento hasta la construcción de canalizaciones de datos eficientes. Al incrustar estos pasos en TensorFlow/Keras, las transformaciones de datos se convierten en parte del modelo, creando una canalización de extremo a extremo que garantiza la consistencia de los datos y simplifica la implementación.
7.3 Ejercicios prácticos: Capítulo 7
En esta sección de ejercicios, aplicaremos técnicas de ingeniería de características dentro de canalizaciones de TensorFlow/Keras, centrándonos en la preparación de datos, manejo de capas de preprocesamiento y construcción de flujos de trabajo de extremo a extremo con tf.data
. Estos ejercicios están diseñados para reforzar los conceptos de integrar los pasos de preprocesamiento dentro de la canalización del modelo.
Ejercicio 1: Normalizar y codificar datos usando capas de preprocesamiento de Keras
Objetivo: Utilizar capas de preprocesamiento de Keras para normalizar datos numéricos y codificar datos categóricos one-hot dentro de una canalización de modelo.
Instrucciones:
- Crear un conjunto de datos pequeño con dos características numéricas y una categórica.
- Aplicar la capa
Normalization
para los datos numéricos y las capasStringLookup
conCategoryEncoding
para los datos categóricos. - Construir un modelo sencillo que integre estos pasos de preprocesamiento.
Solución:
import tensorflow as tf
from tensorflow.keras.layers import Normalization, StringLookup, CategoryEncoding, Input, Dense, concatenate
from tensorflow.keras.models import Model
import numpy as np
# Sample data
numeric_data = np.array([[25.0, 50000.0], [30.0, 60000.0], [35.0, 70000.0], [40.0, 80000.0]])
categorical_data = np.array(['A', 'B', 'A', 'C'])
# Define preprocessing layers
normalizer = Normalization()
normalizer.adapt(numeric_data)
string_lookup = StringLookup(vocabulary=['A', 'B', 'C'])
category_encoder = CategoryEncoding(num_tokens=string_lookup.vocabulary_size())
# Define model inputs
numeric_input = Input(shape=(2,), name="numeric_input")
categorical_input = Input(shape=(1,), dtype="string", name="categorical_input")
# Apply preprocessing
normalized_numeric = normalizer(numeric_input)
encoded_category = category_encoder(string_lookup(categorical_input))
# Combine features and build a simple model
combined_features = concatenate([normalized_numeric, encoded_category])
output = Dense(1, activation="sigmoid")(combined_features)
model = Model(inputs=[numeric_input, categorical_input], outputs=output)
# Display model summary
model.summary()
En este ejercicio:
- Utilizamos la capa
Normalization
para estandarizar los datos numéricos yStringLookup
seguido deCategoryEncoding
para codificar datos categóricos one-hot. - Esta canalización integrada permite que el modelo procese datos en bruto, manejando todo el preprocesamiento dentro del modelo.
Ejercicio 2: Construcción de una capa de augmentación de datos de imágenes con Keras
Objetivo: Utilizar las capas de augmentación de datos de imágenes de Keras para preprocesar datos de imágenes directamente en el modelo.
Instrucciones:
- Cargar un conjunto de imágenes de ejemplo.
- Aplicar capas de augmentación de datos, incluyendo rotación, volteo y zoom, para crear variaciones de las imágenes de entrada.
- Construir un modelo CNN sencillo que incluya estas capas de augmentación.
Solución:
from tensorflow.keras.layers import RandomFlip, RandomRotation, RandomZoom, Conv2D, MaxPooling2D, Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
# Define data augmentation layers
data_augmentation = Sequential([
RandomFlip("horizontal"),
RandomRotation(0.2),
RandomZoom(0.1),
])
# Build a CNN model with data augmentation
model = Sequential([
Input(shape=(224, 224, 3)),
data_augmentation,
Conv2D(32, (3, 3), activation="relu"),
MaxPooling2D(),
Conv2D(64, (3, 3), activation="relu"),
MaxPooling2D(),
Flatten(),
Dense(128, activation="relu"),
Dense(10, activation="softmax") # Assuming 10 classes
])
# Display model summary
model.summary()
En este ejercicio:
- La capa de augmentación de datos se integra como parte del modelo, aplicando transformaciones aleatorias a las imágenes durante el entrenamiento.
- El modelo CNN puede generalizar mejor a nuevas imágenes, ya que se entrena con datos aumentados, haciéndolo más robusto.
Ejercicio 3: Construcción de una canalización tf.data
para datos mixtos
Objetivo: Construir una canalización tf.data
que preprocese tanto datos de imágenes como estructurados, integrando normalización para características numéricas y redimensionamiento para imágenes.
Instrucciones:
- Cargar rutas de imágenes de ejemplo, datos numéricos y datos categóricos.
- Crear funciones de preprocesamiento para imágenes (redimensionamiento y normalización) y datos numéricos.
- Combinarlas en una única canalización
tf.data
y verificar la salida.
Solución:
import tensorflow as tf
import numpy as np
# Sample image paths, numeric, and categorical data
image_paths = ["path/to/image1.jpg", "path/to/image2.jpg"]
numeric_data = np.array([[25.0, 50000.0], [30.0, 60000.0]])
categorical_data = np.array(["A", "B"])
# Define image processing function
def load_and_preprocess_image(path):
image = tf.io.read_file(path)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [224, 224])
return image / 255.0
# Define numeric preprocessing
normalizer = Normalization()
normalizer.adapt(numeric_data)
# Define categorical encoding
string_lookup = StringLookup(vocabulary=["A", "B", "C"], output_mode="one_hot")
# Process data function
def process_data(image_path, numeric, category):
image = load_and_preprocess_image(image_path)
numeric = normalizer(numeric)
category = string_lookup(category)
return {"image_input": image, "numeric_input": numeric, "categorical_input": category}
# Combine data into a tf.data.Dataset
dataset = tf.data.Dataset.from_tensor_slices((image_paths, numeric_data, categorical_data))
dataset = dataset.map(process_data).batch(2)
# Verify output
for batch in dataset.take(1):
print(batch)
En este ejercicio:
- Creamos una canalización
tf.data
que preprocesa rutas de imágenes (carga, redimensionamiento y normalización) y datos estructurados (normalización de datos numéricos y codificación de datos categóricos). - El formato de salida coincide con los requisitos de entrada del modelo, lo que facilita alimentar los datos directamente a una red neuronal.
Ejercicio 4: Combinación de múltiples entradas con capas de preprocesamiento de Keras en un modelo
Objetivo: Crear un modelo que integre múltiples tipos de entrada (imágenes, datos numéricos y categóricos) con ingeniería de características directamente incrustada en el modelo.
Instrucciones:
- Definir entradas separadas para datos de imágenes, numéricos y categóricos.
- Utilizar capas de preprocesamiento de Keras para normalizar y codificar las entradas.
- Combinar las entradas preprocesadas en un modelo de red neuronal.
Solución:
from tensorflow.keras.layers import Input, concatenate, Dense, Flatten
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Model
# Define image input and ResNet model for feature extraction
image_input = Input(shape=(224, 224, 3), name="image_input")
resnet = ResNet50(weights="imagenet", include_top=False, input_tensor=image_input)
flattened_image = Flatten()(resnet.output)
# Define numeric input and apply normalization
numeric_input = Input(shape=(2,), name="numeric_input")
normalized_numeric = normalizer(numeric_input)
# Define categorical input and apply encoding
categorical_input = Input(shape=(1,), dtype="string", name="categorical_input")
encoded_category = string_lookup(categorical_input)
# Concatenate all processed inputs
combined = concatenate([flattened_image, normalized_numeric, encoded_category])
# Final model layers
output = Dense(128, activation="relu")(combined)
output = Dense(10, activation="softmax")(output) # Assuming 10 classes
# Build the model
model = Model(inputs=[image_input, numeric_input, categorical_input], outputs=output)
# Display model summary
model.summary()
En este ejercicio:
- El modelo maneja múltiples tipos de entrada: una imagen procesada por ResNet, datos numéricos normalizados a través de
Normalization
y datos categóricos codificados conStringLookup
. - Todas las entradas se concatenan, permitiendo una visión integral de los datos en el modelo.
Estos ejercicios ilustran aplicaciones prácticas de la ingeniería de características para aprendizaje profundo, desde la integración de capas de preprocesamiento hasta la construcción de canalizaciones de datos eficientes. Al incrustar estos pasos en TensorFlow/Keras, las transformaciones de datos se convierten en parte del modelo, creando una canalización de extremo a extremo que garantiza la consistencia de los datos y simplifica la implementación.
7.3 Ejercicios prácticos: Capítulo 7
En esta sección de ejercicios, aplicaremos técnicas de ingeniería de características dentro de canalizaciones de TensorFlow/Keras, centrándonos en la preparación de datos, manejo de capas de preprocesamiento y construcción de flujos de trabajo de extremo a extremo con tf.data
. Estos ejercicios están diseñados para reforzar los conceptos de integrar los pasos de preprocesamiento dentro de la canalización del modelo.
Ejercicio 1: Normalizar y codificar datos usando capas de preprocesamiento de Keras
Objetivo: Utilizar capas de preprocesamiento de Keras para normalizar datos numéricos y codificar datos categóricos one-hot dentro de una canalización de modelo.
Instrucciones:
- Crear un conjunto de datos pequeño con dos características numéricas y una categórica.
- Aplicar la capa
Normalization
para los datos numéricos y las capasStringLookup
conCategoryEncoding
para los datos categóricos. - Construir un modelo sencillo que integre estos pasos de preprocesamiento.
Solución:
import tensorflow as tf
from tensorflow.keras.layers import Normalization, StringLookup, CategoryEncoding, Input, Dense, concatenate
from tensorflow.keras.models import Model
import numpy as np
# Sample data
numeric_data = np.array([[25.0, 50000.0], [30.0, 60000.0], [35.0, 70000.0], [40.0, 80000.0]])
categorical_data = np.array(['A', 'B', 'A', 'C'])
# Define preprocessing layers
normalizer = Normalization()
normalizer.adapt(numeric_data)
string_lookup = StringLookup(vocabulary=['A', 'B', 'C'])
category_encoder = CategoryEncoding(num_tokens=string_lookup.vocabulary_size())
# Define model inputs
numeric_input = Input(shape=(2,), name="numeric_input")
categorical_input = Input(shape=(1,), dtype="string", name="categorical_input")
# Apply preprocessing
normalized_numeric = normalizer(numeric_input)
encoded_category = category_encoder(string_lookup(categorical_input))
# Combine features and build a simple model
combined_features = concatenate([normalized_numeric, encoded_category])
output = Dense(1, activation="sigmoid")(combined_features)
model = Model(inputs=[numeric_input, categorical_input], outputs=output)
# Display model summary
model.summary()
En este ejercicio:
- Utilizamos la capa
Normalization
para estandarizar los datos numéricos yStringLookup
seguido deCategoryEncoding
para codificar datos categóricos one-hot. - Esta canalización integrada permite que el modelo procese datos en bruto, manejando todo el preprocesamiento dentro del modelo.
Ejercicio 2: Construcción de una capa de augmentación de datos de imágenes con Keras
Objetivo: Utilizar las capas de augmentación de datos de imágenes de Keras para preprocesar datos de imágenes directamente en el modelo.
Instrucciones:
- Cargar un conjunto de imágenes de ejemplo.
- Aplicar capas de augmentación de datos, incluyendo rotación, volteo y zoom, para crear variaciones de las imágenes de entrada.
- Construir un modelo CNN sencillo que incluya estas capas de augmentación.
Solución:
from tensorflow.keras.layers import RandomFlip, RandomRotation, RandomZoom, Conv2D, MaxPooling2D, Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
# Define data augmentation layers
data_augmentation = Sequential([
RandomFlip("horizontal"),
RandomRotation(0.2),
RandomZoom(0.1),
])
# Build a CNN model with data augmentation
model = Sequential([
Input(shape=(224, 224, 3)),
data_augmentation,
Conv2D(32, (3, 3), activation="relu"),
MaxPooling2D(),
Conv2D(64, (3, 3), activation="relu"),
MaxPooling2D(),
Flatten(),
Dense(128, activation="relu"),
Dense(10, activation="softmax") # Assuming 10 classes
])
# Display model summary
model.summary()
En este ejercicio:
- La capa de augmentación de datos se integra como parte del modelo, aplicando transformaciones aleatorias a las imágenes durante el entrenamiento.
- El modelo CNN puede generalizar mejor a nuevas imágenes, ya que se entrena con datos aumentados, haciéndolo más robusto.
Ejercicio 3: Construcción de una canalización tf.data
para datos mixtos
Objetivo: Construir una canalización tf.data
que preprocese tanto datos de imágenes como estructurados, integrando normalización para características numéricas y redimensionamiento para imágenes.
Instrucciones:
- Cargar rutas de imágenes de ejemplo, datos numéricos y datos categóricos.
- Crear funciones de preprocesamiento para imágenes (redimensionamiento y normalización) y datos numéricos.
- Combinarlas en una única canalización
tf.data
y verificar la salida.
Solución:
import tensorflow as tf
import numpy as np
# Sample image paths, numeric, and categorical data
image_paths = ["path/to/image1.jpg", "path/to/image2.jpg"]
numeric_data = np.array([[25.0, 50000.0], [30.0, 60000.0]])
categorical_data = np.array(["A", "B"])
# Define image processing function
def load_and_preprocess_image(path):
image = tf.io.read_file(path)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [224, 224])
return image / 255.0
# Define numeric preprocessing
normalizer = Normalization()
normalizer.adapt(numeric_data)
# Define categorical encoding
string_lookup = StringLookup(vocabulary=["A", "B", "C"], output_mode="one_hot")
# Process data function
def process_data(image_path, numeric, category):
image = load_and_preprocess_image(image_path)
numeric = normalizer(numeric)
category = string_lookup(category)
return {"image_input": image, "numeric_input": numeric, "categorical_input": category}
# Combine data into a tf.data.Dataset
dataset = tf.data.Dataset.from_tensor_slices((image_paths, numeric_data, categorical_data))
dataset = dataset.map(process_data).batch(2)
# Verify output
for batch in dataset.take(1):
print(batch)
En este ejercicio:
- Creamos una canalización
tf.data
que preprocesa rutas de imágenes (carga, redimensionamiento y normalización) y datos estructurados (normalización de datos numéricos y codificación de datos categóricos). - El formato de salida coincide con los requisitos de entrada del modelo, lo que facilita alimentar los datos directamente a una red neuronal.
Ejercicio 4: Combinación de múltiples entradas con capas de preprocesamiento de Keras en un modelo
Objetivo: Crear un modelo que integre múltiples tipos de entrada (imágenes, datos numéricos y categóricos) con ingeniería de características directamente incrustada en el modelo.
Instrucciones:
- Definir entradas separadas para datos de imágenes, numéricos y categóricos.
- Utilizar capas de preprocesamiento de Keras para normalizar y codificar las entradas.
- Combinar las entradas preprocesadas en un modelo de red neuronal.
Solución:
from tensorflow.keras.layers import Input, concatenate, Dense, Flatten
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Model
# Define image input and ResNet model for feature extraction
image_input = Input(shape=(224, 224, 3), name="image_input")
resnet = ResNet50(weights="imagenet", include_top=False, input_tensor=image_input)
flattened_image = Flatten()(resnet.output)
# Define numeric input and apply normalization
numeric_input = Input(shape=(2,), name="numeric_input")
normalized_numeric = normalizer(numeric_input)
# Define categorical input and apply encoding
categorical_input = Input(shape=(1,), dtype="string", name="categorical_input")
encoded_category = string_lookup(categorical_input)
# Concatenate all processed inputs
combined = concatenate([flattened_image, normalized_numeric, encoded_category])
# Final model layers
output = Dense(128, activation="relu")(combined)
output = Dense(10, activation="softmax")(output) # Assuming 10 classes
# Build the model
model = Model(inputs=[image_input, numeric_input, categorical_input], outputs=output)
# Display model summary
model.summary()
En este ejercicio:
- El modelo maneja múltiples tipos de entrada: una imagen procesada por ResNet, datos numéricos normalizados a través de
Normalization
y datos categóricos codificados conStringLookup
. - Todas las entradas se concatenan, permitiendo una visión integral de los datos en el modelo.
Estos ejercicios ilustran aplicaciones prácticas de la ingeniería de características para aprendizaje profundo, desde la integración de capas de preprocesamiento hasta la construcción de canalizaciones de datos eficientes. Al incrustar estos pasos en TensorFlow/Keras, las transformaciones de datos se convierten en parte del modelo, creando una canalización de extremo a extremo que garantiza la consistencia de los datos y simplifica la implementación.