【问题标题】:Custom Keras metric return 'axis out of bounds' error自定义 Keras 指标返回“轴越界”错误
【发布时间】:2019-10-07 07:51:35
【问题描述】:

我已经使用 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 数组的范围

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    TL;DR

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


    演练

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

    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.argmaxaxis=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 然后会返回索引列表而不是标量,如下所示:

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

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

    【讨论】:

    • 要清楚,y_pred 和 y_true 以及 2d 矩阵都是 n(数据点数)乘 k(类数)并分别包含类概率和 one-hot 编码类
    • 那很好奇。如果是这种情况,您能否编辑发布错误的完整堆栈跟踪的问题?从你原来的 sn-p 中,唯一容易发生 AxisError 的行是我提到的那一行。
    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2020-01-06
    • 2020-03-04
    • 2017-09-20
    • 2013-07-26
    • 2016-10-19
    相关资源
    最近更新 更多