2015-08-27 8 views
6

Könnte mir bitte jemand erklären, warum der Autoencoder nicht konvergiert? Für mich sollten die Ergebnisse der beiden unten aufgeführten Netzwerke gleich sein. Der Autoencoder unten konvergiert jedoch nicht, während das Netzwerk darunter liegt.keras autoencoder konvergiert nicht

# autoencoder implementation, does not converge 
autoencoder = Sequential() 
encoder = containers.Sequential([Dense(32,16,activation='tanh')]) 
decoder = containers.Sequential([Dense(16,32)]) 
autoencoder.add(AutoEncoder(encoder=encoder, decoder=decoder, 
         output_reconstruction=True)) 
rms = RMSprop() 
autoencoder.compile(loss='mean_squared_error', optimizer=rms) 

autoencoder.fit(trainData,trainData, nb_epoch=20, batch_size=64, 
      validation_data=(testData, testData), show_accuracy=False) 

# non-autoencoder implementation, converges 

model = Sequential() 
model.add(Dense(32,16,activation='tanh')) 
model.add(Dense(16,32)) 
model.compile(loss='mean_squared_error', optimizer=rms) 

model.fit(trainData,trainData, nb_epoch=numEpochs, batch_size=batch_size, 
      validation_data=(testData, testData), show_accuracy=False) 
+0

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

Antwort

2

denke ich Keras der Autoencoder Umsetzung der Gewichte des Encoder und Decoder bindet, während bei der Implementierung, der Encoder und Decoder getrennte Gewichte haben. Wenn Ihre Implementierung zu einer wesentlich besseren Leistung der Testdaten führt, kann dies darauf hindeuten, dass für Ihr Problem möglicherweise nicht gebundene Gewichtungen erforderlich sind.

+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25 keine Vorschläge –

2

Die neue Version (0.3.0) von Keras hat im AutoEncoder keine Gewichte mehr und es zeigt immer noch eine andere Konvergenz. Dies liegt daran, dass Gewichtungen anders initialisiert werden.

Im Nicht-AE-Beispiel werden zuerst die Dichtewerte (32,16) initialisiert, gefolgt von Dichte (16,32). Im AE-Beispiel werden zuerst die Gewichtungen "Dichte" (32,16) initialisiert, gefolgt von "Dichte" (16,32). Wenn Sie die AutoEncoder-Instanz erstellen, werden die Gewichtungen "Dichte" (32,16) erneut initialisiert (self.encoder.set_previous (node) ruft build() auf, um die Gewichte zu initialisieren.

nun die folgenden zwei NNs konvergieren genau das gleiche:

autoencoder = Sequential() 
encoder = containers.Sequential([Dense(32,16,activation='tanh')]) 
decoder = containers.Sequential([Dense(16,32)]) 
autoencoder.add(AutoEncoder(encoder=encoder, decoder=decoder, 
         output_reconstruction=True)) 
rms = RMSprop() 
autoencoder.compile(loss='mean_squared_error', optimizer=rms) 
np.random.seed(0) 
autoencoder.fit(trainData,trainData, nb_epoch=20, batch_size=64, 
      validation_data=(testData, testData), show_accuracy=False) 

# non-autoencoder 
model = Sequential() 
model.add(Dense(32,16,activation='tanh')) 
model.add(Dense(16,32)) 
model.set_weights(autoencoder.get_weights()) 
model.compile(loss='mean_squared_error', optimizer=rms) 
np.random.seed(0) 
model.fit(trainData,trainData, nb_epoch=numEpochs, batch_size=batch_size, 
      validation_data=(testData, testData), show_accuracy=False) 
+0

https://StackOverflow.com/questions/47842931/valueerror-error-when-checking-target-erwartet-model-2-to-have-shape-none-25 keine Vorschläge? –