def call(self, inputs, training=None):
    if 0. < self.rate < 1.:
      noise_shape = self._get_noise_shape(inputs)
      alpha = 1.6732632423543772848170429916717
      scale = 1.0507009873554804934193349852946

      def dropped_inputs(inputs=inputs, rate=self.rate, seed=self.seed):
        alpha_p = -alpha * scale
        kept_idx = K.greater_equal(K.random_uniform(noise_shape, seed=seed),
                                   rate)
        kept_idx = K.cast(kept_idx, K.floatx())
        a = ((1 - rate) * (1 + rate * alpha_p ** 2)) ** -0.5
        b = -a * alpha_p * rate
        x = inputs * kept_idx + alpha_p * (1 - kept_idx)
        return a * x + b

      return K.in_train_phase(dropped_inputs, inputs, training=training)
    return inputs