Python Keras多类分类预测的标签总是相同的
我想训练一个模型,从物理信号预测一个人的情绪。我有三个物理信号,并使用它作为输入功能 ecg(心电图)、gsr(皮肤电反应)、温度(温度) 在我的数据集中,参与者共有312条记录,每条记录中有18000行数据。因此,当我将它们组合到单个数据帧中时,总共有5616000行 这是我的Python Keras多类分类预测的标签总是相同的,python,tensorflow,keras,Python,Tensorflow,Keras,我想训练一个模型,从物理信号预测一个人的情绪。我有三个物理信号,并使用它作为输入功能 ecg(心电图)、gsr(皮肤电反应)、温度(温度) 在我的数据集中,参与者共有312条记录,每条记录中有18000行数据。因此,当我将它们组合到单个数据帧中时,总共有5616000行 这是我的xu列车数据帧 ecg gsr temp 0 0.1912 0.0000 40.10 1 0.3597 0.0000 40.26 2 0
xu列车
数据帧
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
这是我的火车
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提供信息,我正在重塑x列,并对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,当我检查预测时,它总是预测同一类。我曾尝试增加层数,使用学习率,更改损失函数,更改优化器,但没有任何帮助我解决这个问题
这是混淆矩阵
我怎样才能解决这个问题?提前感谢。定义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')) `
定义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')) `
你对数据的处理看起来很奇怪。我认为应该是
(train\u sample\u length,num\u features)
。另外,为什么您的列车是(31218000)
形状的?它应该是(train\u sample\u length,num\u classes)。
我可以在您的案例中看到num\u features=3
和num\u classes=5
@Anakin,因为我总共有312条不同的记录。我正在转换信号,使每个信号序列对应于一行。因此,每行有18006列(信号长度+一个热编码标签)。我在做转置操作,因为我不想标记信号的每一毫秒,最好转置它并只标记一次。得到312部分。也许你应该考虑整个5616000行和洗牌的数据,并分为培训和validation@Anakin,如果我将它以5616000行的形式洗牌,那么所有的信号结构都会被破坏。也许我把你的问题搞错了。好的,告诉我:对于预测,您想输入一个3d向量[ecg gsr temp]
并预测情绪吗?您对数据的处理看起来非常奇怪。我认为应该是(train\u sample\u length,num\u features)
。另外,为什么您的列车是(31218000)
形状的?它应该是(train\u sample\u length,num\u classes)。
我可以在您的案例中看到num\u features=3
和num\u classes=5
@Anakin,因为我总共有312条不同的记录。我正在转换信号,使每个信号序列对应于一行。因此,每行有18006列(信号长度+一个热编码标签)。我在做转置操作,因为我不想标记信号的每一毫秒,最好转置它并只标记一次。得到312部分。也许你应该考虑整个5616000行和洗牌的数据,并分为培训和validation@Anakin,如果我将它以5616000行的形式洗牌,那么所有的信号结构都会被破坏。也许我把你的问题搞错了。好的,告诉我:对于预测,是否要输入3d向量[ecg gsr temp]
,并预测情绪
?这与其说是答案,不如说是一个注释。如果我删除GlobalAvaragePoolling1D(),它会生成一个错误<代码>检查目标时出错:预期稠密_9有3维,但得到了形状为(312,6)的数组。
这与其说是答案,不如说是注释。如果删除GlobalAvaragePoolling1D(),它将生成一个错误<代码>检查目标时出错:预期密集_9有3维,但得到了形状为(312,6)的数组。