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