2017-05-10 1 views
3

Je crée manuellement mon jeu de données à partir d'un certain nombre d'images 384x286 noir et blanc.Keras input_shape pour les images conv2d et chargées manuellement

je charger une image comme ceci:

x = [] 
for f in files: 
     img = Image.open(f) 
     img.load() 
     data = np.asarray(img, dtype="int32") 
     x.append(data) 
x = np.array(x) 

il en résulte x étant un tableau (num_samples, 286, 384)

print(x.shape) => (100, 286, 384) 

lire la documentation keras et vérifier mon back-end, i devrait fournir à l'étape de convolution un input_shape composé par (lignes, cols, canaux)

puisque je ne connais pas arbitrairement la taille de l'échantillon, je m'attendais à passer en entrée si ze, quelque chose de similaire à

(None, 286, 384, 1) 

le modèle est construit comme suit:

model = Sequential() 
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) 
# other steps... 

passant comme input_shape (286, 384, 1) provoque:

Erreur lors du contrôle d'entrée: prévu conv2d_1_input pour avoir 4 dimensions, mais le tableau a la forme (85, 286, 384)

passant as_input_shape (None, 286, 384, 1) provoque:

entrée 0 est incompatible avec la couche conv2d_1: attendu ndim = 4, trouvé ndim = 5

ce que je fais mal? comment est-ce que je dois remodeler le tableau d'entrée?

Répondre

4

Définissez input_shape sur (286,384,1). Maintenant, le modèle attend une entrée avec 4 dimensions. Cela signifie que vous devez remodeler votre image avec .reshape(n_images, 286, 384, 1). Vous avez maintenant ajouté une dimension supplémentaire sans modifier les données et votre modèle est prêt à fonctionner. Fondamentalement, vous devez remodeler vos données à (n_images, x_shape, y_shape, n_steps).

Vérifiez l'exemple ci-dessous. La chose intéressante est que vous pouvez également utiliser une image RVB comme entrée. Il suffit de changer n_steps à 3.

import numpy as np 
from keras.models import Sequential 
from keras.layers.convolutional import Convolution2D 
from keras.layers.core import Flatten, Dense, Activation 
from keras.utils import np_utils 

#Create model 
model = Sequential() 
model.add(Convolution2D(32, kernel_size=(3, 3), activation='relu', input_shape=(286,384,1))) 
model.add(Flatten()) 
model.add(Dense(2)) 
model.add(Activation('softmax')) 

model.compile(loss='binary_crossentropy', 
        optimizer='adam', 
        metrics=['accuracy']) 

#Create random data 
n_images=100 
data = np.random.randint(0,2,n_images*286*384) 
labels = np.random.randint(0,2,n_images) 
labels = np_utils.to_categorical(list(labels)) 

#add dimension to images 
data = data.reshape(n_images,286,384,1) 

#Fit model 
model.fit(data, labels, verbose=1) 
+1

merci, j'ai raté la partie remodeler. En termes simples, pour toute personne suivant cette discussion dans le futur, lors de la représentation des données, les valeurs de pixels doivent être un tableau 1-éléments, par exemple une seule ligne de pixels au lieu d'être comme [100,101,140, ​​...] être [[100], [101], [140], ...] – Stormsson

0

Je pense que suivre pourrait résoudre votre erreur.

  1. input_shape nous fournissons à la première conv2d (première couche de modèle séquentiel) devrait être quelque chose comme (286,384,1) ou (largeur, hauteur, canaux). Pas besoin de dimension "None" pour batch_size.

  2. forme de votre entrée peut être (batch_size, 286,384,1)

Est-ce que cette aide vous ??

+0

vos suggestions sont exactement ce que j'ai essayé avant, et ils causent les 2 erreurs que j'ai écrit – Stormsson

+0

votre forme d'entrée doit être (taille_batch, largeur, hauteur, 1) non seulement (taille_batch, largeur, hauteur) – hars

+0

il provoque l'erreur "L'entrée 0 est incompatible avec la couche conv2d_1: attendu ndim = 4 , trouvé ndim = 5 " – Stormsson

0

votre dimension input_shape est correcte i.e input_shape (286, 384, 1)

remodeler votre input_image à 4D [batch_size, img_height, img_width, number_of_channels]

input_image=input_image.reshape(85,286, 384,1) 

pendant

model.fit(input_image,label)