当尝试从Caffe中减去频道明智意义时,获得“ValueError:操作数不能与形状一起广播”

时间:2017-07-25 15:23:00

标签: python numpy caffe pycaffe

这是来自this的后续问题。基本上我想做的是简单地从平均值中减去每个图像。

基于GitHubthis other similar question上的此问题以及this classification example当我们将裁剪后的图片版本提供给网络时,我们需要使用类似的内容减去平均像素:

mu = mean_file.mean(1).mean(1)

但具有讽刺意味的是我想要这样做:

.. = (img[:,0:224,0:224] - mu)

我得到ValueError: operands could not be broadcast together with shapes (3,224,224) (3,)。我不熟悉Python和Numpy,也无法弄清楚错误信息试图传达的内容。

目前,我正在裁剪平均文件,这不是理想的,但总比没有好。

.. = (img[:,0:224,0:224] - mean_image[:,0:224,0:224])

2 个答案:

答案 0 :(得分:1)

替换

mu = mean_file.mean(1).mean(1)

mu = mean_file.mean(1).mean(1)[:,None,None]

您似乎试图从3D数组(shape的{​​{1}})中减去1D向量((3,) shape)。为了做到这一点,需要{1}将1D矢量broadcast放入3D数组的维度(很像Matlab的)。为了帮助numpy了解要广播的维度,需要在1D向量中添加单例维度:

(3,224,224)

现在是mu[:,None,None] 形状,这应该使numpy能够正确执行减法。

答案 1 :(得分:0)

我注意到,因为我正在读取lmdb上的图像,所以我必须执行以下操作以使一切正常工作!:

img = np.array(img.transpose(2,1,0),dtype=np.float32)
img -= mean_image[0].mean(1).mean(1)
#transpose back to the original state
img = img.transpose(2,1,0)