自定义Keras指标返回``轴超出范围''错误

时间:2019-05-20 23:51:55

标签: python tensorflow 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的数组的边界

1 个答案:

答案 0 :(得分:1)

TL; DR

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.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是2D数组,则不会发生轴错误-但是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

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