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