Мультиклассовая классификация Keras предсказывает всегда одну и ту же метку - PullRequest
1 голос
/ 19 апреля 2019

Я хочу тренировать модель, чтобы предсказывать свои эмоции по физическим сигналам.У меня есть три физических сигнала, и я использую его в качестве входных данных:

ЭКГ (электрокардиография), 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, а когда я проверяю прогнозы, она всегда предсказываеттот же класс.Я пытался увеличить слои , играть со скоростью обучения , изменить функцию потерь , изменить оптимизатор но ничего не помогло мнерешить эту проблему.

Вот матрица путаницы;

enter image description here

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

1 Ответ

0 голосов
/ 19 апреля 2019

Ошибка в определении слоя conv1D.Из кода видно, что вы определили 2 фильтра и ядро ​​размером 700, однако обычно используется около 3 фильтров и не используются большие фильтры.Попробуйте использовать это и тренироваться без проверки раскола.

`model = Sequential() 
 model.add(Conv1D(64, 3, activation='relu', input_shape=(18000, 3))) 
 model.add(Conv1D(64, 3, activation='relu')) 
 model.add(MaxPooling1D(3)) 
 model.add(Conv1D(128, 3, activation='relu')) 
 model.add(Conv1D(128, 3, activation='relu')) 
 model.add(GlobalAveragePooling1D()) 
 model.add(Dropout(0.5)) 
 model.add(Dense(6, activation='softmax')) `
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...