在 keras 中计算 micro F-1 分数

问题描述

我有一个包含 15 个不平衡类的数据集,并尝试使用 keras 进行多标签分类。

我正在尝试使用微型 F-1 分数作为衡量标准。

我的模型:

# Create a VGG instance
model_vgg = tf.keras.applications.VGG19(weights = 'imagenet',pooling = 'max',include_top = False,input_shape = (512,512,3))

# Freeze the layers which you don't want to train. 
for layer in model_vgg.layers[:-5]:
layer.trainable = False

# Adding custom Layers 
x = model_vgg.output
x = Flatten()(x)
x = Dense(1024,activation = "relu")(x)
x = Dropout(0.5)(x)
x = Dense(1024,activation = "relu")(x)
predictions = Dense(15,activation = "sigmoid")(x)

# creating the final model 
model_vgg_final = Model(model_vgg.input,predictions)

# Print the summary
model_vgg_final.summary()

对于 F1 分数,我使用来自 this question

的自定义指标
from keras import backend as K

def f1(y_true,y_pred):
    def recall(y_true,y_pred):
        """Recall metric.

    Only computes a batch-wise average of recall.

    Computes the recall,a metric for multi-label classification of
    how many relevant items are selected.
    """
    true_positives = K.sum(K.round(K.clip(y_true * y_pred,1)))
    possible_positives = K.sum(K.round(K.clip(y_true,1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

    def precision(y_true,y_pred):
        """Precision metric.

    Only computes a batch-wise average of precision.

    Computes the precision,a metric for multi-label classification of
    how many selected items are relevant.
    """
    true_positives = K.sum(K.round(K.clip(y_true * y_pred,1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred,1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

    precision = precision(y_true,y_pred)
    recall = recall(y_true,y_pred)
    return 2*((precision*recall)/(precision+recall+K.epsilon()))

我在编译模型时使用二元交叉熵和自定义 F-1

# Compile a model
model_vgg_final.compile(optimizer = 'adam',loss = 'binary_crossentropy',metrics = [f1]) 

我监控 F-1 是否提前停止

# Early stopping
early_stopping = EarlyStopping(monitor = 'f1',patience = 5)

# Training the model
history_vgg = model_vgg_final.fit(train_generator,steps_per_epoch = 10,epochs = 30,verbose = 1,callbacks = [early_stopping],validation_data = valid_generator)

如何更新此自定义函数并获取 micro F-1 作为指标?也感谢有关我的方法的提示。

scikit-learn documentation 中有信息,但不确定如何将其合并到 keras 中

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)