def jsDivergence( targetReal, targetInft, predReal, predInft ): m = td.multiply( 0.5, 0.0, *td.add( targetReal, targetInft, predReal, predInft ) ) tpart = td.multiply( targetReal, targetInft, *td.log( *td.divide( targetReal, targetInft, *m ) ) ) ppart = td.multiply( predReal, predInft, *td.log( *td.divide( predReal, predInft, *m ) ) ) return td.multiply( 0.5, 0.0, *td.add( *tpart, *ppart ) )
def klDivergence( targetReal, targetInft, predReal, predInft ): return td.multiply( targetReal, targetInft, *td.log( *td.divide( targetReal, targetInft, predReal, predInft ) ) )
def crossEntropy( targetReal, targetInft, predReal, predInft ): return td.multiply( *td.neg( targetReal, targetInft ), *td.log( predReal, predInft ) )
def hinge( targetReal, targetInft, predReal, predInft ): t = tf.math.sign( targetReal ) loss = td.subtract( 1.0, 0.0, *td.multiply( predReal, predInft, t, 0.0 ) ) return td.where( tf.greater( loss[ 0 ], 0.0 ), *loss, 0.0, 0.0 )
def huber( targetReal, targetInft, predReal, predInft, delta=1.0 ): diff = td.subtract( targetReal, targetInft, predReal, predInft ) ltd = td.multiply( *td.subtract( *diff, 0.5 * delta, 0.0 ), delta, 0.0 ) full = td.multiply( *td.power( *diff, 2.0, 0.0 ), 0.5, 0.0 ) return td.where( tf.greater( diff[ 0 ], delta ), *ltd, *full )
def leaky(real, inft, p=0.01): low = td.multiply(real, inft, p, 0.0) return td.where(tf.greater(real, 0.0), real, inft, *low)