- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 CNN 对不平衡数据集进行图像分类。我对 tensorflow 后端完全陌生。这是多类问题(不是多标签),我有 16 个类。类是一种热编码。
我想计算每个时期的宏观指标:F1、准确率和召回率。
我找到了一个代码来打印那些宏观指标,但它只适用于验证集来自:https://medium.com/@thongonary/how-to-compute-f1-score-for-each-epoch-in-keras-a1acd17715a2
class Metrics(Callback):
def on_train_begin(self, logs={}):
self.val_f1s = []
self.val_recalls = []
self.val_precisions = []
def on_epoch_end(self, epoch, logs={}):
val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()
val_targ = self.validation_data[1]
_val_f1 = f1_score(val_targ, val_predict,average='macro')
_val_recall = recall_score(val_targ, val_predict,average='macro')
_val_precision = precision_score(val_targ, val_predict,average='macro')
self.val_f1s.append(_val_f1)
self.val_recalls.append(_val_recall)
self.val_precisions.append(_val_precision)
print (" — val_f1: %f — val_precision: %f — val_recall %f" % (_val_f1, _val_precision, _val_recall))
return
metrics = Metrics()
我什至不确定这段代码是否真的有效,因为我们使用了
val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()
在多类分类的情况下,ROUND 会导致错误吗?
然后我使用此代码打印训练集上的指标(只记得因为那是对我来说很重要的指标)(也计算验证集,因为它在 model.compute 中使用)代码改编自:Custom macro for recall in keras
def recall(y_true,y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
return true_positives / (possible_positives + K.epsilon())
def unweightedRecall(y_true, y_pred):
return (recall(y_true[:,0],y_pred[:,0]) + recall(y_true[:,1],y_pred[:,1])+recall(y_true[:,2],y_pred[:,2]) + recall(y_true[:,3],y_pred[:,3])
+recall(y_true[:,4],y_pred[:,4]) + recall(y_true[:,5],y_pred[:,5])
+recall(y_true[:,6],y_pred[:,6]) + recall(y_true[:,7],y_pred[:,7])
+recall(y_true[:,8],y_pred[:,8]) + recall(y_true[:,9],y_pred[:,9])
+recall(y_true[:,10],y_pred[:,10]) + recall(y_true[:,11],y_pred[:,11])
+recall(y_true[:,12],y_pred[:,12]) + recall(y_true[:,13],y_pred[:,13])
+recall(y_true[:,14],y_pred[:,14]) + recall(y_true[:,15],y_pred[:,15]))/16.
我运行我的模型
model.compile(optimizer="adam", loss="categorical_crossentropy",metrics=[unweightedRecall,"accuracy"]) #model compilation with unweightedRecall metrics
train =model.fit_generator(image_gen.flow(train_X, train_label, batch_size=64),epochs=100,verbose=1,validation_data=(valid_X, valid_label),class_weight=class_weights,callbacks=[metrics],steps_per_epoch=len(train_X)/64) #run the model
VALIDATION 宏调用不同于 2 个不同的代码。
即(查看 val_unweightedRecall 和 val_recall)
Epoch 10/100
19/18 [===============================] - 13s 703ms/step - loss: 1.5167 - unweightedRecall: 0.1269 - acc: 0.5295 - val_loss: 1.5339 - val_unweightedRecall: 0.1272 - val_acc: 0.5519
— val_f1: 0.168833 — val_precision: 0.197502 — val_recall 0.15636
为什么我的宏验证召回值与两个不同的代码不同?
奖励问题:对于已经尝试过这个的人,是否真的值得使用基于我们感兴趣的指标(例如召回率)的自定义损失或具有权重的分类交叉熵产生相同的结果?
最佳答案
让我以相反的顺序回答这两个问题:
您不能将召回率用作自定义损失的基础:它不是凸的!如果您不完全理解为什么 Recall 或 precision 或 f1 不能用作损失,请花时间看看损失的作用(毕竟它是您模型中的一个巨大参数)。
确实,该轮是针对二元问题的。正如他们所说,如果不是你,那就是另一个。但在你的情况下这是错误的。让我们抛出代码:
val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()
从内到外,他获取数据 (self.validation_data[0;]) 并预测一个数字(1 个神经元作为输出)。因此,他计算了成为 1 的概率。如果这个概率超过 0.5,则该回合将其转换为 1,如果小于,则将其转换为 0。如您所见,这对您来说是错误的。在某些情况下,您不会预测任何类(class)。这个错误之后,其余的也是错误的。
现在,解决方案。您想要计算每一步的平均召回率。顺便说一句,“但它只适用于验证集”。是的,这是有意的,您使用验证来验证模型,而不是火车,否则就是作弊。
所以召回率等于所有积极因素的真正积极因素。让我们开始吧!
def recall(y_true, y_pred):
recall = 0
pred = K.argmax(y_pred)
true = K.argmax(y_true)
for i in range(16):
p = K.cast(K.equal(pred,i),'int32')
t = K.cast(K.equal(true,i),'int32')
# Compute the true positive
common = K.sum(K.dot(K.reshape(t,(1,-1)),K.reshape(p,(-1,1))))
# divide by all positives in t
recall += common/ (K.sum(t) + K.epsilon)
return recall/16
这为您提供了所有类别的平均召回率。您可以打印每个类(class)的值(value)。
如果有任何问题,请告诉我!
二进制召回的实现,参见this question从中改编代码。
关于python - 多类 CNN 的宏观指标(召回/F1 ...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56261014/
我在 Azure 中找不到几个 SQL 指标。任何人都可以帮助如何设置以下主题的指标。 1)产能利用率不足 2)池外的数据库数量 3)扩大规模 4)连接超时 提前致谢。 最佳答案 实际上,这些并不是
我要监控的应用程序提供了一个用于健康检查的 api 端点,它以 json 格式响应指标。例如: $ curl https://example.com/api/stats {"status":"suc
我正在考虑用于分析软件开发工作的软件指标。当我考虑在面向对象的软件中使用类似功能点的指标时,我遇到了一个有趣的挑战/问题。 考虑一个业务规则引擎。它是一种应用程序,由运行业务规则所需的组件组成,然后将
我要监控的应用程序提供了一个用于健康检查的 api 端点,它以 json 格式响应指标。例如: $ curl https://example.com/api/stats {"status":"suc
因此,我正在将旧的数据可视化转换为新平台,但我对他们的社区排序功能有点困惑。在原始代码中,作者似乎使用了带有余弦相似度计算器的凝聚聚类。我认为在 Javascript 中解决这个问题的最佳方法是使用
我不是专业程序员,但我正在尝试改变一些技术指标在名为 TradeStation 的金融图表包中的显示方式(与特定图表供应商无关)。 这就是问题所在:大多数指标都是围绕零点绘制的,有时它们会靠近零点摆动
我们存储了大量来 self 们服务的指标(大约 8000 万个事件)。我们必须根据数据生成报告。 我的问题比较笼统,哪些工具可以满足您的指标/报告需求?有什么推荐的吗? 我们使用 Apache 编写日
我们网站上的页面的 CLS 一直接近于零。这是有道理的,因为它们是服务器呈现的 HTML 页面,具有简单的静态布局。 最近我们添加了 content-visibility: auto 的使用,如下所示
我能想到几种方法来转这种类型的矩阵(数据框): dat = data.frame( x1 = rep(c('a', 'b'), 100), x2 = rep(c('x', 'y
我正在使用 codahale 指标(现在是 dropwizard 指标)来监控我系统中发生的一些“事件”。我正在使用 counters跟踪“事件”发生次数的指标。 我检查了记者为我的计数器指标打印的值
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 11 个月前关闭。 Improve this que
在不使用 Heapster 的情况下,有没有办法收集有关 Kubernetes 集群中节点的 CPU 或磁盘指标? Heapster 最初是如何收集这些指标的? 最佳答案 Kubernetes 监控在
对于二元分类问题,我有一个略微不平衡的数据集,正负比为 0.6。 我最近从这个答案中了解到了 auc 指标:https://stats.stackexchange.com/a/132832/12822
为了做一些参数调整,我喜欢用 Keras 循环一些训练函数。但是,我意识到在使用 tensorflow.keras.metrics.AUC() 时作为度量,对于每个训练循环,都会将一个整数添加到 au
我使用 Azure,现在我想在特定情况下添加短信通知。 当我使用基于日志的指标时,它效果很好,但我想针对特定异常创建通知。 下一个流程:抛出异常 => Azure 知道识别它 => Azure 发送有
我正在尝试访问给定cloudService的指标 我有以下代码: var metricsClient = new MetricsClient(new CertificateCloudCredentia
我正在尝试使用 R 和 xgboost 来研究我的模型。训练模型总体上效果很好,但对于插入符来说,度量存在一些问题。 我尝试为类列设置一个因子,但仍然没有结果。 我的数据 ID var1var2TA
我对编程还很陌生,有时它会用非常基本的概念来困扰我。我在我的 tableviewcontroller 中定义了一个 Activity 指示器作为 Outlet。 @IBOutlet weak var
我正在训练一个进行序列预测的模型。例如,给定某人之前写过的 10 个单词,我正在训练 LSTM 来预测他们将写的下一个单词。我有一个有时可以工作的模型,因此我想创建一个指标来跟踪模型通过词性标签预测下
我正在尝试使用 hystrix 来监控某个网络调用。但我尝试监控的所有指标始终为空。我做错了什么? 我通过实现一个(某种程度上)RESTful 接口(interface)来模拟网络调用,该接口(int
我是一名优秀的程序员,十分优秀!