我正在尝试在keras中进行多类分类。到目前为止,我使用categorical_crossentropy作为损失函数。但是由于所需的度量是weighted-f1,我不确定categorical_crossentropy是否是最佳的损失选择。我试图使用sklearn.metrics.f1_score在keras中实现加权f1分数,但由于Tensor和标量之间的转换问题,我遇到了错误。
大概是这样的:
def f1_loss(y_true, y_pred):
return 1 - f1_score(np.argmax(y_true, axis=1), np.argmax(y_pred, axis=1), average='weighted')
字符串
其次是
model.compile(loss=f1_loss, optimizer=opt)
型
如何用keras写这个损失函数?
编辑:
y_true和y_pred的形状是**(n_samples,n_classes)在我的例子中是(n_samples,4)**
y_true和y_pred都是Tensor,所以sklearn的f1_score不能直接作用于它们。我需要一个函数来计算Tensor上的加权f1。
2条答案
按热度按时间xesrikrc1#
变量是自我解释的:
字符串
重要提示:
这种损失将分批工作(如任何Keras损失)。
因此,如果您使用小批量,则每个批次之间的结果将不稳定,并且您可能会得到一个坏结果。使用大批量,足以包括所有类别的大量样本。
由于这种损失会导致批量大小崩溃,因此您将无法使用某些依赖于批量大小的Keras功能,例如样本权重。
2guxujil2#
我创建了自定义weigted_f1函数,并在model.compile()过程中将其传递到“metrics =”中。
请参见函数和模型.compile()
字符串
model.compile如下:
型
在此之后,当我运行model.fit时,我得到ValueError:未知度量函数:'f1_weighted'
型
请帮助我调试此错误。基本上,我想在每个时期之后绘制/跟踪训练和验证f1分数