Я хочу тренировать модель, чтобы предсказывать свои эмоции по физическим сигналам.У меня есть три физических сигнала, и я использую его в качестве входных данных:
ЭКГ (электрокардиография), gsr (гальваническая реакция кожи), temp (temparature)
В моем наборе данных,Всего 312 записей, принадлежащих участникам, и в каждой записи 18000 строк данных.Поэтому, когда я объединяю их в один фрейм данных, получается всего 5616000 строк.
Вот мой x_train
массив данных;
ecg gsr temp
0 0.1912 0.0000 40.10
1 0.3597 0.0000 40.26
2 0.3597 0.0000 40.20
3 0.3597 0.0000 40.20
4 0.3597 0.0000 40.33
5 0.3597 0.0000 40.03
6 0.2739 0.0039 40.13
7 0.1641 0.0031 40.20
8 0.0776 0.0025 40.20
9 0.0005 0.0020 40.26
10 -0.0375 0.0016 40.03
11 -0.0676 0.0013 40.16
12 -0.1071 0.0010 40.20
13 -0.1197 0.0047 40.20
.. ....... ...... .....
.. ....... ...... .....
.. ....... ...... .....
5616000 0.0226 0.1803 38.43
И у меня есть 6 классов, которые соответствуют эмоциям.Я закодировал эти метки числами:
гнев = 0, спокойствие = 1, отвращение = 2, страх = 3, счастье = 4, грусть = 5
Здесьмой y_train;
emotion
0 0
1 0
2 0
3 0
4 0
. .
. .
. .
18001 1
18002 1
18003 1
. .
. .
. .
360001 2
360002 2
360003 2
. .
. .
. .
. .
5616000 5
Чтобы кормить свой CNN, я изменяю форму train_x и одно горячее кодирование данных train_y.
train_x = train_x.values.reshape(312,18000,3) #because I have 18000 rows in each record and 3 input features
train_y = train_y.values.reshape(312,18000)
trunc_train_y = train_y[:,:1] # to get 1 label for every 18000 column vector of signal
train_y_enc = pd.DataFrame(trunc_train_y)
train_y_enc = pd.get_dummies(train_y_enc[0]) # one hot encoded labels
После изменения формы я создал свою модель CNN;
model = Sequential()
model.add(Conv1D(2,700,activation='relu',input_shape=(18000,3)))
model.add(Conv1D(2,700,activation='relu'))
model.add(MaxPooling1D(4))
model.add(Conv1D(2,700,activation='relu'))
model.add(Conv1D(2,700,activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(6,activation='softmax'))
model.compile(optimizer = sgd, loss = 'categorical_crossentropy', metrics = ['acc'])
model.fit(train_x,train_y_enc,epochs = 300, batch_size = 32, validation_split=0.33, shuffle=False)
Проблема в том, что точность не превышает 0,2, а когда я проверяю прогнозы, она всегда предсказываеттот же класс.Я пытался увеличить слои , играть со скоростью обучения , изменить функцию потерь , изменить оптимизатор но ничего не помогло мнерешить эту проблему.
Вот матрица путаницы;

Как я могу решить эту проблему?Заранее спасибо.