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.

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?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que el parámetro class_mode en el método flow_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:

    model.add(Dense(1,activation='softmax'))
    

    con:

    model.add(Dense(3, activation='softmax'))
    

    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ón to_categorical de Keras:

    from keras.utils import to_categorical
    
    train_generator = datagen.flow_from_directory(
        DATASET_DIR,
        target_size = DIM_IMG,
        batch_size = BATCH_SIZE,
        class_mode = "categorical",
        subset = "training"
    )
    
    train_generator.classes = to_categorical(train_generator.classes)
    

    De manera similar, para el generador de datos de validación:

    test_generator = datagen.flow_from_directory(
        DATASET_DIR,
        target_size = DIM_IMG,
        batch_size = BATCH_SIZE,
        class_mode = "categorical",
        subset = "validation"
    )
    
    test_generator.classes = to_categorical(test_generator.classes)
    

    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!

Comments are closed.