python - Keras 多类分类预测始终相同的标签

标签 python tensorflow keras

我想训练一个模型来根据物理信号预测一个人的情绪。我有三个物理信号并将其用作输入功能;

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,当我检查预测时,它总是预测同一类。我尝试过增加层数调整学习率更改损失函数更改优化器,但是没有任何帮助我解决这个问题。

这是混淆矩阵;

enter image description here

如何解决这个问题?提前致谢。

最佳答案

定义 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/

相关文章:

python - 在 Python 中对一组值进行分区

python - 如何使用Python SDK在Azure数据工厂中的特定分支下运行管道?

python - tf.audio.decode_wav 如何获取其内容?

machine-learning - Keras 中的多对一和多对多 LSTM 示例

python - 使用 TensorFlow 数据集进行验证集

python - Keras自定义层: change values of tensor based on conditions

python - 在python中获取类和实例的属性

tensorflow - 如何使用 Keras API 在 Tensorflow 2.0 中的多个 GPU 上加载模型后继续训练?

c++ - tensorflow C++ API 中的 float 据类型

python - Gunicorn 模块未发现错误