【问题标题】:Time series classification - ValueError: setting an array element with a sequence时间序列分类 - ValueError:使用序列设置数组元素
【发布时间】:2019-08-17 05:07:16
【问题描述】:

我必须训练一个模型来对时间序列数据进行分类。该数据中有 6 个类,这就是为什么我使用 one-hot-encoder 对它们进行编码的原因。唯一的输入特征是由行向量组成的 "ecg" 列。数据看起来像这样;

                                               ecg      0  1  2  3  4  5
0    [[0.1912, 0.3597, 0.3597, 0.3597, 0.3597, 0.35...  1  0  0  0  0  0
1    [[0.2179, 0.4172, 0.4172, 0.4172, 0.4172, 0.41...  1  0  0  0  0  0
2    [[0.1986, 0.3537, 0.3537, 0.3537, 0.3537, 0.35...  0  1  0  0  0  0
3    [[0.2808, 0.5145, 0.5145, 0.5145, 0.5145, 0.51...  0  1  0  0  0  0
4    [[0.1758, 0.2977, 0.2977, 0.2977, 0.2977, 0.29...  0  0  1  0  0  0
5    [[0.2183, 0.396, 0.396, 0.396, 0.396, 0.396, 0...  0  0  1  0  0  0
6    [[0.204, 0.3869, 0.3869, 0.3869, 0.3869, 0.386...  0  0  0  1  0  0
7    [[0.1695, 0.2823, 0.2823, 0.2823, 0.2823, 0.28...  0  0  0  1  0  0
8    [[0.2005, 0.3575, 0.3575, 0.3575, 0.3575, 0.35...  0  0  0  0  1  0
9    [[0.1969, 0.344, 0.344, 0.344, 0.344, 0.344, 0...  0  0  0  0  1  0
10   [[0.2312, 0.4141, 0.4141, 0.4141, 0.4141, 0.41...  0  0  0  0  0  1
11   [[0.1862, 0.3084, 0.3084, 0.3084, 0.3084, 0.30...  0  0  0  0  0  1
12   [[0.2605, 0.47, 0.47, 0.47, 0.47, 0.47, 0.3814...  1  0  0  0  0  0
13   [[0.2154, 0.3733, 0.3733, 0.3733, 0.3733, 0.37...  1  0  0  0  0  0
.                            .                          .  .  .  .  .  .
.                            .                          .  .  .  .  .  .
.                            .                          .  .  .  .  .  .
.                            .                          .  .  .  .  .  .

首先,我已将数据框切片以包含我的 train_xtrain_y;

train_x = final_dataset.iloc[:,0] #the only input feature is the first column
train_y = final_dataset.iloc[:,1:] # rest of the columns are class labels

之后,我创建了我的神经网络并在其中添加了层;

model = Sequential()
model.add(Dense(256, input_shape = (1,))) # there is only one input feature
model.add(Activation('relu'))
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dense(6, activation='softmax'))

正如您在上面看到的,我将input_shape 设置为1,因为只有一个输入特征是ecg 列。实际上,对我来说令人困惑的部分是那部分,因为我无法选择输入形状,因为ecg 列的一行是一个形状像这样的行向量;

[[0.1912, 0.3597, 0.3597, 0.3597, 0.3597, 0.35... ]]

所有这些之后,我开始训练我的模型;

adam = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

model.compile(optimizer = adam, loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.fit(train_x,train_y,epochs = 500, batch_size = 32, validation_split = 0.3)

我使用categorical-crossentropy 作为我的损失函数。当我运行我的代码时,出现以下错误;

ValueError: 使用序列设置数组元素。

我对 Keras 很陌生,所以我无法弄清楚问题的原因以及如何解决它。任何帮助表示赞赏,在此先感谢。

【问题讨论】:

  • @心电信号多长时间?
  • @mujjiga,每一行都不一样
  • 所以你的输入大小不是 1,一行中 ecg 信号中的值的数量将是你的输入大小,即 len([0.1912, 0.3597, 0.3597, 0.3597, 0.3597, 0.35... ..]).
  • 如第一行心电信号长度为18937,第二行长度为19039,每行变化。
  • 如果它发生变化,那么您必须通过切割某些部分来固定长度。但是,如果您认为斩波会影响预测,那么您必须使用 LSTM 等模型,而不是完全连接的 NN。

标签: python keras


【解决方案1】:

错误1:输入大小不是1,而是ecg列的大小(包含每位患者心电值的列表大小)

错误 2: 你最后一个密集层的大小是 3,这是错误的,因为你有 6 个类,它应该是 6 个。

【讨论】:

  • 是的,我忘记把它从3改成6了。但是,我不明白错误是什么1。你能更清楚一点吗?谢谢。
猜你喜欢
  • 2011-06-08
  • 2018-08-04
  • 2019-08-04
相关资源
最近更新 更多