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.
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'))
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