首页 > 解决方案 > 自定义 Keras 指标返回“轴越界”错误

问题描述

我已经使用 Keras 构建了一个多类、多标签的图像分类网络。总共有 25 个类,每个图像至少有一个类。我想实现一个自定义精度指标,它告诉我图像中最高概率类别的频率(常规精度意义不大,因为真阳性被真阴性淹没了)。

我构建了一个简单的函数,当我手动输入 y_true 和 y_pred 时,它会生成所需的准确度指标。但是,当我尝试将此函数插入​​模型训练过程时,它会产生错误。

def customAcc(y_true, y_pred):
    classPreds = np.array([np.eye(numClasses)[x] for x in  np.argmax(y_pred, axis=1)])
    correctPreds = y_true * classPreds
    return np.mean(np.sum(correctPreds, axis=1))

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.0001), 
loss='binary_crossentropy', metrics=['accuracy', customAcc])

AxisError:轴 1 超出维度 1 数组的范围

标签: pythontensorflowkeras

解决方案


TL;博士

y_pred是一维的,它只有一个可能的轴。axis=1从您的np.argmax通话中删除。


演练

在这种特殊情况下的问题是这一行:

classPreds = np.array([np.eye(numClasses)[x] for x in  np.argmax(y_pred, axis=1)])

具体来说:np.argmax(y_pred, axis=1)。你y_pred是一个一维数组 - 例如[0.1, 0.2]- 你告诉np.argmax寻找axis=1不存在的值,除非你传递具有二维或更多维度的数组 - 例如[[0.1, 0.2], [0.3, 0.4]].

一个可操作的例子:

>>> import numpy as np
>>> num_classes = 25
>>> np.argmax([0.1, 0.5, 0.9]) # max value's index on 1D array
2
>>> np.argmax([0.1, 0.5, 0.9], axis=1) # max value's index on axis 1 of 1D array
AxisError: axis 1 is out of bounds for array of dimension 1

如果y_pred是二维数组,则不会发生轴错误 - 但np.argmax随后会返回索引列表而不是 scalar,如下所示:

>>> np.argmax([
...     [0.1, 0.5, 0.9],
...     [0.9, 0.5, 0.1]
... ], axis=1)
array([2, 0], dtype=int64) # first array's max at index 2, second array's max at index 0

axis=1通过从中取走argmax,您将获得 中最大值的正确标量索引y_pred


推荐阅读