2015-08-27 16 views
6

Czy ktoś mógłby mi wyjaśnić, dlaczego autoencoder się nie konwerguje? Dla mnie wyniki dwóch poniższych sieci powinny być takie same. Jednak autoenoder poniżej nie jest zbieżny, natomiast sieć pod nim jest.autoencoder keras not converging

# 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 żadnych sugestii? –

Odpowiedz

2

myślę realizacja Keras za Autoencoder Opaski te ciężary kodera i dekodera, natomiast w implementacji, koder i dekoder mają oddzielne ciężarów. Jeśli twoja implementacja prowadzi do znacznie lepszej wydajności danych testowych, może to wskazywać, że niepowiązane wagi mogą być potrzebne dla twojego problemu.

+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none2525 wszelkie sugestie: –

2

Nowa wersja (0.3.0) Keras nie ma już powiązanej wagi w AutoEncoder i nadal pokazuje inną zbieżność. Jest tak dlatego, że wagi są inicjowane inaczej.

W przykładzie innym niż AE najpierw inicjuje się gęste (32,16) masy, a następnie Gęstość (16,32). W przykładzie AE najpierw inicjowane są Gęste (32,16) wagi, a następnie Gęstość (16,32), a następnie, po utworzeniu instancji AutoEncoder, masy o dużej gęstości (32,16) są inicjowane ponownie (self.encoder.set_previous (węzeł) wywoła funkcję build(), aby zainicjować wagi).

Teraz dwóch następujących NNS zbiegają się dokładnie tak samo:

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 żadnych sugestii? –

Powiązane problemy