web-dev-qa-db-fra.com

Keras input_shape pour conv2d et les images chargées manuellement

Je crée manuellement mon jeu de données à partir d’un certain nombre d’images 384x286 n/b.

Je charge une image comme celle-ci:

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 que x est un tableau (num_samples, 286, 384)

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

en lisant la documentation de keras et en vérifiant mon backend, je devrais fournir à l'étape de convolution un input_shape composé de (lignes, colonnes, canaux)

comme je ne connais pas arbitrairement la taille de l'échantillon, je m'attendrais à passer comme taille d'entrée, 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...

passer en tant que input_shape (286, 384, 1) provoque:

Erreur lors de la vérification de l'entrée: conv2d_1_input devrait avoir 4 dimensions, mais un tableau avec une forme (85, 286, 384)

passer as_input_shape (Aucun, 286, 384, 1) provoque:

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

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

6
Stormsson

Définissez le input_shape sur (286,384,1). Le modèle attend maintenant 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 à être exécuté. En gros, vous devez redéfinir vos données en (n_images, x_shape, y_shape, n_steps).

Consultez 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)
10

votre dimension input_shape est correcte, c'est-à-dire input_shape (286, 384, 1)

reformer votre image_entrée en 4D [taille_batch, img_height, img_width, number_of_channels]

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

pendant 

model.fit(input_image,label)
1
thefifthjack005

Je pense que la suite pourrait résoudre votre erreur.

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

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

Est-ce que cela vous aide ??

0
Harsha Pokkalla