  
  # <<< END: from Shoanlu GAN >>> #
  
  
  def generalized_loss_function(y_true, y_pred, var_a=1.0, cnst=1.0/255.0):
      """
      generalized function used to return a large variety of mathematical loss functions
      primary benefit is smooth, differentiable version of L1 loss
  
      Barron, J. A More General Robust Loss Function
 
</s> remove         a: penalty factor. larger number give larger weight to large deviations
        c: scale factor used to adjust to the input scale (i.e. inputs of mean 1e-4 or 256)

 </s> add         alpha: penalty factor. larger number give larger weight to large deviations
        beta: scale factor used to adjust to the input scale (i.e. inputs of mean 1e-4 or 256 ) </s> remove     var_x = y_pred - y_true
    loss = (K.abs(2.0-var_a)/var_a) * (K.pow(K.pow(var_x/cnst, 2.0)/K.abs(2.0-var_a) + 1.0,
                                             (var_a/2.0)) - 1.0)
    return K.mean(loss, axis=-1) * cnst
 </s> add     diff = y_pred - y_true
    second = (K.pow(K.pow(diff/beta, 2.) / K.abs(2.-alpha) + 1., (alpha/2.)) - 1.)
    loss = (K.abs(2.-alpha)/alpha) * second
    loss = K.mean(loss, axis=-1) * beta
    return loss </s> remove def staircase_loss(y_true, y_pred, var_a=16.0, cnst=1.0/255.0):
    """ Keras Staircase Loss """
    height = cnst
    width = cnst
    var_x = K.clip(K.abs(y_true - y_pred) - 0.5 * cnst, 0.0, 1.0)
    loss = height*(K.tanh(var_a*((var_x/width)-tf.floor(var_x/width)-0.5)) /
                   (2.0*K.tanh(var_a/2.0)) + 0.5 + tf.floor(var_x/width))
    loss += 1e-10
    return K.mean(loss, axis=-1)
 </s> add def l_p_norm(y_true, y_pred, p_norm=np.inf):
    """
    Calculate the L-p norm as a loss function,
    valid choics of p are [0,1,no.inf]
    """
    diff = y_true - y_pred
    loss = tf.norm(diff, ord=p_norm, axis=-1)
    return loss


def l_inf_norm(y_true, y_pred):
    """ Calculate the L-inf norm as a loss function """
    diff = K.abs(y_true - y_pred)
    max_loss = K.max(diff, axis=(1, 2), keepdims=True)
    loss = K.mean(max_loss, axis=-1)
    return loss </s> remove         a=1.999999 (lim as a->2), c=1.0/255.0 will give L2 / RMSE loss
 </s> add         a=1.999999 (lim as a->2), beta=1.0/255.0 will give L2 / RMSE loss </s> remove def perceptual_loss(real, fake_abgr, distorted, mask_eyes, vggface_feats, **weights):
 </s> add def perceptual_loss(real, fake_abgr, distorted, vggface_feats, **weights):
def generalized_loss(y_true, y_pred, alpha=1.0, beta=1.0/255.0):
  
  # <<< END: from Shoanlu GAN >>> #
  
  
def generalized_loss(y_true, y_pred, alpha=1.0, beta=1.0/255.0):
      """
      generalized function used to return a large variety of mathematical loss functions
      primary benefit is smooth, differentiable version of L1 loss
  
      Barron, J. A More General Robust Loss Function
keep keep keep keep replace keep keep keep keep keep
 documentation, pep8, style, clarity updates  - Prep for Segmentation (#812)

* documentation, pep8, style, clarity updates

* Update cli.py

* Update _config.py

remove extra mask and coverage

mask type as dropdown

* Update training_data.py

move coverage / LR to global
cut down on loss description

style change
losses working in PR

* simpler logging

* legacy update 
lib/model/losses.py