title: How do I correctly implement a custom activity regularizer in Keras?
body: <p>I am trying to implement sparse autoencoders according to Andrew Ng's lecture notes as shown <a href="https://web.stanford.edu/class/cs294a/sparseAutoencoder.pdf" rel="noreferrer">here</a>.
  It requires that a sparsity constraint be applied on an autoencoder layer by introducing a penalty term (K-L divergence). I tried to implement this using the direction provided <a href="https://groups.google.com/forum/#!topic/keras-users/eGMDNni88iw" rel="noreferrer">here</a>, after some minor changes. 
  Here is the K-L divergence and the sparsity penalty term implemented by the SparseActivityRegularizer class as shown below. </p>
  
  <pre><code>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}
  </code></pre>
  
  <p>The model was built like so</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>When I call the fit() function I get negative loss values and the output does not resemble the input at all. I want to know where I am going wrong.  What is the correct way to calculate the average activation of a layer and use this custom sparsity regularizer? Any sort of help will be greatly appreciated. Thanks!</p>
  
  <p>I am using Keras 0.3.1 with Python 2.7 as the latest Keras (1.0.1) build does not have the Autoencoder layer.</p>