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