我尝试实施precision
and recall
作为自定义指标https://datascience.stackexchange.com/questions/45165/how-to-get-accuracy-f1- precision-and-recall-for-a-keras-model/45166#45166?newreg=6190503b2be14e8aa2c0069d0a52749e,但由于某种原因,数字出现了偏差(我确实知道批次问题的平均值,这不是我所说的)。
所以我尝试实施另一个指标:
def p1(y_true, y_pred):
return K.sum(y_true)
只是为了看看会发生什么......我期望看到的是一个包含数量的直线图1
我的数据集中有(我正在研究一个二进制分类问题binary_crossentropy
loss).
因为 Keras 将自定义指标计算为每个批次结果的平均值,所以如果我有一个大小为 32 的批次,我会期望这样p1
指标返回 16,但我得到的是 15。如果我使用一批大小为 16,我会得到接近 7.9 的值。那是我尝试使用fit
method.
在训练模型后,我还手动计算了验证精度,它确实给出了与我最后看到的不同的数字val_precision
从历史来看。那是用fir_generator
, 在这种情况下batch_size
未提供,所以我假设它立即计算整个验证数据集的指标。
另一个重要的细节是,当我使用相同的数据集进行训练和验证时,即使我在上一个时期获得相同的真阳性和预测阳性数字,训练和验证精度也是不同的(1 和 0.6)。
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)))
显然32.0 / (32.0 + K.epsilon()) = 0.6000000238418579
知道出了什么问题吗?
可能有帮助的事情:
![enter image description here](https://i.stack.imgur.com/jN8UD.png)
def p1(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
return 1.0 / (true_positives + K.epsilon())
def p2(y_true, y_pred):
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
return 1.0 / (predicted_positives + K.epsilon())
def p3(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
return true_positives
def p4(y_true, y_pred):
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
return predicted_positives