Python 为什么我在keras中的自定义指标失败了?

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

我有一个三类分类器,在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(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
时,将其替换为某个值