自定义Keras公制返回“轴超出界限”

2024-09-30 04:38:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Keras建立了一个多类、多标签的图像分类网络。总共有25个类,每个图像中至少有一个类。我想实现一个定制的精度度量,它告诉我最高概率类出现在图像中的频率(常规精度没有什么意义,因为真正的正数被真正的负数淹没了)。你知道吗

我已经建立了一个简单的函数,当我手动输入yu true和yu 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: axis 1 is out of bounds for array of dimension 1


Tags: of函数图像truefor度量np精度
1条回答
网友
1楼 · 发布于 2024-09-30 04:38:48

TL;博士

y_pred是1D,它只有一个可能的轴。从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是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中最大值的正确标量索引。你知道吗

相关问题 更多 >

    热门问题