CNTK 2.2训练Faster RCNN报错ValueError:数组维度匹配问题求助
解决CNTK 2.2中Faster RCNN训练时的单目标输入ValueError问题
我是CNTK认知工具包的新手,在尝试训练Faster RCNN时程序终止,抛出了ValueError: all the input array dimensions except for the concatenation axis must match exactly的错误。查看代码后我推测,这个报错可能出现在输入仅包含单个目标的场景,因为模块处理向量时存在问题。
完整报错栈信息如下:
C:\Users\USER\AppData\Local\Programs\Python\Python35\Lib\site-packages\CNTK- Samples- 2-\Examples\Image\Detection\utils\annotations>python annotations_helper.py Traceback (most recent call last): File "annotations_helper.py", line 137, in create_map_files(data_set_path, class_dict, training_set=True) File "annotations_helper.py", line 75, in create_map_files gt_annotations = _load_annotation(abs_img_path, class_dict) File "annotations_helper.py", line 59, in _load_annotation annotations = np.hstack((bboxes, label_idxs)) File "C:\Users\USER\AppData\Local\Programs\Python35\lib\site- packages\numpy\core\shape_base.py", line 288, in hstack return _nx.concatenate(arrs, 1) ValueError: all the input array dimensions except for the concatenation axis must match exactly
问题根源分析
你猜的完全正确!这个报错确实是单目标样本的维度不兼容导致的:当图片里只有一个目标时,bboxes会变成一维数组,而label_idxs如果是单个值的话也是一维结构,np.hstack要求除拼接轴外的所有维度必须完全匹配,一维数组和标量/一维数组的组合不符合这个要求,因此触发报错。
具体修复步骤
找到annotations_helper.py中报错的_load_annotation函数(对应第59行),修改np.hstack的调用逻辑,确保两个输入都是二维数组:
- 显式检查维度并转换的写法:
# 替换原有的annotations = np.hstack((bboxes, label_idxs)) # 先确保bboxes是二维数组(每个边界框占一行) if bboxes.ndim == 1: bboxes = bboxes.reshape(1, -1) # 再确保label_idxs是二维数组(每个标签占一列) if label_idxs.ndim == 1: label_idxs = label_idxs.reshape(-1, 1) # 最后执行拼接 annotations = np.hstack((bboxes, label_idxs))
- 更简洁的一行写法:
annotations = np.hstack( (np.expand_dims(bboxes, axis=0) if bboxes.ndim == 1 else bboxes, np.expand_dims(label_idxs, axis=1) if label_idxs.ndim == 1 else label_idxs) )
修复验证
修改后两种场景都能正常处理:
- 单目标图片:
bboxes转为(1,4)(对应一个边界框的4个坐标),label_idxs转为(1,1)(对应一个标签),拼接后得到(1,5)的数组,符合后续模块的输入要求。 - 多目标图片:
bboxes保持(N,4),label_idxs保持(N,1),拼接后得到(N,5),和原有逻辑完全一致。
内容的提问来源于stack exchange,提问作者agol
相关产品推荐
相关产品推荐

