2016-04-28 17 views
7

Sto cercando di implementare gli autoencoder sparse in base agli appunti delle lezioni di Andrew Ng come mostrato in here. Richiede che venga applicato un vincolo di sparsità su un livello di autoencoder introducendo un termine di penalità (divergenza K-L). Ho provato a implementarlo utilizzando la direzione fornita here, dopo alcune piccole modifiche. Ecco la divergenza K-L e il termine penalità sparsity implementato dalla classe SparseActivityRegularizer come mostrato di seguito.Come implementare correttamente un regolatore di attività personalizzato in Keras?

def kl_divergence(p, p_hat): 
return (p * K.log(p/p_hat)) + ((1-p) * K.log((1-p)/(1-p_hat))) 

class SparseActivityRegularizer(Regularizer): 
sparsityBeta = None 

    def __init__(self, l1=0., l2=0., p=-0.9, sparsityBeta=0.1): 
     self.p = p 
     self.sparsityBeta = sparsityBeta 

    def set_layer(self, layer): 
     self.layer = layer 

    def __call__(self, loss): 
     #p_hat needs to be the average activation of the units in the hidden layer.  
     p_hat = T.sum(T.mean(self.layer.get_output(True) , axis=0)) 

     loss += self.sparsityBeta * kl_divergence(self.p, p_hat) 
     return loss 

    def get_config(self): 
     return {"name": self.__class__.__name__, 
      "p": self.l1} 

Il modello è stato costruito in questo modo

X_train = np.load('X_train.npy') 
X_test = np.load('X_test.npy') 

autoencoder = Sequential() 
encoder = containers.Sequential([Dense(250, input_dim=576, init='glorot_uniform', activation='tanh', 
    activity_regularizer=SparseActivityRegularizer(p=-0.9, sparsityBeta=0.1))]) 

decoder = containers.Sequential([Dense(576, input_dim=250)]) 
autoencoder.add(AutoEncoder(encoder=encoder, decoder=decoder, output_reconstruction=True)) 
autoencoder.layers[0].build() 
autoencoder.compile(loss='mse', optimizer=SGD(lr=0.001, momentum=0.9, nesterov=True)) 
loss = autoencoder.fit(X_train_tmp, X_train_tmp, nb_epoch=200, batch_size=800, verbose=True, show_accuracy=True, validation_split = 0.3) 
autoencoder.save_weights('SparseAutoEncoder.h5',overwrite = True) 
result = autoencoder.predict(X_test) 

Quando chiamo la funzione fit() ottengo valori delle perdite negativi e l'uscita non assomiglia l'ingresso a tutti. Voglio sapere dove sto andando male. Qual è il modo corretto per calcolare l'attivazione media di un livello e utilizzare questo regolatore di sparsità personalizzato? Qualsiasi tipo di aiuto sarà molto apprezzato. Grazie!

Sto usando Keras 0.3.1 con Python 2.7 poiché l'ultima versione di Keras (1.0.1) non ha il livello di Autoencoder.

+0

https://stackoverflow.com/questions/47859737/keras-error-in-fit-method-expected-model-2-to-have-shape-none-252-252-1-b qualche suggerimento? –

risposta

0

È stato definito self.p = -0,9 invece del valore 0.05 che sta utilizzando sia il poster originale che le note delle lezioni a cui si è fatto riferimento.

+0

https://stackoverflow.com/questions/47859737/keras-error-in-fit-method-expected-model-2-to-have-shape-none-252-252-1-b qualche suggerimento? –