Plot 报告每个类度量

Plot 报告每个类度量,plot,keras,metrics,Plot,Keras,Metrics,我正在使用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个输出的回归问题。我是否可以分别从每个类中获取这些度量报告 我在一篇论文中看到,作者使用了二进制精度作为衡量标准,他

我正在使用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个输出的回归问题。我是否可以分别从每个类中获取这些度量报告

我在一篇论文中看到,作者使用了
二进制精度作为衡量标准,他还使用了TF/Keras,甚至在一张图表中绘制了所有时代的这些值

这是我定义的自定义指标,其中
Yclasses=3
batch\u 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])

您应该定义一个自定义度量:

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])

见下面我的答案。注意:由于您没有提供任何代码或数据,我无法对其进行测试,所以请进行测试并提供检查结果。您好@Geeocode。谢谢你的回复。我已经用自定义的metric.Hello编辑了这个主题。第一。不要使用
batchsize
,因为您的度量将在历代结束时使用,在历代结束时将对整个数据集进行评估。您使用的是单独的类,但返回它们的计算方法。这是你的真实意图吗?对不起,我说错了,我的意思是每批使用一个指标,但评估通过所有数据点。是的,只需
,并且在
返回时
不带
批量大小
。你说的是不同的大小,但如果我看得清楚的话,你指的是轴0处的不同大小,这意味着你有相同的大小,即相同的类,但你有更有效的数据,这是正常的,对
返回的形式没有影响。无论如何,请测试它,如果你有你需要的结果,请接受我的答案。我明白了,谢谢你的帮助。我接受你的答案,它帮助我定义了我想要的度量标准。见下面我的答案。注意:由于您没有提供任何代码或数据,我无法对其进行测试,所以请进行测试并提供检查结果。您好@Geeocode。谢谢你的回复。我已经用自定义的metric.Hello编辑了这个主题。第一。不要使用
batchsize
,因为您的度量将在历代结束时使用,在历代结束时将对整个数据集进行评估。您使用的是单独的类,但返回它们的计算方法。这是你的真实意图吗?对不起,我说错了,我的意思是每批使用一个指标,但评估通过所有数据点。是的,只需
,并且在
返回时
不带
批量大小
。你说的是不同的大小,但如果我看得清楚的话,你指的是轴0处的不同大小,这意味着你有相同的大小,即相同的类,但你有更有效的数据,这是正常的,对
返回的形式没有影响。无论如何,请测试它,如果你有你需要的结果,请接受我的答案。我明白了,谢谢你的帮助。我接受你的回答,它帮助我定义了我想要的度量标准。