2015-08-27 4 views
6

Quelqu'un peut-il m'expliquer pourquoi l'autoencoder ne converge pas? Pour moi, les résultats des deux réseaux ci-dessous devraient être les mêmes. Cependant, l'autoencoder ci-dessous ne converge pas, alors que le réseau en dessous l'est.keras autoencoder non convergent

# 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 aucune suggestion? –

Répondre

2

Je pense Autoencoder de la mise en œuvre Keras lie les poids du codeur et décodeur, alors que dans votre mise en œuvre, le codeur et décodeur ont des poids séparés. Si votre implémentation conduit à de meilleures performances sur les données de test, cela peut indiquer que des poids non liés peuvent être nécessaires pour votre problème.

+0

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

2

La nouvelle version (0.3.0) de Keras n'a plus de poids liés dans AutoEncoder, et elle montre encore une convergence différente. C'est parce que les poids sont initialisés différemment.

Dans l'exemple non AE, les poids Dense (32,16) sont initialisés en premier, suivi de Dense (16,32). Dans l'exemple AE, les poids Dense (32,16) sont d'abord initialisés, suivis de Dense (16,32), puis lorsque vous créez l'instance AutoEncoder, les poids Dense (32,16) sont initialisés à nouveau (self.encoder.set_previous (node) appellera build() pour initialiser les poids).

Maintenant, les deux convergent vers les réseaux neuronaux exactement les mêmes suivants:

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-expected-model-2-to-have-shape-none-25 Des suggestions? –