Как построить 1D сверточную нейронную сеть в питере keras? - PullRequest
0 голосов
/ 24 апреля 2018

Я решаю проблему классификации, используя CNN. У меня есть файл data.csv (15000 выборок / строк и 271 столбец), где 1-й столбец является меткой класса (всего 4 класса), а остальные 270 столбцов являются объектами (6 различных сигналов длиной 45, сцепленных, т.е. 6X45 = 270).

Проблема: Я хочу предоставить одну выборку длиной 270 в виде вектора (6 × 45, все 6 сигналов имеют разное значение), но я получаю ошибку в измерениях, когда преобразовываю одну выборку в (6 строк, 45 столбцов) в свертке.
Моя модель 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'))  

Как изменить мои данные о том, что CNN рассматривает каждую выборку как 6 сигналов длиной 45 и сворачивается с керналом окна 5.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Параметр input_shape указывает форму каждого входного «пакета». Для вашего примера он имеет вид: (steps, channels) steps - количество наблюдений на каждом канале, channels - количество сигналов. Когда на самом деле работает

model.fit(X,Y)

X будет иметь форму (batch, steps, channels), каждая партия - это каждое наблюдение ваших данных. Для этого используйте 3-мерные numpy данные.

numpy.vstack() может пригодиться

0 голосов
/ 24 апреля 2018

вам нужно изменить ваши данные, например, Xtrain.reshape (num_of_examples, num_of_features, num_of_signals) и изменить ваш input_shape в модели на (45, 6).см. пример кода ниже

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