Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义Keras公制返回值';轴超出范围';错误_Python_Tensorflow_Keras - Fatal编程技术网

Python 自定义Keras公制返回值';轴超出范围';错误

Python 自定义Keras公制返回值';轴超出范围';错误,python,tensorflow,keras,Python,Tensorflow,Keras,我已经用Keras构建了一个多类、多标签的图像分类网络。总共有25个类,每个图像中至少有一个类。我想实现一个自定义精度度量,它告诉我最高概率类出现在图像中的频率(常规精度的意义不大,因为真正的正片被真正的负片淹没) 我构建了一个简单的函数,当我手动输入y_true和y_pred时,它会生成所需的精度度量。但是,当我尝试将此函数插入模型训练过程时,它会产生一个错误 def customAcc(y_true, y_pred): classPreds = np.array([np.eye(nu

我已经用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
是1D,它只有一个可能的轴。从
np.argmax
调用中删除
axis=1


演练 这种特殊情况下的问题是这一行:

classPreds=np.array([np.eye(numclass)[x]表示np.argmax中的x(y_pred,axis=1)])
具体来说:
np.argmax(y\u pred,axis=1)
。 你的
y\u pred
是一个一维数组,比如
[0.1,0.2]
,你告诉
np.argmax
axis=1
上寻找值,除非你传递两个或更多维度的数组,比如
[[0.1,0.2],[0.3,0.4]

一个可操作的例子:

>>将numpy作为np导入
>>>num_classes=25
>>>np.argmax([0.1,0.5,0.9])#一维数组上的最大值索引
2.
>>>np.argmax([0.1,0.5,0.9],轴=1)#1D数组轴1上的最大值索引
AxisError:轴1超出维度为1的数组的界限
如果
y_pred
是二维数组,则不会发生轴错误-但是
np.argmax
将返回索引列表,而不是标量,如下所示:

>>np.argmax([
...     [0.1, 0.5, 0.9],
...     [0.9, 0.5, 0.1]
…],轴=1)
数组([2,0],dtype=int64)#第一个数组在索引2处的最大值,第二个数组在索引0处的最大值

通过从
argmax
中去掉
axis=1
,您将获得
y_pred
中最大值的正确标量索引,很清楚,y_pred和y_true以及n(数据点数量)乘以k(类数量)的二维矩阵然后分别包含类概率和一个热编码类,这很奇怪。如果是这样的话,你是否可以编辑你的问题,发布错误的完整堆栈跟踪?从您最初的代码片段中,惟一容易出错的一行就是我提到的那一行。