Tensorflow: El argumento `y` no es soportado al utilizar `keras.utils.Sequence` como entrada.
Estoy creando un modelo de detección de mascarillas en 3 clases “CorrectMask”, “UncorrectMask”, “NoMask”. Estoy creando mi CNN, pero tengo el siguiente error:
Traceback (most recent call last):
File "/home/andrea/Scrivania/Biometrics/covid_mask_train.py", line 70, in <module>
model.fit(train_generator, 25)
File "/home/andrea/.local/lib/python3.9/site-packages/keras/utils/traceback_utils.py", line 67, in error_handler
raise e.with_traceback(filtered_tb) from None
File "/home/andrea/.local/lib/python3.9/site-packages/keras/engine/data_adapter.py", line 919, in __init__
raise ValueError("`y` argument is not supported when using "
ValueError: `y` argument is not supported when using `keras.utils.Sequence` as input.
y este es mi código para crear mi CNN:
datagen = ImageDataGenerator(
validation_split=0.3,
rescale=1./255,
horizontal_flip=True,
zoom_range=0.2,
brightness_range=[1,2]
)
train_generator = datagen.flow_from_directory(
DATASET_DIR,
target_size=DIM_IMG,
batch_size=BATCH_SIZE,
class_mode="binary",
subset="training"
)
test_generator = datagen.flow_from_directory(
DATASET_DIR,
target_size=DIM_IMG,
batch_size=BATCH_SIZE,
class_mode="binary",
subset="validation"
)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), padding='same', activation='relu', input_shape=(224,224, 3)))
model.add(MaxPool2D(pool_size=(2,2), strides=2))
model.add(Dropout(0.5))
model.add(Conv2D(64, kernel_size=(3,3), padding='same', activation='relu', ))
model.add(MaxPool2D(pool_size=(2,2), strides=2))
model.add(Dropout(0.5))
model.add(Conv2D(128, kernel_size=(3,3), padding='same', activation='relu', ))
model.add(MaxPool2D(pool_size=(2,2), strides=2))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='softmax')) # uso softamx perchè ho più di due classi
model.summary()
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
model.fit(train_generator, EPOCHS)
metrics_train = model.evaluate(train_generator)
metrics_test = model.evaluate(test_generator)
print(f"TRAIN SET: {metrics_train}")
print("--------------------------------------------")
print(f"TEST SET: {metrics_test}")
model.save("model_MaskDetect_25_epochs.h5")
print("Saved!")
He leído varias cosas sobre Stack Overflow también, pero no logro entender cómo aplicarlo a mi caso. ¿Alguien puede ayudarme?
davy.ai
El mensaje de error sugiere que el parámetro
class_mode
en el métodoflow_from_directory
no debe establecerse en"binary"
porque tienes más de dos clases.En su lugar, deberías establecerlo en
"categorical"
y ajustar tu última capa en consecuencia. Reemplaza:con:
Esto creará una capa de salida con tres unidades correspondientes a las tres clases, y la función de activación softmax producirá probabilidades para cada clase.
Además, asegúrate de que las etiquetas en tus generadores de datos de entrenamiento y validación estén codificadas como one-hot. Puedes hacer esto estableciendo el parámetro
class_mode
en"categorical"
y utilizando la funciónto_categorical
de Keras:De manera similar, para el generador de datos de validación:
Además, asegúrate de que el número de unidades en la última capa y el número de clases que has definido en tu modelo coincidan correctamente.
¡Háganos saber si esto resuelve el error!