计算TensorFlow中多个类的平均和类精度/召回率
我有一个4类的多类模型。我已经实现了一个回调,可以计算每个类的精度/召回率及其宏平均值。但是由于某些技术原因,我必须使用度量机制来计算它们 我使用的是TensorFlow 2和Keras 2.3.0。我已经使用了计算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_
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
来定义最可能的类别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]