автоэнкодер keras не сходится

Может кто-нибудь объяснить мне, почему автоэнкодер не сходится? Для меня результаты двух сетей ниже должны быть одинаковыми. Однако автоэнкодер ниже не сходится, тогда как сеть под ним сходится.

# 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)

person lab_rat    schedule 27.08.2015    source источник
comment
stackoverflow.com/questions/47842931/ какие-либо предложения?   -  person Dexter    schedule 16.12.2017


Ответы (2)


Я думаю, что реализация Keras Autoencoder связывает веса кодировщика и декодера, тогда как в вашей реализации кодировщик и декодер имеют разные веса. Если ваша реализация приводит к гораздо лучшей производительности на тестовых данных, это может указывать на то, что для вашей проблемы могут потребоваться несвязанные веса.

person rahulm    schedule 25.10.2015
comment
stackoverflow.com/questions/47842931/ любые предложения - person Dexter; 16.12.2017

В новой версии (0.3.0) Keras больше не привязаны веса в AutoEncoder, и она по-прежнему показывает другую сходимость. Это связано с тем, что веса инициализируются по-разному.

В примере без AE сначала инициализируются веса Dense(32,16), а затем Dense(16,32). В примере AE сначала инициализируются веса Dense(32,16), затем Dense(16,32), а затем, когда вы создаете экземпляр AutoEncoder, снова инициализируются веса Dense(32,16) (self.encoder.set_previous (узел) вызовет build() для инициализации весов).

Теперь следующие две НС сходятся точно так же:

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)
person zhao    schedule 16.12.2015
comment
stackoverflow.com/questions/47842931/ какие-либо предложения? - person Dexter; 16.12.2017