67 votes

Dimension de la forme dans conv1D

J'ai essayé de construire un CNN avec une couche, mais cela me pose problème. En effet, le compilateur me dit que

ValueError: erreur lors de la vérification de l'entrée du modèle: conv1d_1_input devrait avoir 3 dimensions, mais un tableau avec une forme (569, 30)

C'est le code

 import numpy
from keras.models import Sequential
from keras.layers.convolutional import Conv1D
numpy.random.seed(7)
datasetTraining = numpy.loadtxt("CancerAdapter.csv",delimiter=",")
X = datasetTraining[:,1:31]
Y = datasetTraining[:,0]
datasetTesting = numpy.loadtxt("CancereEvaluation.csv",delimiter=",")
X_test = datasetTraining[:,1:31]
Y_test = datasetTraining[:,0]
model = Sequential()
model.add(Conv1D(2,2,activation='relu',input_shape=X.shape))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=5)
scores = model.evaluate(X_test, Y_test)
print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
 

135voto

orsonady Points 4926

td; lr vous avez besoin pour vous remodeler les données pour avoir une spatiale dimension pour Conv1d sens:

X = np.expand_dims(X, axis=2) # reshape (569, 30) to (569, 30, 1) 
# now input can be set as 
model.add(Conv1D(2,2,activation='relu',input_shape=(30, 1))

Essentiellement, le remodelage d'un ensemble de données qui ressemble à ceci:

features    
.8, .1, .3  
.2, .4, .6  
.7, .2, .1  

Pour:

[[.8
.1
.3],

[.2,
 .4,
 .6
 ],

[.3,
 .6
 .1]]

Explications et exemples

Normalement convolution travaille sur les dimensions de l'espace. Le noyau est "convolé" par rapport à la dimension la production d'un tenseur. Dans le cas de Conv1D, le noyau est passé de plus les "étapes" de la dimension de chaque exemple.

Vous verrez Conv1D utilisé pour en PNL où l' steps est le nombre de mots dans la phrase (rembourré pour certains fixe de longueur maximale). Les mots ne peuvent être codés comme des vecteurs de longueur 4.

Voici un exemple de phrase:

jack   .1   .3   -.52   |
is     .05  .8,  -.7    |<--- kernel is `convolving` along this dimension.
a      .5   .31  -.2    |
boy    .5   .8   -.4   \|/

Et la façon dont nous définissez l'entrée de la conv dans ce cas:

maxlen = 4
input_dim = 3
model.add(Conv1D(2,2,activation='relu',input_shape=(maxlen, input_dim))

Dans votre cas, il vous permettra de traiter les caractéristiques de l'espace de dimension avec chaque entité ayant une longueur de 1. (voir ci-dessous)

Ici, serait un exemple à partir de votre jeu de données

att1   .04    |
att2   .05    |  < -- kernel convolving along this dimension
att3   .1     |       notice the features have length 1. each
att4   .5    \|/      example have these 4 featues.

Et nous donnerait la Conv1D exemple que:

maxlen = num_features = 4 # this would be 30 in your case
input_dim = 1 # since this is the length of _each_ feature (as shown above)

model.add(Conv1D(2,2,activation='relu',input_shape=(maxlen, input_dim))

Comme vous le voyez votre jeu de données doit être remodelé à (569, 30, 1) utilisation:

X = np.expand_dims(X, axis=2) # reshape (569, 30, 1) 
# now input can be set as 
model.add(Conv1D(2,2,activation='relu',input_shape=(30, 1))

Ici est un véritable exemple de ce que vous pouvez exécuter (je vais utiliser l' API Fonctionnelle)

from keras.models import Model
from keras.layers import Conv1D, Dense, MaxPool1D, Flatten, Input
import numpy as np

inp =  Input(shape=(5, 1))
conv = Conv1D(filters=2, kernel_size=2)(inp)
pool = MaxPool1D(pool_size=2)(conv)
flat = Flatten()(pool)
dense = Dense(1)(flat)
model = Model(inp, dense)
model.compile(loss='mse', optimizer='adam')

print(model.summary())

# get some data
X = np.expand_dims(np.random.randn(10, 5), axis=2)
y = np.random.randn(10, 1)

# fit model
model.fit(X, y)

8voto

rnso Points 11304

J'ai mentionné dans d'autres posts aussi:

À l'entrée d'une habitude fonction des données de la table de la forme (nrows, ncols) de Conv1d de Keras, après 2 étapes sont nécessaires:

xtrain.reshape(nrows, ncols, 1)
# For conv1d statement: 
input_shape = (ncols, 1)

Par exemple, en prenant d'abord 4 caractéristiques de l'iris dataset:

Pour voir d'habitude format et sa forme:

iris_array = np.array(irisdf.iloc[:,:4].values)
print(iris_array[:5])
print(iris_array.shape)

La sortie affiche format habituel et sa forme:

[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]

(150, 4)

Code suivant modifie le format:

nrows, ncols = iris_array.shape
iris_array = iris_array.reshape(nrows, ncols, 1)
print(iris_array[:5])
print(iris_array.shape)

Sortie de code ci-dessus format de données et de sa forme:

[[[5.1]
  [3.5]
  [1.4]
  [0.2]]

 [[4.9]
  [3. ]
  [1.4]
  [0.2]]

 [[4.7]
  [3.2]
  [1.3]
  [0.2]]

 [[4.6]
  [3.1]
  [1.5]
  [0.2]]

 [[5. ]
  [3.6]
  [1.4]
  [0.2]]]

(150, 4, 1)

Cela fonctionne bien pour Conv1d de Keras. Pour input_shape (4,1) est nécessaire.

2voto

SerialDev Points 1948

Sans pouvoir voir plus de détails, vos données ne sont pas dans la bonne forme après le prétraitement.
Remodeler X pour avoir 3 dimensions:

 np.reshape(X, (1, X.shape[0], X.shape[1]))
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X