2017-07-25 94 views
1

這是來自this的後續問題。基本上我想要做的就是簡單地從平均值中減去每個圖像。嘗試從Caffe中的通道平均值中減去「ValueError:操作數無法與形狀一起廣播」

根據對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]) 

回答

1

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

好像你正試圖從減去以3D陣列(的(3,224,224)shape)一維向量(的(3,)shape)取代

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

。爲了做到這一點,numpy需要將1D向量轉換成3D數組的維數(很像Matlab的)。爲了幫助NumPy的理解播出什麼尺寸,需要單維度添加到一維向量:

mu[:,None,None] 

現在是形狀(3,1,1)的,這應該使numpy的正確執行減法。

+0

非常感謝你,你會解釋一點怎麼回事了那裏? – Breeze

+0

順便說一下現在我得到: ValueError:操作數無法與形狀一起播放(3,224,224)(1,1,1,256) – Breeze

+0

我需要補充一點,即使我使用'mu = np.array([104, 117,123])#imagenet的意思是'並且用mu這種方式,我得到同樣的錯誤! – Breeze

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) 
+0

不是更好的轉置的意思一次而不是圖像兩次? – Shai

+0

@Shai,這就是我的想法,然後測試!但沒有工作,它會失敗,並出現此錯誤消息: ValueError:操作數無法與形狀(3,224,224)(256,)(3,224,224)一起廣播' – Breeze

相關問題