计算TensorFlow中多个类的平均和类精度/召回率

计算TensorFlow中多个类的平均和类精度/召回率,tensorflow,keras,Tensorflow,Keras,我有一个4类的多类模型。我已经实现了一个回调,可以计算每个类的精度/召回率及其宏平均值。但是由于某些技术原因,我必须使用度量机制来计算它们 我使用的是TensorFlow 2和Keras 2.3.0。我已经使用了tensorflow.keras.metrics.Recall/Precision来获取类度量: metrics\u list=['accurity'] metrics_list.extend([Recall(class_id=i,name=“Recall{}.format(label_

我有一个4类的多类模型。我已经实现了一个回调,可以计算每个类的精度/召回率及其宏平均值。但是由于某些技术原因,我必须使用度量机制来计算它们

我使用的是TensorFlow 2和Keras 2.3.0。我已经使用了
tensorflow.keras.metrics.Recall/Precision
来获取类度量:

metrics\u list=['accurity']
metrics_list.extend([Recall(class_id=i,name=“Recall{}.format(label_names[i]))用于范围内的i(n_类别)])
度量值列表.extend([Precision(class_id=i,name=“Precision_{}.format(label_names[i]))用于范围内的i(n_类别)])
模型=模型(…)
compile(…metrics=metrics\u list)
但是,该解决方案并不令人满意:

  • 首先,
    tensorflow.keras.metrics.Recall/Precision
    使用阈值来定义与类别的关联,而如果定义了
    class\u id
    ,则应使用
    argmax
    来定义最可能的类别

  • 其次,我必须创建两个新的度量来计算所有类的平均值,这本身就需要计算类度量。这是不雅观和低效的计算两倍相同的事情

  • 有没有办法创建一个类或函数,使用TensorFlow/Keras度量逻辑直接计算类和平均预测/召回率

    显然,我可以使用
    tf.math.conflusion\u matrix()
    轻松获得混淆矩阵。但是,我不知道如何一次注入标量列表,而不是返回单个标量


    欢迎任何评论

    在我非常具体的情况下,我可以简单地使用
    categoricalaccurcy()
    作为唯一度量,因为我使用的是
    batch\u size=1
    。在这种情况下,
    accurity=recall=precision={1.|0.}
    用于批处理。这只能部分解决问题。最好的解决方案是在每个批次结束时使用
    argmax
    更新混淆矩阵,然后在此基础上计算精度/召回率。我不知道怎么可能做到这一点,但它应该是可行的

    克服第一个限制(与
    tensorflow.keras.metrics.Recall/Precision
    的阈值相关)的一种可能性是将输出概率向量转换为1-hot向量。例如,CNN可以发布2个输出,概率向量和1-热向量。显然,1-hot编码将基于
    argmax
    。更清楚一点,在仔细阅读文档之后,TF对向量的每个元素应用阈值。例如,如果输出向量为
    [0.54,0.56,0.58]
    ,阈值为0.5,则将其评估为
    [1,1,1]
    ,并与1-热向量
    [1,0,0]
    进行比较。在使用
    class\u id
    选项时,这对我来说是一个问题,因为类0的输出值将为正值。在我的例子中,我需要将输出向量计算为
    [0,0,1]