2016-06-10 41 views
7

Staram się śledzić Głębokie Autoencoder Keras example. Dostaję wyjątek niedopasowania wymiarów, ale dla mojego życia nie mogę zrozumieć dlaczego. Działa, gdy używam tylko jednego zakodowanego wymiaru, ale nie wtedy, gdy je stosuję.Python/Keras/Theano niewłaściwe wymiary Deep Autoencoder

Wyjątek: wejściowy 0 jest niezgodna z warstwy dense_18:
oczekiwany kształt = (brak, 128), znaleziono kształt = (brak, 32) *

Błąd jest na linii 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

Niesamowite jak najbardziej ludzie walczą w tych samych punktach. Dzięki za podzielenie –

+0

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

Odpowiedz

7

Dzięki za podpowiedź z Marcinem. Okazuje się, że wszystkie warstwy dekodera muszą zostać rozwinięte, aby mogło działać.

# 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

w prostym języku angielskim, co to znaczy "rozwijanie" oznacza? Zakładam, że warstwy korzystające z funkcjonalnego API Keras są poprawnie połączone, więc użycie tylko ostatniego powinno działać. Czy ktoś chce udzielić prostego wyjaśnienia? – OHTO

+1

Ten ostatni nie zadziałałby, ponieważ potrzebujesz czegoś, co przekształci wektor wymiaru "encoding_dim" na wektor wymiaru 784. Sam dekoder_layer3 przechodzi od encoding_dim * 4 do 784. Sam dekoder_layer1 przechodzi od encoding_dim do encoding_dim * 2. – Borbag

+0

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

2

problem polega na:

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

W poprzednim modelu - ostatnia warstwa była jedyną warstwą dekodera. Więc wejście to było również wejściem do dekodera. Ale teraz masz 3 warstwę dekodującą, więc musisz wrócić do pierwszej, aby uzyskać pierwszą warstwę dekodera. Więc zmieniając tę ​​linię na:

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

Powinien wykonać pracę.

+0

Nie sądzę, że to zadziała, czy nie musisz zastosować transformacji z każdej warstwy dekodera, a nie tylko pierwszej? – memo

+0

Właściwie - w wersji 'keras 1.1.1' moje rozwiązanie działa idealnie. I to była wersja, której używałem w tym czasie. Twoja uwaga jest nieważna. –

+0

oh dziwne, z keras 2.0.3 to nie działa. Ale także, nie rozumiem, jak to mogło działać, nawet z kerasami 1.x. Jeśli tworzysz model dekodera z 'dekoder = Model (encoded_input, autoencoder.layers [-3] (encoded_input))' stosujesz transformację tylko z tej jednej warstwy. Aby zbudować pełny model dekodera, musisz zastosować transformacje z każdej warstwy (w bicie dekodera), ręcznie, jak to zrobił @chris, lub automatycznie, tak jak to zrobiłem poniżej. A może źle zrozumiałem składnię funkcjonalnego interfejsu API. – memo

-1

Musisz zastosować transformację z każdej warstwy dekodera do poprzedniej. Można ręcznie rozwinąć i trudno je jako kod w przyjętym odpowiedź, lub następująca pętla powinna dbać o to:

# 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 wszelkie sugestie –