2017-10-19 20 views
0

Dans Keras, j'essaie de comprendre comment calculer une métrique ou une perte personnalisée qui filtre ou masque certaines valeurs afin qu'elles ne contribuent pas à la valeur retournée. Je suis bloqué sur comment obtenir une tranche tensorielle ou comment itérer avec un if: sur les valeurs du tenseur pour sélectionner les valeurs d'intérêt. Il se trouve que j'utilise le backend Tensorflow mais que je voudrais faire quelque chose de portable.Comment écrire une métrique personnalisée Keras qui filtre ou masque certaines valeurs?

Ci-joint une esquisse de ce que je suis en train de faire, mais il jette l'erreur: TypeError: 'Tensor' object does not support item assignment

def my_filtered_mse(y_true, y_pred): 
     #Return Mean Squared Error for a subset of values 
     error = y_pred - y_true 
     error[y_true == 0.0] = 0 #Don't include errors when y_true is zero 
     # The previous like throws the error : TypeError: 'Tensor' object does not support item assignment 
     return K.mean(K.square(error)) 

#...other stuff ... 

    model.compile(optimizer=optimizers.adam(), 
     loss='mean_squared_error', 
     metrics=[my_filtered_mse]) 

Répondre

1

L'échec se produit dans cette ligne:

error[y_true == 0.0] = 0 #Don't include errors when y_true is zero 

Parce que error est un tenseur , qui ne prend pas en charge l'affectation d'éléments. Vous pouvez changer cela pour:

error = tf.gather(error, tf.where(tf.not_equal(y_true, 0.0)))