Python 自定义Keras度量函数(召回率、精度、F1分数)不是';t启用H5型号的装载
我正在使用以下Keras自定义指标:Python 自定义Keras度量函数(召回率、精度、F1分数)不是';t启用H5型号的装载,python,keras,Python,Keras,我正在使用以下Keras自定义指标: def mcor(y_true, y_pred): #matthews_correlation y_pred_pos = K.round(K.clip(y_pred, 0, 1)) y_pred_neg = 1 - y_pred_pos y_pos = K.round(K.clip(y_true, 0, 1)) y_neg = 1 - y_pos tp = K.sum(y_pos * y_pred_pos)
def mcor(y_true, y_pred):
#matthews_correlation
y_pred_pos = K.round(K.clip(y_pred, 0, 1))
y_pred_neg = 1 - y_pred_pos
y_pos = K.round(K.clip(y_true, 0, 1))
y_neg = 1 - y_pos
tp = K.sum(y_pos * y_pred_pos)
tn = K.sum(y_neg * y_pred_neg)
fp = K.sum(y_neg * y_pred_pos)
fn = K.sum(y_pos * y_pred_neg)
numerator = (tp * tn - fp * fn)
denominator = K.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn))
return numerator / (denominator + K.epsilon())
def precision(y_true, y_pred):
"""Precision metric.
Only computes a batch-wise average of precision.
Computes the precision, a metric for multi-label classification of
how many selected items are relevant.
"""
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)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
def recall(y_true, y_pred):
"""Recall metric.
Only computes a batch-wise average of recall.
Computes the recall, a metric for multi-label classification of
how many relevant items are selected.
"""
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)))
recall = true_positives / (possible_positives + K.epsilon())
return recall
def f1(y_true, y_pred):
def recall(y_true, y_pred):
"""Recall metric.
Only computes a batch-wise average of recall.
Computes the recall, a metric for multi-label classification of
how many relevant items are selected.
"""
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)))
recall = true_positives / (possible_positives + K.epsilon())
return recall
def precision(y_true, y_pred):
"""Precision metric.
Only computes a batch-wise average of precision.
Computes the precision, a metric for multi-label classification of
how many selected items are relevant.
"""
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)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
precision = precision(y_true, y_pred)
recall = recall(y_true, y_pred)
return 2*((precision*recall)/(precision+recall+K.epsilon()))
以下是汇编声明:
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy', precision, recall, f1])
使用ModelCheckpoint,Keras模型会在找到最佳模型时自动保存。分类类别已经过一次热编码
但是,当使用以下命令加载保存的模型时:
# load model
from keras.models import load_model
custom_obj = {'accuracy':accuracy, 'Loss':Loss, 'precision':precision, 'recall':recall, 'f1':f1}
model = load_model('Asset_3_best_model.h5', custom_objects=custom_obj)
此处列出了先前定义的自定义Keras函数中的自定义对象
从内存加载模型时,我观察到以下错误:
ValueError:(“无法解释度量函数标识符:”,
0.8701059222221775)
我尝试了许多不同的自定义函数,但找不到重新加载已保存模型的解决方案。这是一个多分类时间序列挑战,我希望了解是否有更简单的方法来解决此度量计算。我也在寻找一种方法来计算二进制分类问题的F1分数。我遇到了TensorFlow的教程,它对我很有用: 尽管如此,它不是定制的,而是直接实现的
METRICS = [
keras.metrics.TruePositives(name='tp'),
keras.metrics.FalsePositives(name='fp'),
keras.metrics.TrueNegatives(name='tn'),
keras.metrics.FalseNegatives(name='fn'),
keras.metrics.BinaryAccuracy(name='accuracy'),
keras.metrics.Precision(name='precision'),
keras.metrics.Recall(name='recall'),
keras.metrics.AUC(name='auc'),
]
在此之后,您必须在编译函数中添加一个参数:
model.compile(...,metrics=METRICS)
我为我的代码注释了tf、fp、tn、fn,得到以下输出:
Train on 2207 samples, validate on 552 samples
Epoch 1/6
- 7s - loss: 1.2502 - accuracy: 0.6357 - precision: 0.4252 - recall: 0.0688 - auc: 0.5138 - val_loss: 0.6229 - val_accuracy: 0.6667 - val_precision: 0.8000 - val_recall: 0.0214 - val_auc: 0.6800
Epoch 2/6
- 7s - loss: 0.6451 - accuracy: 0.6461 - precision: 0.7500 - recall: 0.0076 - auc: 0.5735 - val_loss: 0.6368 - val_accuracy: 0.6685 - val_precision: 0.8333 - val_recall: 0.0267 - val_auc: 0.7144
...
检查这是否解决了您的问题。如果我漏掉了什么,请告诉我。你能在没有“准确”:准确,“丢失”:丢失的情况下试一试吗。我不认为准确性和损失是定制的指标。custom_obj={'precision':precision'recall':recall'f1':f1}我尝试过,发现了几乎类似的错误:ValueError:('cannotexploration metric function identifier:',0.7639486193656921)。我有一种感觉,这可能是一个计算F1分数的挑战。虽然我不能完全肯定。