我已经使用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
的数组的界限
发布于 2019-05-21 08:22:15
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.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
通过从argmax
中去掉axis=1
,您将获得y_pred
中最大值的正确标量索引。
https://stackoverflow.com/questions/56229468
复制相似问题