【发布时间】:2020-11-17 16:46:41
【问题描述】:
我正在尝试使用 categorical_accuracy 指标评估我的 keras 神经网络。但是,这仅适用于一维列表,因此如果我将其作为目标:
[[[0, 1, 0], [0, 0, 0]], ...]
这是我的输出:
[[[0.1, 0.8, 0.2], [0.3, 0.4, 0.2]], ...]
当它比较两个列表中的每一个时,它将为该项目返回 0.5 的准确度。但是,我想比较整个输出(3d 输出)的最大参数,因此希望上面的示例返回 1 的精度。
我试过了:
class Accuracy(keras.metrics.CategoricalAccuracy):
def __init__(self):
super().__init__()
def call(self, inputs, **kwargs):
super().call((tf.reshape(inputs[0], (output_size,)), tf.reshape(inputs[1], (output_size,))), **kwargs)
但它似乎仍然返回相同的值。有没有其他方法可以适应固有的 keras 功能,而无需创建我自己的指标,这可能会运行得更慢?
更新: 我创建了一个函数来解决这个问题:
def cat_acc(y_true, y_pred):
return tf.keras.metrics.categorical_accuracy(tf.keras.backend.flatten(y_true),
tf.keras.backend.flatten(y_pred))
但是这有一个问题,它一次计算整个批次,因此它将返回 1 或 0,其中 1 表示整个批次中的最大值正确,而 0 表示不正确。在创建模型时,当 keras 编译它时,我找不到一种明智的方法来循环批处理而不抛出值错误。
【问题讨论】: