CNN的输入形状不兼容

时间:2019-04-11 12:12:48

标签: python keras deep-learning

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

  

ecg(心电图),gsr(皮肤电反应),   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个与情感相对应的课程。我已经用数字对这些标签进行了编码;

  

愤怒= 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_x.values.reshape(5616000,3,1) #because I have 5616000 rows and 3 input features
train_y = train_y.values.reshape(5616000,1)

重塑后,我创建了我的CNN模型;

model = Sequential()
model.add(Conv1D(100,700,activation='relu',input_shape=(5616000,3)))
model.add(Conv1D(100,700,activation='relu'))
model.add(MaxPooling1D(4))
model.add(Conv1D(160,700,activation='relu'))
model.add(Conv1D(160,700,activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(1,activation='softmax'))

model.compile(optimizer = sgd, loss = 'binary_crossentropy', metrics = ['acc'])
model.fit(train_x,train_y,epochs = 300, batch_size = 32, validation_split=0.33, shuffle=False)

这给了我以下错误;

  

ValueError:检查输入时出错:预期conv1d_96_input具有形状(5616000,3),但形状为(3,1)的数组

无论我尝试了什么,我都无法使它起作用。谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

问题出在model.add(Conv1D(100,700,activation='relu',input_shape=(5616000,3)))。因为这里input_shape将是(3,1),所以您具有3种输入功能。像这样使用,

model.add(Conv1D(100,700,activation='relu',input_shape=(3,1)))

您有5616000个样本,可用于对选定的model.fit进行batch_size = 32。因此,在每次迭代中,将从5616000中抽取32个样本并进行训练。

更新1

对于您的用例,而不是使用Conv1D,可以使用Dense,因为您只有3个功能。我建议这样做,

train_x = train_x.values.reshape(5616000,3) 

,对于您的train_y,您需要预测6个类,因此需要进行one hot encoding。因此,train_y对您来说将是

train_y = keras.utils.to_categorical(train_y.values.reshape(5616000,1), num_classes=6)

然后您的模型将是这样,

model = Sequential()
model.add(InputLayer(input_shape=(3,)))
model.add(Dense(8,activation='relu'))
model.add(Dense(10,activation='relu'))
model.add(Dense(8,activation='relu'))
model.add(Dense(6,activation='softmax'))

您的用例是多类分类,请查找here多类和二进制分类之间的区别。现在模型编译将是

model.compile(optimizer = sgd, loss = 'categorical_crossentropy', metrics = ['acc'])

和适合的人都一样,

model.fit(train_x,train_y,epochs = 300, batch_size = 32, validation_split=0.33, shuffle=False)

更新2

如果您认为密集层还不够,也可以尝试一下。由于必须在Dense层中添加更多的神经元或添加更多的hiddent层,因此,您将获得更多可训练的参数,并且有帮助。您只有三个功能,因此,Conv1D中的内核大小必须根据这样的选择,model.add(Conv1D(100,700,activation='relu',input_shape=(3,1)))。我认为它也应该起作用。

model=Sequential()
model.add(InputLayer(input_shape=(3,1)))
model.add(Conv1D(100, 2, activation='relu'))
model.add(Conv1D(100, 2, activation='relu'))
model.add(Conv1D(128, 1, activation='relu'))
model.add(Conv1D(128, 1, activation='relu'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(6, activation='softmax'))
model.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_1 (Conv1D)            (None, 2, 100)            300       
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 1, 100)            20100     
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 1, 128)            12928     
_________________________________________________________________
conv1d_4 (Conv1D)            (None, 1, 128)            16512     
_________________________________________________________________
dropout_1 (Dropout)          (None, 1, 128)            0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 6)                 774       
=================================================================
Total params: 50,614
Trainable params: 50,614
Non-trainable params: 0
_________________________________________________________________