2016-04-28 10 views
7

Ich versuche, Sparse Autoencoders nach Andrew Ng's Vorlesungsnotizen wie gezeigt here zu implementieren. Es erfordert, dass eine Sparsity-Einschränkung auf eine Autoencoder-Schicht angewendet wird, indem ein Strafterm (K-L-Divergenz) eingeführt wird. Ich habe versucht, dies mit der Richtung here, nach ein paar kleineren Änderungen zu implementieren. Hier sind die K-L-Divergenz und die Sparsity-Penalty-Klausel, die von der SparseActivityRegularizer-Klasse implementiert werden, wie unten gezeigt.Wie kann ich einen benutzerdefinierten Aktivitätsregularizer in Keras korrekt implementieren?

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} 

Das Modell wurde wie so gebaut

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) 

Wenn ich die Passform() Funktion, die ich bekommen negativen Verlustwerte aufrufen und die Ausgabe nicht ähneln überhaupt die Eingabe. Ich möchte wissen, wo ich falsch liege. Was ist die richtige Methode, um die durchschnittliche Aktivierung einer Ebene zu berechnen und diesen benutzerdefinierten Sparsity-Regularizer zu verwenden? Jede Art von Hilfe wird sehr geschätzt. Vielen Dank!

Ich benutze Keras 0.3.1 mit Python 2.7 als die neueste Keras (1.0.1) Build hat nicht die Autoencoder-Schicht.

+0

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

Antwort

0

Sie haben self.p = -0,9 anstelle des Werts von 0,05 definiert, den das ursprüngliche Poster und die Vorlesungsnotizen, auf die Sie sich bezogen haben, verwenden.

+0

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