基尼系数与蟒蛇中的keras



我想用基尼系数作为其优化器函数来计算简单的 NN 模型。这是我的基尼函数:

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

我总是收到此错误"值错误:不支持无值",谁能告诉我我的错误是什么?

此错误对于不可微分的函数是典型的。(当某些 var None并且不应该被时,也会发生这种情况。有时有人忘记将 return 语句添加到某处的自定义函数或类似的东西中)。

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

所有的最终值都只来自actualactual是常数。(你的模型不能用这样的函数训练)

var pred 是连接到模型权重的变量,但 pred 在函数中采用的唯一部分是对 actual 中的值进行排序。但排序不是一个可区分的操作。

您可能对此无能为力,因为您的Gini函数确实应该像您一样从actual中获取值。

相关内容

  • 没有找到相关文章

最新更新