gpt4 book ai didi

python - CNN 的输入形状不兼容

转载 作者:太空宇宙 更新时间:2023-11-03 21:02:32 29 4
gpt4 key购买 nike

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

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

reshape 后,我创建了我的 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: Error when checking input: expected conv1d_96_input to have shape (5616000, 3) but got array with shape (3, 1)

无论我尝试过什么,都无法使其发挥作用。感谢任何帮助,谢谢。

最佳答案

问题出在 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 个样本,可用于对您选择的 batch_size = 32 进行 model.fit 操作。因此,在每次迭代中,它将从 5616000 个样本中取出 32 个样本进行训练。

更新1

对于您的用例,您可以使用 Dense,而不是使用 Conv1D,因为您只有 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

如果您认为密集层不够,您也可以尝试这个。因为您必须在密集层中添加更多神经元或添加更多隐藏层,这样您将获得更多数量的可训练层参数,这可能会有所帮助。您只有三个功能,因此,在 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
_________________________________________________________________

关于python - CNN 的输入形状不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55632228/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com