Numpy数组添加维度失败:适配Keras Conv2D层输入需求
解决mask数组形状无法从(512,370)转为(512,370,1)的问题
我一眼就看出问题出在哪了——你调用reshape()之后没有把结果赋值回mask_instance变量啊!numpy的reshape方法默认是返回一个新的数组,不会直接修改原数组的形状,所以你两次打印的结果才会一模一样。
修改后的代码
img_instance = cv2.imread(df.iloc[i][x_col]) / 255. img_instance = cv2.resize(img_instance, (target_size[1], target_size[0])) mask_instance = cv2.imread(df.iloc[i][y_col], cv2.IMREAD_GRAYSCALE) / 255. mask_instance = cv2.resize(mask_instance, (target_size[1], target_size[0])) print(mask_instance.shape) # 关键:把reshape的结果赋值回原变量 mask_instance = mask_instance.reshape(target_size[0], target_size[1], 1) print(mask_instance.shape)
这样修改后,第二次打印就会输出你需要的(512, 370, 1)形状,刚好能适配Keras中Conv2D层的输入要求(因为Conv2D需要显式的通道维度,哪怕是单通道灰度图也不能省略)。
两种替代方案
除了reshape,你还可以用这两种更直观的方法来增加通道维度:
- 使用
np.expand_dims(专门用于新增数组维度):
这里mask_instance = np.expand_dims(mask_instance, axis=-1)axis=-1表示在数组的最后一个位置新增维度,效果和reshape完全一致。 - 如果用TensorFlow的话,也可以用
tf.expand_dims,用法和numpy版本类似:mask_instance = tf.expand_dims(mask_instance, axis=-1)
调整后的mask形状就能完美匹配你模型里的Conv2D层输入了,不会再因为维度不匹配报错。
内容的提问来源于stack exchange,提问作者SDG
相关产品推荐
相关产品推荐

