2017-03-22 3 views
1

Je veux tester la précision de mon modèle CNN pour le test-images. Voici le code pour convertir des images Ground-truth au format mha au format png.Keras fausse image taille

def save_labels(fns): 
    ''' 
    INPUT list 'fns': filepaths to all labels 
    ''' 
    progress.currval = 0 
    for label_idx in progress(xrange(len(fns))): 
     slices = io.imread(fns[label_idx], plugin = 'simpleitk') 
     for slice_idx in xrange(len(slices)): 
     ''' 
     commented code in order to reshape the image slices. I tried reshaping but it did not work 
     strip=slices[slice_idx].reshape(1200,240) 
     if np.max(strip)!=0: 
     strip /= np.max(strip) 
      if np.min(strip)<=-1: 
     strip/=abs(np.min(strip)) 
     ''' 
     io.imsave('Labels2/{}_{}L.png'.format(label_idx, slice_idx), slices[slice_idx]) 

Ce code produit 240 x 240 images au format png. Cependant, la plupart d'entre eux sont à faible contraste ou complètement noircis. Passant, Maintenant, je passe ces images à fonctionner pour calculer la connaissance de la classe de l'image étiquetée. Je reçois ValueError: cannot reshape array of size 172800 into shape (5,240,240). J'ai changé 5 à 3 pour que 3X240X240 = 172800. Mais alors il y a un nouveau problème alors ValueError: Error when checking : expected convolution2d_input_1 to have 4 dimensions, but got array with shape (43264, 33, 33).

Mon modèle ressemble à ceci:

 single = Sequential() 
     single.add(Convolution2D(self.n_filters[0], self.k_dims[0], self.k_dims[0], border_mode='valid', W_regularizer=l1l2(l1=self.w_reg, l2=self.w_reg), input_shape=(self.n_chan,33,33))) 
     single.add(Activation(self.activation)) 
     single.add(BatchNormalization(mode=0, axis=1)) 
     single.add(MaxPooling2D(pool_size=(2,2), strides=(1,1))) 
     single.add(Dropout(0.5)) 
     single.add(Convolution2D(self.n_filters[1], self.k_dims[1], self.k_dims[1], activation=self.activation, border_mode='valid', W_regularizer=l1l2(l1=self.w_reg, l2=self.w_reg))) 
     single.add(BatchNormalization(mode=0, axis=1)) 
     single.add(MaxPooling2D(pool_size=(2,2), strides=(1,1))) 
     single.add(Dropout(0.5)) 
     single.add(Convolution2D(self.n_filters[2], self.k_dims[2], self.k_dims[2], activation=self.activation, border_mode='valid', W_regularizer=l1l2(l1=self.w_reg, l2=self.w_reg))) 
     single.add(BatchNormalization(mode=0, axis=1)) 
     single.add(MaxPooling2D(pool_size=(2,2), strides=(1,1))) 
     single.add(Dropout(0.5)) 
     single.add(Convolution2D(self.n_filters[3], self.k_dims[3], self.k_dims[3], activation=self.activation, border_mode='valid', W_regularizer=l1l2(l1=self.w_reg, l2=self.w_reg))) 
     single.add(Dropout(0.25)) 

     single.add(Flatten()) 
     single.add(Dense(5)) 
     single.add(Activation('softmax')) 

     sgd = SGD(lr=0.001, decay=0.01, momentum=0.9) 
     single.compile(loss='categorical_crossentropy', optimizer='sgd') 
     print 'Done.' 
     return single 

J'utilise keras 1.2.2. S'il vous plaît se référer here et here (est-ce dû à this changement dans full_predict dans le code ci-dessus) pour mon post précédent pour des informations de fond. S'il vous plaît se référer this pour savoir pourquoi ces tailles spécifiques comme 33,33.

Répondre

1

Vous devez vérifier la forme du tableau de correctifs. Cela devrait avoir 4 dimensions (nrBatches, nrChannels, Largeur, Hauteur). Selon votre message d'erreur, il n'y a que 3 dimensions. Par conséquent, il semble que vous ayez fusionné la dimension de votre chaîne avec votre dimension de lot.