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.

Forma de entrada para una RNN en Keras

Mi conjunto de datos tiene las siguientes formas:

y_train.shape, y_val.shape
((265, 2), (10, 2))

x_train.shape, x_val.shape
((265, 4), (10, 4))

Estoy tratando de usar un modelo RNN simple

modelo = models.Sequential([layers.SimpleRNN(20, input_shape=(None,4), return_sequences=True),
layers.SimpleRNN(20, return_sequences=True),
layers.SimpleRNN(2),
])

modelo.compile(optimizer=”Adam”,
loss=tf.keras.losses.MeanSquaredError(),
metrics=[“accuracy”])

La imagen en el enlace muestra el modelo:

Enlace a la imagen

El problema aparece cuando ajusto el modelo a los datos:

historia = modelo.fit(x_train, y_train,
epochs=20,
validation_data=(x_val, y_val),
verbose=2)

Obtengo el siguiente error:

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

Creo que está relacionado con la entrada… pero no entiendo qué.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que la forma de entrada del modelo no es compatible con los datos de entrada. Específicamente, el modelo espera un tensor de entrada de 3D (con forma (tamaño_lote, pasos_tiempo, dimensión_entrada)), pero recibe un tensor de 2D durante el entrenamiento (con forma (tamaño_lote, dimensión_entrada)).

    Al analizar el código, se establece el argumento input_shape en la primera capa SimpleRNN como (None, 4), lo que significa que las secuencias de entrada pueden tener cualquier longitud (None) y cada elemento de la secuencia tiene 4 características. Sin embargo, los tensores x_train y x_val tienen forma (tamaño_lote, 4), lo cual corresponde a un solo elemento en las secuencias.

    Para resolver este problema, debemos reconfigurar los tensores de entrada para tener una tercera dimensión que represente la longitud de la secuencia. Esto se puede lograr utilizando la función reshape de numpy:

    x_train = x_train.reshape(-1, 1, 4)
    x_val = x_val.reshape(-1, 1, 4)
    

    Esto reconfigurará los tensores para que tengan forma (tamaño_lote, 1, 4), donde 1 representa la longitud de la secuencia.

    Ahora podemos ajustar el modelo a los datos utilizando los tensores de entrada actualizados:

    history=model.fit(x_train,y_train,
                     epochs=20,
                     validation_data=(x_val,y_val),
                     verbose=2)
    

    Esto debería resolver el ValueError y permitir que el modelo se entrene con los datos de entrada.

Comments are closed.