我想训练一个模型来根据物理信号预测一个人的情绪。我有三个物理信号并将其用作输入功能;
ecg(Electrocardiography), gsr(galvanic skin response), 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 个与情绪相对应的类。我已经用数字对这些标签进行了编码;
anger = 0, calmness = 1, disgust = 2, fear = 3, happiness = 4, sadness = 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 提供数据,我正在 reshape 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
reshape 后,我创建了我的 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,当我检查预测时,它总是预测同一类。我尝试过增加层数、调整学习率、更改损失函数、更改优化器,但是没有任何帮助我解决这个问题。
这是混淆矩阵;
如何解决这个问题?提前致谢。
最佳答案
定义 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')) `
关于python - Keras 多类分类预测始终相同的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758783/