2017-10-17 10 views
1

Essayer de construire un modèle de régression de sortie unique, mais il semble être un problème dans la dernière coucheerreur lorsque la cible vérification: time_distributed_5 devrait avoir 3 dimensions, mais se matrice de forme (14724, 1)

inputs = Input(shape=(48, 1)) 
lstm = CuDNNLSTM(256,return_sequences=True)(inputs) 
lstm = Dropout(dropouts[0])(lstm) 

#aux_input 
auxiliary_inputs = Input(shape=(48, 7)) 
auxiliary_outputs = TimeDistributed(Dense(4))(auxiliary_inputs) 
auxiliary_outputs = TimeDistributed(Dense(7))(auxiliary_outputs) 

#concatenate 
output = keras.layers.concatenate([lstm, auxiliary_outputs]) 

output = TimeDistributed(Dense(64, activation='linear'))(output) 
output = TimeDistributed(Dense(64, activation='linear'))(output) 
output = TimeDistributed(Dense(1, activation='linear'))(output) 

model = Model(inputs=[inputs, auxiliary_inputs], outputs=[output]) 

Je suis nouveau à keras ... Je reçois l'erreur suivante

ValueError: Error when checking target: expected time_distributed_5 to have 3 dimensions, but got array with shape (14724, 1)

Répondre

0

Bon les gars, je pense avoir trouvé un correctif Selon - https://keras.io/layers/wrappers/ il est dit que nous appliquons une couche dense à chaque pas de temps (dans mon cas, j'ai 48 timesteps). Ainsi, la sortie de ma couche finale serait (batch_size, dimensions), pas de temps pour ci-dessous:

output = TimeDistributed(Dense(1, activation='linear'))(output) 

sera donc la non-concordance des dimensions (, 48,1?). Cependant, si je veux convertir en sortie de régression simple, nous devrons aplatir la couche TimeDistributed finale

alors j'ai ajouté les lignes suivantes pour le fixer:

output = Flatten()(output) 
output = (Dense(1, activation='linear'))(output) 

maintenant la couche timedistributed aplatit à 49 entrées (ressemble à une entrée de polarisation est inclus) à la couche dense finale dans une seule sortie. OK, le code fonctionne bien et j'obtiens des résultats corrects (le modèle apprend). Mon seul doute est de savoir s'il est mathématiquement acceptable d'aplatir le calque TimeDistributed en un calque dense simple pour obtenir mon résultat comme indiqué ci-dessus?

0

Pouvez-vous fournir un plus sur le contexte de votre problème? Tester des données ou au moins plus de code. Pourquoi choisissez-vous cette architecture en premier lieu? Est-ce qu'une architecture plus simple (juste le LSTM) ferait l'affaire? Que régressez-vous? Empiler plusieurs couches Dense TimeDistributed Dense avec des fonctions d'activation linéaires n'apporte probablement pas grand-chose au modèle.

+0

Oui, vous avez probablement raison. Je pourrais juste utiliser un LSTM mais cela me donnerait des résultats satisfaisants. L'entrée de lstm est une séquence de 48 pas de temps et je veux prédire le pas de temps suivant (le 49ème). Chaque pas de temps vient avec des données supplémentaires (48, 7) (7 caractéristiques) qui sont alimentées via l'entrée auxiliaire. J'essaie de concatter la sortie de lstm avec les sorties auxiliaires. – mojo1643