Dimension de la forme en conv1D

j'ai essayé de construire un CNN avec une couche, mais j'ai quelques problème avec elle. En effet, le compilateur me dit que

ValueError: erreur lors de la vérification de l'entrée du modèle: conv1d_1_input attendu pour avoir 3 dimensions, mais il a obtenu de la matrice de la 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))
29
demandé sur protti 2017-04-13 18:44:02

2 réponses

td; LR vous devez remodeler vos données pour avoir un spatiales dimension Conv1d pour faire 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 en remodelant un ensemble de données qui ressemble à ceci:

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

À:

[[.8
.1
.3],

[.2,
 .4,
 .6
 ],

[.3,
 .6
 .1]]

explication et exemples

normalement, la convolution agit sur les dimensions spatiales. Le noyau est "convolved" sur la dimension produisant un tenseur. Dans le cas de Conv1D, le noyau est passé de la dimension "pas" de chaque exemple.

vous verrez Conv1D utilisé dans la NLP où le steps est le nombre de mots dans la phrase (rembourré à une longueur maximale fixe). Les mots pourraient être encodés comme 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, vous traiterez les caractéristiques comme dimension spatiale avec chaque caractéristique ayant une longueur 1. (voir ci-dessous)

voici un exemple de votre ensemble 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 on devait mettre le Conv1D exemple:

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 voyez votre ensemble de données doit être remodelé en (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))

voici un exemple complet que vous pouvez exécuter (je vais utiliser le Fonctionnelle de l'API)

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)
68
répondu orsonady 2018-03-16 18:50:50

sans être en mesure de voir plus de détails vos données ne sont pas dans la bonne forme après prétraitement.

Remodeler X pour avoir 3 dimensions:

np.reshape(X, (1, X.shape[0], X.shape[1]))
1
répondu SerialDev 2017-04-13 15:50:59