首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >自定义Keras指标返回‘轴越界’错误

自定义Keras指标返回‘轴越界’错误
EN

Stack Overflow用户
提问于 2019-05-21 07:51:55
回答 1查看 413关注 0票数 4

我已经使用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

的数组的界限

EN

回答 1

Stack Overflow用户

发布于 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.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中最大值的正确标量索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56229468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档