es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python: Generar un lote único a partir de conjunto de datos dado.

Estoy aplicando una CNN para clasificar un conjunto de datos dado.

Mi función:

def batch_generator(dataset, input_shape=(256, 256), batch_size=32):
dataset_images = []
dataset_labels = []
for i in range(0, len(dataset)):
dataset_images.append(cv2.resize(cv2.imread(dataset[i], cv2.IMREAD_COLOR),
input_shape, interpolation=cv2.INTER_AREA))
dataset_labels.append(labels[dataset[i].split(‘/’)[-2]])
return dataset_images, dataset_labels

Se supone que esta función debe ser llamada para cada época y debe devolver un lote único de tamaño ‘batch_size’ que contenga dataset_images (cada imagen es de 256×256 píxeles) y la correspondiente etiqueta de conjunto de datos del diccionario de etiquetas.

El conjunto de datos ‘dataset’ contiene la ruta de todas las imágenes, por lo que las abro y las redimensiono a 256×256 píxeles. ¿Puede alguien ayudarme a agregar algo a este código para que devuelva los lotes deseados?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear un lote de imágenes y etiquetas, necesitamos seleccionar de manera aleatoria un número de imágenes igual a ‘batch_size’ y sus etiquetas correspondientes del conjunto de datos. A continuación se presenta el código modificado para la función generadora de lotes:

    import random
    
    def batch_generator(dataset, input_shape=(256, 256), batch_size=32, labels=None):
        num_samples = len(dataset)
        while True:
            indices = random.sample(range(num_samples), batch_size)
            batch_images = []
            batch_labels = []
            for i in indices:
                img = cv2.imread(dataset[i], cv2.IMREAD_COLOR)
                img = cv2.resize(img, input_shape, interpolation=cv2.INTER_AREA)
                label = labels[dataset[i].split('/')[-2]]
                batch_images.append(img)
                batch_labels.append(label)
            yield np.array(batch_images), np.array(batch_labels)
    
    • Hemos importado la biblioteca ‘random’ para seleccionar de manera aleatoria un conjunto de índices para crear un lote.
    • Hemos reemplazado el ciclo ‘for’ con un ciclo ‘while’ para hacer que la función generadora de lotes sea infinitamente iterable.
    • Dentro del ciclo, seleccionamos un número de índices aleatorios igual a ‘batch_size’ usando el método ‘random.sample()’.
    • Para cada índice, leemos la imagen, la redimensionamos a ‘input_shape’ y obtenemos la etiqueta correspondiente del diccionario ‘labels’.
    • Añadimos la imagen y su etiqueta a sus respectivas listas para crear el lote.
    • Finalmente, devolvemos el lote como una tupla de (imágenes, etiquetas) para ser devueltos a la función que lo llama.

    Para llamar a esta función generadora de lotes, podemos usar el siguiente código:

    train_generator = batch_generator(train_dataset, batch_size=32, labels=labels_dict)
    val_generator = batch_generator(val_dataset, batch_size=32, labels=labels_dict)
    
    model.fit(train_generator, steps_per_epoch=len(train_dataset)//32, 
              validation_data=val_generator, validation_steps=len(val_dataset)//32)
    
    • Hemos creado dos generadores, uno para datos de entrenamiento y otro para datos de validación.
    • Hemos pasado los generadores ‘train_generator’ y ‘val_generator’ al método ‘fit()’ de nuestro modelo CNN.
    • Hemos establecido los argumentos ‘steps_per_epoch’ y ‘validation_steps’ en ‘len(dataset)//batch_size’ para asegurarnos de que el generador cubra todo el conjunto de datos en cada época.

    Al utilizar esta función generadora de lotes modificada, podemos entrenar fácilmente nuestro modelo CNN en conjuntos de datos grandes sin tener que cargar todos los datos en memoria de una sola vez.

Comments are closed.