我已经使用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的数组的边界
答案 0 :(得分:1)
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
是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
中的最大值。