2017-11-01 3 views
0

Ich möchte einfaches NN-Modell mit Gini-Koeffizienten als seine Optimiererfunktion berechnen. Hier ist die meine gini Funktion:Gini-Koeffizient mit Keras in Python

def gini(actual, pred): 
    nT = K.shape(actual)[-1] 
    n = K.cast(nT, dtype='int32') 
    inds = K.reverse(tf.nn.top_k(pred, n)[1], axes=[0]) 
    a_s = K.gather(actual, inds) 
    a_c = K.cumsum(a_s) 
    n = K.cast(nT, dtype=K.floatx()) 
    giniSum = K.cast(K.sum(a_c)/K.sum(a_s), dtype=K.floatx()) - (n + 1)/2.0 

    return giniSum/n 


def gini_normalized(a, p): 
    return gini(a, p)/gini(a, a) 

Und das ist, wie ich mein Modell kompilieren:

model = Sequential() 
    model.add(Dense(32, input_shape=(60,))) 
    model.add(Activation('relu')) 
    model.add(Dense(2, activation='softmax')) 

    sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
    model.compile(loss=gini_normalized, optimizer=sgd) 

    return model 

ich immer erhalte diese Störung „Valueerror:. Keine Werte nicht unterstützt“, kann mir jemand sagen, was ist mein Fehler?

Antwort

0

Dieser Fehler ist typisch für Funktionen, die nicht differenzierbar sind. (Es kommt auch vor, wenn einige Var None ist und nicht sein sollte. Manchmal ist es der Fall, dass jemand vergessen hat, die return-Anweisung zu einer benutzerdefinierten Funktion irgendwo oder etwas hinzuzufügen).

In Ihrem Fall ist es in der Tat nicht differenzierbar.

Alle endgültigen Werte kommen nur von actual, und actual ist konstant. (Ihr Modell kann nicht mit einer solchen Funktion trainiert werden)

Die var pred diejenige ist, die dem Muster der Gewichte verbunden ist, aber der einzige Teil, pred wird in der Funktion zu nehmen ist, die Werte in actual Sortierung. Aber Sortieren ist keine differenzierbare Aktion.

Es gibt wahrscheinlich nichts, was Sie dagegen tun können, da Ihre Gini-Funktion in der Tat Werte von actual nehmen sollte, wie Sie getan haben.