web-dev-qa-db-fra.com

Comment construire un réseau de neurones convolutionnels 1D en keras python?

Je résous un problème de classification en utilisant CNN. J'ai un fichier data.csv (15000 échantillons/lignes et 271 colonnes), où la 1ère colonne est une étiquette de classe (4 classes au total) et les 270 autres colonnes sont des entités (6 signaux différents de longueur 45 concaténés, soit 6X45 = 270). 

Problème: Je souhaite fournir un seul échantillon de longueur 270 en tant que vecteur (6 X 45, les 6 signaux ont une signification différente), mais des erreurs de dimensions se produisent lors de la reconstitution d’un échantillon unique (6 lignes, 45 colonnes) en convolution.
Mon modèle CNN: 

X, y = load_data()   
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
num_classes = 4

X_train = X_train.reshape(X_train.shape[0], 6, 45).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 6, 45).astype('float32') 

model = Sequential()
model.add(Conv1D(filters=32, kernel_size=5, input_shape=(6, 45)))
model.add(MaxPooling1D(pool_size=5 ))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))  

Comment refaçonner mes données que CNN traite chaque échantillon en 6 signaux de 45 longueurs et en convolution avec le noyau de la fenêtre 5. 

4
Arslan

vous devez remodeler vos données comme Xtrain.reshape (num_of_examples, num_of_features, num_of_signals) et changer votre input_shape dans model en (45, 6). voir exemple de code ci-dessous

X = np.random.randn(4000,270)
y = np.ones((4000,1))
y[0:999] = 2
y[1000:1999] = 3
y[2000:2999] = 0

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
num_classes = 4

X_train = X_train.reshape(X_train.shape[0], 45, 6).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 45, 6).astype('float32') 

model = Sequential()
model.add(Conv1D(filters=32, kernel_size=5, input_shape=(45, 6)))
model.add(MaxPooling1D(pool_size=5 ))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
1
user8190410

Le paramètre input_shape spécifie la forme de chaque "batch" d'entrée. Pour votre exemple, il a la forme: (steps, channels)steps étant le nombre d'observations sur chaque canal, channels étant le nombre de signaux. En cours d'exécution 

model.fit(X,Y)

La X sera sous la forme (batch, steps, channels), chaque lot étant chaque observation de vos données. Utilisez des images de données numpy à 3 dimensions pour cela. 

numpy.vstack() peut être utile

0
skitzcoder