2016-06-10 28 views
7

Sto provando a seguire i Deep Autoencoder Keras example. Sto ottenendo un'eccezione di disallineamento delle dimensioni, ma per la vita di me, non riesco a capire perché. Funziona quando uso solo una dimensione codificata, ma non quando li impilo.Python/Keras/Dimensioni errate di Theano per Deep Autoencoder

eccezione: ingresso 0 è incompatibile con dense_18 strato:
forma atteso = (n, 128), trovato forma = (n, 32) *

L'errore è sulla linea decoder = Model(input=encoded_input, output=decoder_layer(encoded_input))

from keras.layers import Dense,Input 
from keras.models import Model 

import numpy as np 

# this is the size of the encoded representations 
encoding_dim = 32 

#NPUT LAYER 
input_img = Input(shape=(784,)) 

#ENCODE LAYER 
# "encoded" is the encoded representation of the input 
encoded = Dense(encoding_dim*4, activation='relu')(input_img) 
encoded = Dense(encoding_dim*2, activation='relu')(encoded) 
encoded = Dense(encoding_dim, activation='relu')(encoded) 

#DECODED LAYER 
# "decoded" is the lossy reconstruction of the input 
decoded = Dense(encoding_dim*2, activation='relu')(encoded) 
decoded = Dense(encoding_dim*4, activation='relu')(decoded) 
decoded = Dense(784, activation='sigmoid')(decoded) 

#MODEL 
autoencoder = Model(input=input_img, output=decoded) 


#SEPERATE ENCODER MODEL 
encoder = Model(input=input_img, output=encoded) 

# create a placeholder for an encoded (32-dimensional) input 
encoded_input = Input(shape=(encoding_dim,)) 

# retrieve the last layer of the autoencoder model 
decoder_layer = autoencoder.layers[-1] 

# create the decoder model 
decoder = Model(input=encoded_input, output=decoder_layer(encoded_input)) 

#COMPILER 
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy') 
+0

Incredibile come la maggior parte della gente lotta negli stessi punti. Grazie per aver condiviso –

+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25 any suggestions? –

risposta

7

Grazie per il suggerimento da Marcin. Risulta che tutti i livelli del decodificatore devono essere srotolati per farlo funzionare.

# retrieve the last layer of the autoencoder model 
decoder_layer1 = autoencoder.layers[-3] 
decoder_layer2 = autoencoder.layers[-2] 
decoder_layer3 = autoencoder.layers[-1] 

# create the decoder model 
decoder = Model(input=encoded_input, output=decoder_layer3(decoder_layer2(decoder_layer1(encoded_input)))) 
+2

in inglese, cosa significa "srotolamento"? Presumo che i livelli che utilizzano l'API funzionale di Keras siano collegati correttamente, quindi utilizzare solo l'ultimo dovrebbe funzionare. Qualcuno disposto a dare una spiegazione semplice? – OHTO

+1

L'ultimo non funzionerebbe solo perché hai bisogno di qualcosa che trasformi un vettore di dimensione 'encoding_dim' in un vettore di dimensione 784. decoder_layer3 va da encoding_dim * 4 a 784. decoder_layer1 va da encoding_dim a encoding_dim * 2. – Borbag

+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25 any suggestions? –

2

Il problema sta nel:

# retrieve the last layer of the autoencoder model 
decoder_layer = autoencoder.layers[-1] 

Nel modello precedente: l'ultimo livello era l'unico livello del decodificatore. Quindi è stato anche un input per il decoder. Ma ora hai 3 livelli di decodifica, quindi devi tornare al primo per ottenere il primo livello del decodificatore. Quindi, cambiando questa riga in:

# retrieve the last layer of the autoencoder model 
decoder_layer = autoencoder.layers[-3] 

Dovrebbe fare il lavoro.

+0

Non penso che funzionerà, non è necessario applicare la trasformazione da ogni livello di decodificatore, non solo il primo? – memo

+0

In realtà, con la versione 'keras 1.1.1' la mia soluzione funziona perfettamente. E questa era la versione che ho usato in questo momento. Quindi la tua osservazione non è valida. –

+0

oh strano, con keras 2.0.3 non funziona. Ma anche, non capisco come potrebbe funzionare, anche con keras 1.x. Se costruisci un modello di decodificatore con 'decoder = Model (encoded_input, autoencoder.layers [-3] (encoded_input))' stai solo applicando la trasformazione da quel singolo layer. Per costruire il modello di decodificatore completo è necessario applicare le trasformazioni da ogni livello (nel bit del decodificatore), manualmente, come ha fatto @chris, o automaticamente, come ho fatto di seguito. O forse ho frainteso la sintassi dell'API funzionale. – memo

-1

È necessario applicare la trasformazione da ogni livello del decodificatore al precedente. Puoi manualmente srotolare e codificare questi come nella risposta accettata, o il ciclo seguente dovrebbe occuparsene:

# create a placeholder for an encoded (32-dimensional) input 
encoded_input = Input(shape=(encoding_dim,)) 

# retrieve the decoder layers and apply to each prev layer 
num_decoder_layers = 3 
decoder_layer = encoded_input 
for i in range(-num_decoder_layers, 0): 
    decoder_layer = autoencoder.layers[i](decoder_layer) 

# create the decoder model 
decoder = Model(encoded_input, decoder_layer) 
+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25/47847014#47847014 eventuali suggerimenti –