2017-07-25 4 views
1

Ceci est une question de suivi de this. Fondamentalement, ce que je veux faire est de simplement soustraire chaque image de la moyenne.Obtention de "ValueError: les opérandes ne peuvent pas être diffusés avec des formes" en essayant de soustraire de la moyenne des canaux dans Caffe

Sur la base de cette question GitHub et this other similar question, ainsi this classification example Lorsque nous alimentons la version recadrée d'images au réseau, il faut soustraire le pixel moyenne en utilisant quelque chose comme ceci:

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

mais l'ironie est quand je veux faire:

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

Je reçois ValueError: operands could not be broadcast together with shapes (3,224,224) (3,). Je ne connais pas bien Python et Numpy et je n'arrive pas à comprendre ce que le message d'erreur essaie de transmettre.

Actuellement, je recadre le fichier moyen, ce qui n'est pas idéal, mais vaut mieux que rien.

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

Répondre

1

remplacer

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

avec

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

Il semble que vous essayez de soustraire un vecteur 1D (shape de (3,)) à partir d'un tableau 3D (shape de (3,224,224)). Pour ce faire, numpy doit broadcast le vecteur 1D dans les dimensions du tableau 3D (un peu comme le de Matlab). Pour aider à comprendre ce que numpy dimensions à diffuser, il faut ajouter des dimensions singleton au vecteur 1D:

mu[:,None,None] 

est maintenant de forme (3,1,1) et cela devrait permettre numpy d'effectuer correctement la soustraction.

+0

Merci beaucoup, pourriez-vous expliquer un peu plus ce qui se passe en Là? – Breeze

+0

à ce stade Maintenant, je reçois: ValueError: les opérandes ne pouvaient pas être diffusées avec des formes (3,224,224) (1,1,1,256) – Breeze

+0

Je dois ajouter cela, même si j'utilise 'mu = np.array ([104, 117, 123]) # imagenet mean' et utiliser mu de cette façon, j'obtiens la même erreur! – Breeze

0

j'ai remarqué depuis que je lisais les images hors du LMDB, je devais faire ce qui suit pour obtenir tout ce travail !:

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

ne serait-il pas préférable de transposer la moyenne une fois au lieu de l'image deux fois? – Shai

+0

@Shai, Thats ce que je pensais et ensuite testé! mais cela ne fonctionnait pas, il échouerait avec ce message d'erreur: 'ValueError: les opérandes ne pouvaient pas être diffusés avec des formes (3,224,224) (256,) (3,224,224)' – Breeze