报告每个 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 = 3
和 batch_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])
我正在使用 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 = 3
和 batch_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])