2017-06-28 1 views
1

Je suis nouveau à des réseaux de neurones et keras et ai de la difficulté à écrire cette fonction personnalisée de perte:fonction de perte personnalisée en Keras avec tensorflow Backend pour les images

loss function

J'utilise tensorflow comme back-end. J'ai vu d'autres exemples et écrit la fonction de perte de cette façon:

from keras import backend as K 
def depth_loss_func(pred_depth,actual_depth): 
    n = pred_depth.shape[0] 
    di = K.log(pred_depth)-K.log(actual_depth) 
    di_sq = K.square(di) 
    sum_d = K.sum(di) 
    sum_d_sq = K.sum(di_sq) 
    loss = ((1/n)*sum_d_sq)-((1/(n*n))*sum_d*sum_d) # getting an error in this step 
    return loss 

L'erreur que je reçois est: TypeError: unsupported operand type(s) for /: 'int' and 'Dimension'

Aussi je ne suis pas sûr de savoir comment incorporer le taux d'apprentissage dans la fonction de perte. Merci de votre aide.

+0

Ne vous mélangez '' pred_depth' et actual_depth' à chaque autre? – Dmitry

Répondre

3

Au lieu d'utiliser « n », qui ne semble pas être la manière la plus élégante, à mon avis, essayez d'utiliser la fonction K.mean:

di = K.log(pred_depth)-K.log(actual_depth) 

di_mean = K.mean(di) 
sq_mean = K.mean(K.square(di)) 

loss = (sq_mean - (lamb*di_mean*di_mean)) # getting an error in this step 
2

La forme du tenseur est inconnue jusqu'à ce que vous alimentiez votre fonction de perte avec une entrée pendant l'exécution du graphique. Afin de calculer dynamiquement la forme à l'exécution, vous pouvez utiliser K.shape().

Modifier la première ligne pour:

n = K.shape(pred_depth)[0] 

En ce qui concerne le taux d'apprentissage, il suffit de passer comme un autre paramètre. S'il est dynamique, vous pouvez y accéder via model.optimizer.lr.get_value().