web-dev-qa-db-fra.com

Erreur Keras: dense_input_1 devrait avoir 3 dimensions

J'essaie un modèle simple en Keras, que je veux prendre en entrée une matrice de taille 5x3. Dans l'exemple ci-dessous, cela est spécifié en utilisant input_shape=(5, 3) lors de l'ajout de la première couche dense.

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import Adam
import numpy as np


model = Sequential()
model.add(Dense(32, input_shape=(5, 3)))
model.add(Activation('relu'))
model.add(Dense(32))
model.add(Activation('relu'))
model.add(Dense(4))


adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)


x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]])


y = model.predict(x)

Cependant, lorsque j'exécute le code, la fonction model.predict() donne l'erreur suivante:

ValueError: Erreur lors de la vérification: dense_input_1 devrait avoir 3 dimensions, mais le tableau a la forme (5, 3)

Mais je ne comprends pas l'erreur. La forme de x est (5, 3), et c'est exactement ce que j'ai dit à la première couche dense à attendre en entrée. Pourquoi attend-il donc trois dimensions? Il semble que cela puisse être lié à la taille du lot, mais je pensais que input_shape Fait uniquement référence à la forme du réseau et n'a rien à voir avec la taille du lot ...

11
Karnivaurus

Le problème réside ici:

model.add(Dense(32, input_shape=(5, 3)))

ça devrait être:

model.add(Dense(32, input_shape=(3,)))

Ce premier exemple de dimension n'est pas inclus dans input_shape. Aussi parce que cela dépend en fait de batch_size Défini lors de l'ajustement du réseau. Si vous souhaitez spécifier, vous pouvez essayer:

model.add(Dense(32, batch_input_shape=(5, 3)))

MODIFIER:

D'après votre commentaire, j'ai compris que vous vouliez que votre entrée ait shape=(5,3) dans ce cas, vous devez:

  1. reshape votre x en définissant:

    x = x.reshape((1, 5, 3))
    

    où la première dimension provient d'exemples.

  2. Vous devez flatten votre modèle à un moment donné. C'est parce que sans cela, vous passerez une entrée 2d Via votre réseau. Je vous conseille de faire ce qui suit:

    model = Sequential()
    model.add(Dense(32, input_shape=(5, 3)))
    model.add(Activation('relu'))
    model.add(Dense(32))
    model.add(Activation('relu'))
    model.add(Flatten())
    model.add(Dense(4))
    
14
Marcin Możejko

Lorsque vous ajoutez une couche Keras à l'aide de la méthode add () de l'API séquentielle, le paramètre input_shape ne se soucie que de la forme de vos données d'entrée, quelle que soit la batch_size. Par conséquent, dans votre cas, vous avez raison d'indiquer à votre modèle que vous souhaitez une forme d'entrée de (5, 3) en spécifiant l'argument input_shape = (5, 3).
. dimensionnelle, la première dimension étant la taille de lot. Vous pouvez faire ceci comme ceci:

x = x [Aucun,:,:]

Je pense que cela devrait résoudre votre problème

0
Whynote