Keras多类别分类可预测始终相同的标签

时间:2019-04-19 08:22:01

标签: python tensorflow keras

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

  

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,并且当我检查预测时,它总是在预测同一类。我尝试增加层以学习速率玩游戏更改损失函数更改优化器,但是没有什么可以帮助我解决这个问题。

这是混乱矩阵;

enter image description here

如何解决此问题?预先感谢。

1 个答案:

答案 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>
  );

...
}