首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确输出精度,召回和f1score的角点?

如何正确输出精度,召回和f1score的角点?
EN

Stack Overflow用户
提问于 2020-05-05 04:40:47
回答 1查看 328关注 0票数 0

我有一个数据集的图像,我分为培训和测试文件夹,每一个分为两个类别,我正在分类。我使用Keras生成器来拟合和评估数据。我在网上找到了一些实现精确性、召回和F1评分指标的资源。这是我的密码:

代码语言:javascript
复制
class_mode = 'binary'
out_activation = 'sigmoid'
epochs = 1
mode = 'grayscale'
cat_or_bin = 'binary_crossentropy'
out_activation = 'sigmoid'
image_size = 224
batch = 128
channels = 1

def model_logistic():
    m = Sequential()
    m.add(Flatten(input_shape = (image_size, image_size, channels)))
    m.add(Dropout(0.2))
    m.add(Dense(out,activation=out_activation))
    return m


def recall_m(y_true, y_pred):
    y_true = K.ones_like(y_true)
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    all_positives = K.sum(K.round(K.clip(y_true, 0, 1)))

    recall = true_positives / (all_positives + K.epsilon())
    return recall


def precision_m(y_true, y_pred):
    y_true = K.ones_like(y_true)
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))

    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision


def f1_score(y_true, y_pred):
    precision = precision_m(y_true, y_pred)
    recall = recall_m(y_true, y_pred)
    return 2 * ((precision * recall) / (precision + recall + K.epsilon()))


train_generator = datagen.flow_from_directory(
    directory=dir,
    target_size=(image_size, image_size),
    color_mode=mode,
    batch_size=batch,
    classes = {'no_acc':0, 'acc':1},
    class_mode=class_mode,
    shuffle=True)

Test_generator = datagen.flow_from_directory(
    directory=dir_test,
    target_size=(image_size, image_size),
    color_mode=mode,
    batch_size=batch,
    classes = {'no_acc':0, 'acc':1},
    class_mode=class_mode,
    shuffle=True)

STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size
STEP_SIZE_TEST = test_generator.n // test_generator.batch_size

sgd = optimizers.sgd(learning_rate=0.0001, momentum=0.9, nesterov=True)

model.compile(loss=cat_or_bin, optimizer=sgd, metrics=['accuracy', f1_score, precision_m, recall_m])

    H = model.fit_generator(generator=train_generator,
                        steps_per_epoch=STEP_SIZE_TRAIN,
                        epochs=epochs,
                        verbose=1)

(loss,
accuracy,
f1_score, precision, recall) = model.evaluate_generator(test_generator, STEP_SIZE_TEST)

培训和评价的产出如下:

代码语言:javascript
复制
422/422 [==============================] - 384s 910ms/step - loss: 0.2392 - accuracy: 0.9303 - f1_score: 0.4661 - precision_m: 0.9502 - recall_m: 0.3174


2.7411930561065674
0.605730414390564
0.0
0.0
0.0

为什么它要输出这些度量的零?

编辑

Kerasv2.3现在实际上包含了这些指标,因此我将它们添加到代码中:

代码语言:javascript
复制
from keras.metrics import Precision, Recall


model.compile(loss=cat_or_bin, optimizer=sgd, metrics=['accuracy', Precision(), Recall()])

但是,对于这些指标,输出仍然是零。

EN

回答 1

Stack Overflow用户

发布于 2020-05-05 04:48:42

我建议你使用回调,这样你就更容易在每个时代结束时记录这些分数了-

做个回调课程-

代码语言:javascript
复制
class ModelMetrics(tf.keras.callbacks.Callback):

  def on_train_begin(self,logs={}):
    self.precisions=[]
    self.recalls=[]
    self.f1_scores=[]
  def on_epoch_end(self, batch, logs={}):

    y_val_pred=self.model.predict_classes(x_val)

    _precision,_recall,_f1,_sample=score(y_val,y_val_pred)  

    self.precisions.append(_precision)
    self.recalls.append(_recall)
    self.f1_scores.append(_f1)

注要使上述代码正常工作,还必须导入score

在安装网络的时候,你可以做这样的事情-

代码语言:javascript
复制
metrics = ModelMetrics()

history = model.fit(x_train, y_train,
              batch_size = batch_size,
              epochs = num_epochs,
              validation_data = (x_val, y_val),
              callbacks = [metrics])

print(metrics.precisions)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61605921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档