具有Keras的二元分类模型中的类权重

时间:2017-04-13 10:45:26

标签: classification keras

我们知道我们可以在二元分类模型中的不平衡数据的拟合方法中传递类权重字典。我的问题是,当在输出层中仅使用1个节点进行sigmoid激活时,我们是否仍然可以在训练期间应用类权重?

model = Sequential()
model.add(Dense(64, activation='tanh',input_shape=(len(x_train[0]),)))
model.add(Dense(1, activation='sigmoid')) 

model.compile(
    optimizer=optimizer, 
    loss=loss, 
    metrics=metrics)

model.fit(
    x_train, y_train, 
    epochs=args.e, 
    batch_size=batch_size,
    class_weight={0: 1, 1: 3})

1 个答案:

答案 0 :(得分:4)

如果你想完全控制这个重量,为什么不写一个自定义损失函数?

from keras import backend as K
def weighted_binary_crossentropy( y_true, y_pred, weight=1. ) :
    y_true = K.clip(y_true, K.epsilon(), 1)
    y_pred = K.clip(y_pred, K.epsilon(), 1)
    logloss = -(y_true * K.log(y_pred) * weight + (1 - y_true) * K.log(1 - y_pred))
    return K.mean( logloss, axis=-1)