Разница в функциях потерь в керасах и numpy - PullRequest
0 голосов
/ 17 мая 2019

У меня есть пользовательская потеря, которая добавляет все евклидовы расстояния в координатную матрицу (Nx3), у меня есть одна реализация в numpy и одна в keras, и они дают разные значения, хотя я использую точно такие же соответствующие функции. Numpy версия это то, что должно быть вычислено; может кто-нибудь выяснить, что не так с моей функцией потери.

ОБНОВЛЕНИЕ: после дальнейших экспериментов ошибка, по-видимому, состоит в том, что y_true - y_pred в функции keras не вычисляет поэлементное вычитание, а что-то еще, и я не уверен, почему

РЕДАКТИРОВАТЬ: решено, проблема здесь, похоже, связана с RNG, random_uniform сбрасывается, возможно, когда я вызываю K.eval.

import keras.backend as K
import numpy as np
def euclidLoss(y_true, y_pred):
    #ypred, ytrue are Nx3 cartesian coords
    loss = K.sum(K.sqrt(K.sum(K.square(y_true - y_pred), axis = -1)))
    return loss
#test
y_pred = K.random_uniform(shape=(1, 4, 3), minval = 0, maxval = 10)
y_true= K.random_uniform(shape=(1, 4, 3), minval = 0,maxval =  10)
np_true = K.eval(y_true)
np_pred = K.eval(y_pred)
kappa = (np_pred - np_true)
kappa_squared= np.square(kappa)
kappa_summed = np.sum(kappa_squared, axis = -1)
kappa_rooted = np.sqrt(kappa_summed)
print(np_true)
print(np_pred)
print(np.sum(kappa_rooted))
print(K.eval(euclidLoss(y_true, y_pred)))
...