Keras Custom Loss, что вернуть?

Я пытался реализовать пользовательскую функцию потерь для расстояния Махалонобиса. Но это немного сложно реализовать с использованием тензорной операции, поскольку она требует реконструкции ковариационной матрицы:

NN прост, он выводит регрессию скорости. Со значениями скорости xyz я также пытаюсь вывести ковариацию. Поэтому я добавляю еще 6 значений для вывода, и 6 значений являются разложением ковариации по Холецкому.

Сказать,

cholesky = y_pred[0:5,:]
cholesky = low_triangle(cholesky)
velocity = y_pred[6:8,:]

Есть ли способ, которым я могу просто заменить numy на usalbe тензор для потери? K.variable не просто работает.

def myLoss():
    def callBack(y_true, y_pred):
        return lossTest(y_true, y_pred)
    return callBack
def lossTest(y_true, y_pred):
    vel_t = y_true[:,6:9]
    vel_p = y_pred[:,6:9]
    cd = y_pred[:,0:6]
    N = vel_t.shape[0]
    for i in range(0, N):
         sumLoss += getLoss(i, vel_t, vel_p, cd)
    return K.variable(sumLoss)
def getLoss(i, vel_t, vel_p, cd):
    np_Q = getQ(cd[i,:])
    error = vel_t[i,:] - vel_p[i,:]
    np_error = K.eval(error)
    md = getMahal(np_error, np_Q)
    normQ = np.abs(np.linalg.norm(np_Q))
    loss = md + np.log(normQ)
    return loss
def getMahal(error, Q):
    md = np.matmul(error,Q)
    md = np.matmul(md, error)
    return md
def getQ(cd):
    np_cd = K.eval(cd)
    L = np.zeros((3,3))
    L[0,0] = np_cd[0]
    L[1,0] = np_cd[1]
    L[1,1] = np_cd[2]
    L[2,0] = np_cd[3]
    L[2,1] = np_cd[4]
    L[2,2] = np_cd[5]
    Q = np.matmul(L, L.T)
    # Q = np.inverse(Q)
    return Q

0 ответов

Другие вопросы по тегам