报告每个 class 指标

Reporting each class metric

我正在使用 Tensorflow/Keras 来训练 CNN。我已经为我的问题定义了一个自定义指标。在此过程中,我收到如下报告:

Epoch 3/2000
57/57 - 3s - loss: 244231.4060 - custom_metric: 0.6170 - val_loss: 364119.8415 - val_custom_metric: 0.5506

这是一个有3个输出的回归问题。无论如何,我可以分别从每个 class 获得这些指标报告吗?

我在一篇论文中看到作者使用 binary_accuracy 作为指标,他还使用 TF/Keras,甚至在图表中绘制了所有时期的这些值。

这是我定义的自定义指标,Yclasses = 3batch_size = 16:

def custom_metric(y_true, y_pred):
  truepotventolow = K.cast(K.less_equal(y_true[0:batch_size,0], 4000), 'int8')
  predpotventolow = K.cast(K.less_equal(y_pred[0:batch_size,0], 4000), 'int8')
  potventolow = K.sum(truepotventolow*predpotventolow)
  truepotventomed = K.cast(K.greater(y_true[0:batch_size,0], 4000) & K.less_equal(y_true[0:batch_size,0], 8500), 'int8')
  predpotventomed = K.cast(K.greater(y_pred[0:batch_size,0], 4000) & K.less_equal(y_pred[0:batch_size,0], 8500), 'int8')
  potventomed = K.sum(truepotventomed*predpotventomed)
  truepotventohigh = K.cast(K.greater(y_true[0:batch_size,0], 8500), 'int8')
  predpotventohigh = K.cast(K.greater(y_pred[0:batch_size,0], 8500), 'int8')
  potventohigh = K.sum(truepotventohigh*predpotventohigh)
  truedesvpadlow = K.cast(K.less_equal(y_true[0:batch_size,1], 1150), 'int8')
  preddesvpadlow = K.cast(K.less_equal(y_pred[0:batch_size,1], 1150), 'int8')
  desvpadlow = K.sum(truedesvpadlow*preddesvpadlow)
  truedesvpadmed = K.cast(K.greater(y_true[0:batch_size,1], 1150) & K.less_equal(y_true[0:batch_size,1], 2300), 'int8')
  preddesvpadmed = K.cast(K.greater(y_pred[0:batch_size,1], 1150) & K.less_equal(y_pred[0:batch_size,1], 2300), 'int8')
  desvpadmed = K.sum(truedesvpadmed*preddesvpadmed)
  truedesvpadhigh = K.cast(K.greater(y_true[0:batch_size,1], 2300), 'int8')
  preddesvpadhigh = K.cast(K.greater(y_pred[0:batch_size,1], 2300), 'int8')
  desvpadhigh = K.sum(truedesvpadhigh*preddesvpadhigh)
  truewlslow = K.cast(K.less_equal(y_true[0:batch_size,2], 0.075), 'int8')
  predwlslow = K.cast(K.less_equal(y_pred[0:batch_size,2], 0.075), 'int8')
  wlslow = K.sum(truewlslow*predwlslow)   
  truewlshigh = K.cast(K.greater(y_true[0:batch_size,2], 0.075), 'int8')
  predwlshigh = K.cast(K.greater(y_pred[0:batch_size,2], 0.075), 'int8')
  wlshigh = K.sum(truewlshigh*predwlshigh)
  return (potventolow+potventomed+potventohigh+desvpadlow+desvpadmed+desvpadhigh+wlslow+wlshigh)/(batch_size*Yclasses)

您应该定义一个自定义指标:

def custom_metric(y_true, y_pred):
    return (
           keras.metrics.binary_accuracy(y_true[:, 0], y_pred[:, 0], threshold=0.5),
           keras.metrics.binary_accuracy(y_true[:, 1], y_pred[:, 1], threshold=0.5),
           keras.metrics.binary_accuracy(y_true[:, 2], y_pred[:, 2], threshold=0.5)
           )

然后就可以在编译时传给模型了:

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', custom_metric])