2017-10-06 5 views
0

Ich habe Probleme beim Hinzufügen einer Strafe zu binary_crossentropy. Die Idee besteht darin, die Verlustfunktion zu bestrafen, wenn der Mittelwert vordefinierter Fehlergruppen einen bestimmten Schwellenwert überschreitet. Unten ist die Hilfsfunktion, die die Maske nimmt, die die Gruppen und die bereits berechnete Crossentropie ausdrückt. Es wird einfach die Anzahl der Male zurückgeben, die ein Schwellenwert überschritten wurde, um die tatsächliche Verlustfunktion, die es aufruft, zu bestrafen.Problem mit benutzerdefinierten Verlustfunktion in Keras

def penalty(groups_mask, binary_crossentropy): 
    errors = binary_crossentropy 
    unique_groups = set(groups_mask) 
    groups_mask = np.array(groups_mask) 
    threshold = # whatever 
    c = 0 
    for group in unique_groups: 
     error_mean = K.mean(errors[(groups_mask == group).nonzero()], axis=-1) 
     if error_mean > threshold: 
     c += 1 
    return c 

Das Problem ist, dass error_mean nicht ein Skalar ist, und ich kann nicht auf einfache Weise herausfinden, es Schwelle zu vergleichen.

+0

Ich kann wirklich verstehe nicht, was du in dieser Zeile erreichen willst: 'error_mean = K.mean (errors [(groups_mask == group) .nonzero()], axis = -1)' –

Antwort

2

Sie müssen alles tun, mit Tensoren und Funktionen aus den keras backend

import keras.backend as K 

In der Zeile des Fehlers müssen Sie die Dinge vergleichen, auch jene Funktionen:

.... 
c = K.variable([0]) 
..... 
..... 
    errorGreater = K.cast(K.greater(error_mean,threshold), K.floatx()) 
    c+=K.max(errorGreater) #if error_mean is 1 element only, you can just c+=errorGreater. 
+0

Ich denke, theano erlaubt dir, 'cast 'nicht zu verwenden '. –

Verwandte Themen