Como faço para implementar corretamente uma regularizer atividade personalizada em Keras?

votos
7

Eu estou tentando implementar autoencoders esparsas de acordo com as notas de aula de Andrew Ng, como mostrado aqui . Isso requer que uma restrição de esparsidade ser aplicado sobre uma camada autoencoder através da introdução de um termo de penalidade (KL divergência). Eu tentei implementar isso usando a orientação dada aqui , depois de algumas pequenas alterações. Aqui é a divergência KL eo termo de penalidade sparsity implementada pela classe SparseActivityRegularizer como mostrado abaixo.

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}

O modelo foi construído como assim

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 eu chamar a função ajuste () recebo valores de perda de negativos e a saída não se assemelha a entrada em tudo. Eu quero saber onde eu estou indo errado. O que é a maneira correta para calcular a ativação média de uma camada e usar este regularizer sparsity personalizado? Qualquer tipo de ajuda será muito apreciada. Obrigado!

Eu estou usando Keras 0.3.1 com Python 2.7 como o mais recente Keras (1.0.1) de construção não tem a camada Autoencoder.

Publicado 28/04/2016 em 10:28
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Você definiu self.p = -0,9 em vez do valor de 0,05 que tanto o cartaz original e a palestra notas que se refere o está usando.

Respondeu 15/01/2017 em 14:52
fonte usuário

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