python - 自定义 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 数组的范围
解决方案
TL;博士
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
是二维数组,则不会发生轴错误 - 但np.argmax
随后会返回索引列表而不是 scalar,如下所示:
>>> 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
。
推荐阅读
- counting - 我可以使用 perf_event_open 同时在计数模式和采样模式下工作吗?
- curl - 使用他们的 API 和 curl (POST/PATCH) 将视频上传到 Vimeo
- azure - 从 Azure API 管理服务启用虚拟网络访问
- shell - 如何在 Perl 脚本中使用 shell 脚本代码
- javascript - 如何访问字典中的特定元素?
- python - 尝试根据灰度图像的暗/亮程度来掩盖灰度图像时出错
- python - 定义 asyncio 函数参数时遇到问题
- python - 如何从 help() 函数中获取 __new__ 的正确签名?
- c++11 - 预处理器宏替换后防止空间
- json - 如何在对象的多个嵌套部分中获取相同的字段