Классификация временных рядов — ошибка значения: установка элемента массива с последовательностью

#python #keras

#python #keras

Вопрос:

Я должен обучить модель классификации данных временных рядов. В этих данных 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_x и train_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 в качестве своей функции потерь. Когда я запускаю свой код, у меня возникает следующая ошибка;

Ошибка значения: установка элемента массива с последовательностью.

Я довольно новичок в Keras, поэтому я не мог понять, что вызывает проблему и как я могу это исправить. Любая помощь приветствуется, заранее спасибо.

Комментарии:

1. @какой длины сигнал ЭКГ?

2. @mujjiga, это отличается для каждой строки

3. Таким образом, ваш размер входных данных не равен 1, количество значений в сигнале экг в одной строке будет вашим размером входных данных, т. е. len([0.1912, 0.3597, 0.3597, 0.3597, 0.3597, 0.35…..]).

4. Например, в первой строке длина сигнала экг равна 18937. Во второй строке длина равна 19039. Это изменяется для каждой строки.

5. Если она изменяется, то либо вам нужно исправить длину, обрезав какую-то часть. Но если вы думаете, что прерывание повлияет на прогноз, тогда вам нужно использовать модели, подобные LSTM, а не полностью подключенный NN.

Ответ №1:

Ошибка 1: размер входных данных не равен 1, это размер столбца экг (размер списка, содержащего значения экг для каждого пациента)

Ошибка 2: Также ваш последний плотный слой имеет размер 3, что неверно, поскольку у вас 6 классов, их должно быть 6.

Комментарии:

1. Да, я забыл изменить его с 3 на 6. Тем не менее, я не мог понять, в чем ошибка 1. Не могли бы вы выразиться более ясно? Спасибо.