Python 为什么我在keras中的自定义指标失败了?
我有一个三类分类器,在keras中实现。(0, 1, 2) 我想得到每次训练的准确率,所以我定义了如下度量函数:Python 为什么我在keras中的自定义指标失败了?,python,tensorflow,keras,deep-learning,neural-network,Python,Tensorflow,Keras,Deep Learning,Neural Network,我有一个三类分类器,在keras中实现。(0, 1, 2) 我想得到每次训练的准确率,所以我定义了如下度量函数: def precision_pos(y_true, y_pred): # Calculates the precision true_positives = K.sum(K.cast(K.round(y_true * y_pred)==1, dtype='float32')) predicted_positives = K.sum(K.cast(K.round
def precision_pos(y_true, y_pred):
# Calculates the precision
true_positives = K.sum(K.cast(K.round(y_true * y_pred)==1, dtype='float32'))
predicted_positives = K.sum(K.cast(K.round(y_pred)==1, dtype='float32'))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
def precision_neg(y_true, y_pred):
true_neg = K.sum(K.cast(K.round(y_true * y_pred)==4, dtype='float32'))
predicted_neg = K.sum(K.cast(K.round(y_pred)==2, dtype='float32'))
print(true_neg)
print(predicted_neg)
precision_neg = true_neg / (predicted_neg + K.epsilon())
return precision_neg
def precision_neu(y_true, y_pred):
true_neu = K.sum(K.cast(K.round(y_true * y_pred)==0, dtype='float32'))
predicted_neu = K.sum(K.cast(K.round(y_pred)==0, dtype='float32'))
print(true_neu)
print(predicted_neu)
precision_neu = true_neu / (predicted_neu + K.epsilon())
return precision_neu
我认为第一个功能运行良好,但其他两个功能运行不正常。请参阅输出:
512/512 [==============================] - 4s 8ms/sample - loss: 7.2359 - precision_pos: 0.4674 - precision_neg: 0.0000e+00 - precision_neu: 2.8859
Train on 512 samples
512/512 [==============================] - 1s 3ms/sample - loss: 8.7310 - precision_pos: 0.5264 - precision_neg: 0.0000e+00 - precision_neu: 80000008.0000
Train on 512 samples
512/512 [==============================] - 2s 3ms/sample - loss: 7.1996 - precision_pos: 0.2750 - precision_neg: 0.6720 - precision_neu: 600000000.0000
Train on 512 samples
512/512 [==============================] - 2s 3ms/sample - loss: 9.9930 - precision_pos: 0.1250 - precision_neg: 10625000.0000 - precision_neu: 640000000.0000
Train on 512 samples
512/512 [==============================] - 2s 3ms/sample - loss: 7.7442 - precision_pos: 0.0625 - precision_neg: 8750000.0000 - precision_neu: 640000000.0000
Train on 512 samples
512/512 [==============================] - 1s 3ms/sample - loss: 9.3498 - precision_pos: 0.0000e+00 - precision_neg: 10625000.0000 - precision_neu: 640000000.0000
Train on 512 samples
512/512 [==============================] - 2s 3ms/sample - loss: 9.4443 - precision_pos: 0.0000e+00 - precision_neg: 5625000.0000 - precision_neu: 640000000.0000
有人能帮忙吗?我认为内积==4是“2”类预测井样本,pred==2是所有预测2样本,所以它不会大于1,对吗?
谢谢大家在调查您的自定义指标之后,您应该调查您的舍入和乘法 具体说来,
def precision_neg(y_true, y_pred):
true_neg = K.sum(K.cast(K.round(y_true * y_pred)==4, dtype='float32'))
## Rest of the code
def precision_neu(y_true, y_pred):
true_neu = K.sum(K.cast(K.round(y_true * y_pred)==0, dtype='float32'))
## Rest of the code
专注于基本操作K.round(y_true*y_pred)
,这将返回舍入后等于3
的值,即2.7405417
。因此,您会得到未正确处理的数据,这就是为什么您会得到大于1
您可以尝试通过应用
if-else
方法和/或使用tf.math.ceil
或tf.math.floor
来解决此问题,甚至可以明确指出当值等于3
时,用某个值替换。在调查您的自定义度量标准之后,您应该调查您的四舍五入和乘法
具体说来,
def precision_neg(y_true, y_pred):
true_neg = K.sum(K.cast(K.round(y_true * y_pred)==4, dtype='float32'))
## Rest of the code
def precision_neu(y_true, y_pred):
true_neu = K.sum(K.cast(K.round(y_true * y_pred)==0, dtype='float32'))
## Rest of the code
专注于基本操作K.round(y_true*y_pred)
,这将返回舍入后等于3
的值,即2.7405417
。因此,您会得到未正确处理的数据,这就是为什么您会得到大于1
您可以尝试通过应用
if-else
方法和/或使用tf.math.ceil
或tf.math.floor
来解决此问题,甚至可以明确指示当值等于3
时,将其替换为某个值