def predict(self, xReal, xInft):
     '''X should be rank 2 tensor'''
     yReal, yInft = td.add(
         *td.tensordot(xReal, xInft, self.weight_, self.wInft_), self.bias_,
         self.bInft_)
     yInft = tf.transpose(yInft, [0, 2, 1])
     return self.outputActivation_(yReal, yInft)
 def partial_fit(self, xReal, xInft, yReal, yInft):
     '''Perform single round of training without reset. Returns average loss and gradient.'''
     pred = self.trainGrad_(xReal, xInft, yReal, yInft)
     reg = self.regularizeGrad_()
     loss = td.add(*pred, *reg)
     self.weight_ = self.wUpdate_(
         self.weight_, tf.reshape(loss[1][1:], self.weight_.shape))
     self.bias_ = self.bUpdate_(self.bias_,
                                tf.reshape(loss[1][0:1], self.bias_.shape))
     return loss
def mae( targetReal, targetInft, predReal, predInft ):
    diff = td.subtract( targetReal, targetInft, predReal, predInft )
    return td.abs( *diff )
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 mse( targetReal, targetInft, predReal, predInft ):
    diff = td.subtract( targetReal, targetInft, predReal, predInft )
    return td.power( *diff, 2.0, 0.0 )
def softmax(real, inft, t=1):
    raw = td.exp(*td.divide(real, inft, t, 0.0))
    cs = td.sum(*raw, -1)
    return td.divide(*raw, *cs)
def tanh(real, inft):
    return td.tanh(real, inft)
def logistic(real, inft):
    return td.divide(1.0, 0.0, *td.add(1.0, 0.0, *td.exp(-real, -inft)))
def elu(real, inft):
    low = td.subtract(*td.exp(real, inft), 1.0, 0.0)
    return td.where(tf.greater(real, 0.0), real, inft, *low)
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)
def relu(real, inft):
    return td.where(tf.greater(real, 0.0), real, inft, 0.0, 0.0)
def softplus(real, inft):
    return td.log(*td.add(*td.exp(real, inft), 1.0, 0.0))