我想训练一个模型,根据身体信号来预测一个人的情绪。我有三个物理信号并将其用作输入功能;
ecg(心电图),gsr(电刺激皮肤反应),temp(温度)
在我的数据集中,共有 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,并且当我检查预测时,它总是在预测同一类。我尝试增加层,以学习速率玩游戏,更改损失函数,更改优化器,但是没有什么可以帮助我解决这个问题。
这是混乱矩阵;
如何解决此问题?预先感谢。
答案 0 :(得分:0)
定义conv1D层时出错。从代码中可以明显地看出,您定义了2个过滤器和大小为700的内核,但是通常使用3个过滤器,并且没有使用任何过滤器。尝试使用此功能,并进行训练而不进行验证拆分。
function TextInput(props) {
const formContext = useContext(FormContext);
useEffect(() => {
console.log('TextInput useEffect...');
formContext.setInputInitialState(
props.name,
props.label,
props.type,
props.initialValue,
props.min,
props.max,
props.required
);
},[]);
return(
<input
type={props.type}
id={props.name}
name={props.name}
placeholder={props.placeholder}
value={([props.name] in formContext.inputs) ?
formContext.inputs[props.name].value
: props.initialValue || ''}
onChange={formContext.onChange}
onFocus={formContext.onFocus}
onBlur={formContext.onBlur}
>
</input>
</div>
{([props.name] in formContext.inputs) ?
formContext.inputs[props.name].invalidMsg && <div><span> {formContext.inputs[props.name].invalidMsg}</span></div>
: null}
</div>
);
...
}