2017-06-08 2 views
5

Ich habe das Tutorial "Building Autoencoder in Keras" gefolgt: https://blog.keras.io/building-autoencoders-in-keras.htmlWie Daten aus der Tiefe in Autoencoder Keras (Unklarheit in Tutorial) codiert decodieren

Die erste, einfache Lösung funktioniert gut. Aber im Abschnitt "Deep Autoencoder" scheint der im Tutorial bereitgestellte Code nicht vollständig zu funktionieren.

Hier ist mein Code (nur bis wo das Problem erscheint), die gerade aus dem turorial kopiert wird:

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

encoding_dim = 32 

input_img = Input(shape=(784,)) 
encoded = Dense(128, activation='relu')(input_img) 
encoded = Dense(64, activation='relu')(encoded) 
encoded = Dense(32, activation='relu')(encoded) # Multiple encoding 
decoded = Dense(64, activation='relu')(encoded) # and decoding layers. 
decoded = Dense(128, activation='relu')(decoded) 
decoded = Dense(784, activation='sigmoid')(decoded) 

autoencoder = Model(input_img, decoded) 

encoder = Model(input_img, encoded) 

encoded_input = Input(shape=(encoding_dim,)) 
decoder_layer = autoencoder.layers[-1] 
decoder = Model(encoded_input, decoder_layer(encoded_input)) # Crash happens here. 

ich diesen Fehler:

Traceback (most recent call last): 
    File "keras_test.py", line 20, in <module> 
    decoder = Model(encoded_input, decoder_layer(encoded_input)) # Crash happens here 
    File "/Users/paulmagnus/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/keras/engine/topology.py", line 569, in __call__ 
    self.assert_input_compatibility(inputs) 
    File "/Users/paulmagnus/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/keras/engine/topology.py", line 479, in assert_input_compatibility 
    ' but got shape ' + str(x_shape)) 
ValueError: Input 0 is incompatible with layer dense_6: expected axis -1 of input shape to have value 128 but got shape (None, 32) 

Ich vermute, dass decoder ist verbunden mit der falschen Dekodierschicht und/oder dass die Form seiner Eingabe oder Ausgabe falsch ist. Aber was soll ich dagegen tun?

Die decoder ist nicht notwendig für die autoencoder zu arbeiten. Ich kann das Lernen durchführen und die Bilder codieren, die dem Rest des Tutoriums folgen. Aber ohne decoder kann ich die Bilder nicht im Originalformat dekodieren, um zu sehen, ob sie tatsächlich gut aussehen. Das Tutorial erwähnt nichts darüber und zeigt nur die decodierten Bilder ohne ein Wort. Ich nehme an, der Autor hat angenommen, dass jede Änderung, die er an decoder vorgenommen hat, um dies zu erreichen, trivial war.

Zur Klarstellung: die Single-Layer-Version funktioniert gut, wo anstelle von 3-Codierung und Decodierung 3 Schichten wir

encoded = Dense(32, activation='relu')(input_img) 
decoded = Dense(784, activation='sigmoid')(encoded) 

und alles andere ist, wie oben gleich haben gerade. Dann gibt es keinen Fehler und ich kann decoder verwenden, um die Bilder neu zu erstellen.

+0

Hallo PaulMag; Ich denke Ihre Frage ist Code-bezogen und über das Debuggen Ihres Keras-Modell-Setups, nicht so sehr über Statistiken oder tiefe Lerntechniken. Wenn dies der Fall ist, ist es besser mit der "Mission" von StackOverflow verbunden, nicht mit CrossValidated. – fnl

+0

@fnl Ja, Sie haben Recht. Ich war mir nicht sicher, auf welcher Plattform ich das fragen sollte. Soll ich es auf StackOverflow repost und lösche es aus CrossValidated? – PaulMag

+1

Ich habe gerade herausgefunden, dass Migration eine Sache ist. Ich habe diese Frage für die Migration zu StackOverflow markiert. – PaulMag

Antwort

11
decoder_layer = autoencoder.layers[-1] 
decoder = Model(encoded_input, decoder_layer(encoded_input)) 

Dieser Code funktioniert für einlagige, da nur letzte Schicht Decoder ist in diesem Fall und

decoder_layer = autoencoder.layers[-1] 

diese Linie fordert letzte Schicht.

Bei 3-Layer Encodern und Decodern müssen alle 3 Layer zum Definieren des Decoders aufgerufen werden. Ich machte das gleiche Tutorial, also habe ich den Code so geschrieben.

encoded_input = Input(shape=(encoding_dim,)) 

deco = autoencoder.layers[-3](encoded_input) 
deco = autoencoder.layers[-2](deco) 
deco = autoencoder.layers[-1](deco) 
# create the decoder model 
decoder = Model(encoded_input, deco). 

es funktioniert jetzt gut.

+0

Danke. Es macht Sinn, aber ich hätte es nicht erraten. Ich dachte, wir hätten diese Schichten bereits miteinander verbunden. Das ist ein großes Loch im Tutorial. – PaulMag

Verwandte Themen