我用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
TL;博士
y_pred
是1D,它只有一个可能的轴。从np.argmax
调用中删除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]]
,否则这些值是不存在的。你知道吗一个可操作的例子:
如果
y_pred
是2D数组,则不会发生轴错误-但是np.argmax
将返回索引列表而不是标量,如下所示:通过从
argmax
中去掉axis=1
,您将得到y_pred
中最大值的正确标量索引。你知道吗相关问题 更多 >
编程相关推荐