在python中使用keras的基尼系数

时间:2017-11-01 07:32:59

标签: tensorflow neural-network keras gini

我想用gini系数作为优化函数来计算简单的NN模型。这是我的gini功能:

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)

这就是我编译模型的方式:

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

我总是得到这个错误" ValueError:不支持任何值。",谁能告诉我我的错误是什么?

1 个答案:

答案 0 :(得分:0)

此错误通常用于不可区分的函数。 (当某些var为None且不应该出现时也会发生这种情况。有时候有人忘记将return语句添加到某个地方的自定义函数或类似的东西中。

在你的情况下,它确实是不可区分的。

所有最终值仅来自actual,而actual是常量。 (你的模型不能用这样的功能训练)

var pred是连接到模型权重的那个,但pred在函数中唯一的部分是对actual中的值进行排序。但排序不是一种可区分的行为。

你可能无法做任何事情,因为你的Gini函数确实应该像你一样从actual获取值。