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.

Estableciendo la forma de entrada durante el entrenamiento utilizando keras.

Estoy intentando entrenar un conjunto de datos usando keras que tiene xtrain.shape ---> (2040, 2, 5000) y ytrain.shape ---> (2040,) (Datos reales). El conjunto de datos de xtrain y ytrain miniaturizado muestra lo siguiente:

xtrain

array([[[ 2,  2,  7,  1,  5],
        [ 1,  2,  3,  4,  3]],

       [[ 5,  0,  3,  1,  6],
        [ 5,  6,  7,  8,  6]],

       [[ 2,  9,  8,  8,  7],
        [ 9, 10, 11, 12,  2]],

       [[ 5,  7,  7,  6,  8],
        [13, 14, 15, 16,  1]]])

ytrain

array([0,1,2,3])

Cuando intenté construir un modelo de red utilizando:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D
from tensorflow.keras.losses import sparse_categorical_crossentropy
from tensorflow.keras.optimizers import Adam

input_shape = (2,5000)
no_classes = 7
loss_function = sparse_categorical_crossentropy
no_epochs = 100
optimizer = Adam()
validation_split = 0.2
verbosity = 1

# Crear el modelo
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(no_classes, activation='softmax'))

# Compilar el modelo
model.compile(loss=loss_function,
              optimizer=optimizer,
              metrics=['accuracy']) 
# Ajustar los datos al modelo
history = model.fit(input_train, target_train,
            batch_size=batch_size,
            epochs=no_epochs,
            verbose=verbosity,
            validation_split=validation_split)

Obtengo el siguiente error:

ValueError: La entrada 0 de la capa "conv2d_2" no es compatible con la capa: se esperaba min_ndim=4, se encontró ndim=3. Se recibió la forma completa: (None, 2, 5000)

Estoy confundido acerca de cómo configurar la forma de entrada durante la creación de la red. ¿Es esto debido a la forma de la entrada?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, el error se debe a que la forma de la entrada proporcionada a la capa Conv2D es tridimensional (2,5000) en lugar de la esperada, que es tetradimensional.

    Como estás trabajando con una capa de convolución 2D, los datos de entrada deben tener una forma tetradimensional (tamaño_lote, altura, ancho, canales). En tu caso, necesitas remodelar tus datos xtrain a (2040, 2, 5000, 1), donde la última dimensión representa el número de canales.

    Puedes usar la función numpy.reshape() para remodelar tu datos antes de pasarlos al modelo.

    Aquí tienes el fragmento de código modificado:

    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Flatten, Conv2D
    from tensorflow.keras.losses import sparse_categorical_crossentropy
    from tensorflow.keras.optimizers import Adam
    
    input_shape = (2, 5000, 1)  # modificar la forma de entrada para que sea tetradimensional
    no_classes = 7
    loss_function = sparse_categorical_crossentropy
    no_epochs = 100
    optimizer = Adam()
    validation_split = 0.2
    verbosity = 1
    
    # Remodelar los datos de entrada
    xtrain_reshaped = xtrain.reshape((2040, 2, 5000, 1))
    
    # Crear el modelo
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
    model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
    model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(no_classes, activation='softmax'))
    
    # Compilar el modelo
    model.compile(loss=loss_function,
                  optimizer=optimizer,
                  metrics=['accuracy']) 
    # Ajustar los datos al modelo
    history = model.fit(xtrain_reshaped, ytrain,
                batch_size=tamaño_lote,
                epochs=no_epochs,
                verbose=verbosity,
                validation_split=validation_split)
    

    Ten en cuenta que he agregado una nueva dimensión a input_shape y también he remodelado xtrain para que tenga una forma tetradimensional.

Comments are closed.