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?
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)
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)
Je pense que la suite pourrait résoudre votre erreur.
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.
La forme de votre entrée peut être (batch_size, 286,384,1)
Est-ce que cela vous aide ??