Коэффициент Джини с керасом в питоне

Я хочу вычислить простую модель 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

Я всегда получаю эту ошибку "ValueError: Ни одно значение не поддерживается.", Может кто-нибудь сказать мне, в чем моя ошибка?

1 ответ

Эта ошибка характерна для функций, которые нельзя дифференцировать. (Это также происходит, когда некоторые вар None и не должно быть. Иногда бывает, что кто-то забыл добавить return заявление к пользовательской функции где-то или что-то подобное).

В вашем случае это не дифференцируемо, действительно.

Все окончательные значения поступают только от actual, а также actual постоянно. (Ваша модель не может быть обучена с такой функцией)

Вар pred это тот, который связан с весами модели, но единственная часть, которая pred принимает в функции сортировку значений в actual, Но сортировка не является дифференцируемым действием.

Вы, вероятно, ничего не можете с этим поделать, так как ваша функция Gini действительно должна принимать значения из actual как ты.

Другие вопросы по тегам