Supongamos que tiene un conjunto de datos que tiene imágenes y algunos datos en a .csv
para cada imagen. Su objetivo es crear un NN que tenga una rama de convolución y otra (en mi caso, un MLP).
Ahora, hay muchas guías ( una aquí , otra ) sobre cómo crear la red, ese no es el problema.
El problema aquí es cómo creo un iterador en forma de [[convolution_input, other_features], target]
cuando convolution_input
es de un flujo de Keras que agrega imágenes aumentadas.ImageDataGenerator
Más específicamente, cuando la enésima imagen (que puede ser aumentada o no) se alimenta a la NN, quiero que tenga sus características originales en su interior other_features
.
Encontré pocos intentos ( aquí y aquí , el segundo parecía prometedor, pero no pude descubrir cómo manejar imágenes aumentadas) al hacer exactamente eso, pero no parecen tener en cuenta la posible manipulación del conjunto de datos que el generador Keras hace.
fuente
flow
o necesitasflow_from_directory
? (flow
significa que puede mantener todas las imágenes cargadas en la memoria)flow_from_dataframe
porque tengo nombres de archivos, características y clasesRespuestas:
Digamos que tiene un csv, de modo que sus imágenes y otras características están en el archivo.
donde id representa el nombre de la imagen, seguido de las características y su objetivo (clase para la clasificación, número para la regresión)
Primero definamos un generador de datos y luego podemos anularlo.
leamos los datos del csv en un marco de datos de pandas y usemos flow_from_dataframe de keras para leer del marco de datos.
Siempre puede agregar su aumento en ImageDataGenerator.
Lo que hay que tener en cuenta en el código anterior en flow_from_dataframe es
x_col = el nombre de la imagen
y_col = típicamente columnas con el nombre de la clase, pero anulemos más adelante al proporcionar primero todas las otras columnas en el csv. es decir, feat_1, feat_2 .... hasta class_label
class_mode = raw, sugiera al generador que devuelva todos los valores en y tal como están.
Ahora anulemos / heredemos el generador anterior y creemos uno nuevo, de modo que devuelva [img, otherfeatures], [target]
Aquí está el código con comentarios como explicaciones.
cree una función similar para su generador de validación. Use train_test_split para dividir su marco de datos si lo necesita y crear 2 generadores y anularlos.
pasar la función en model.fit_generator como este
fuente
if(count==len(df.index))
hacer un seguimiento de la época si el conjunto de datos aumentado es mucho más numeroso que el original?