keras autoencoder não convergindo

votos
6

Alguém poderia me explicar por que o autoencoder não está convergindo? Para mim, os resultados das duas redes a seguir deve ser o mesmo. No entanto, o autoencoder abaixo não está convergindo, ao passo que, a rede sob ela é.

# 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)
Publicado 27/08/2015 em 06:34
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Acho implementação Autoencoder de Keras une os pesos do codificador e decodificador, ao passo que em sua implementação, o codificador eo decodificador têm pesos distintos. Se sua implementação está levando a um desempenho muito melhor nos dados de teste, em seguida, isso pode indicar que os pesos-amarrado un podem ser necessários para o seu problema.

Respondeu 25/10/2015 em 06:44
fonte usuário

votos
2

A nova versão (0.3.0) do Keras não amarrou pesos no AutoEncoder, e ele ainda mostra convergência diferente. Isto é porque os pesos são inicializadas de forma diferente.

No exemplo não-AE, denso (32,16) pesos são inicializados em primeiro lugar, seguido por uma densa (16,32). No exemplo AE, denso (32,16) pesos são inicializados em primeiro lugar, seguido por uma densa (16,32), e, em seguida, ao criar a instância AutoEncoder, denso (32,16) são inicializados pesos novamente (self.encoder.set_previous (nó) vai ligar de compilação () para inicializar pesos).

Agora, os dois NNs seguintes convergem exatamente o mesmo:

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)
Respondeu 16/12/2015 em 05:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more