Ввод данных в сеть LSTM Keras - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть 10 массивов.Каждый из них представляет одну точку данных (вход).Форма массивов (16,3), (34,3) и т. Д. Поскольку LSTM нужны данные 3dim, я изменил форму каждого из этих 10 массивов.Пример: если это было (16,3), то теперь это (1,16,3).Я пытался получить ((1,16,3), (1,34,3) и т. Д.) В качестве формы моего массива, другими словами, 10 массивов в одном массиве с каждой из форм (1, что-то, 3).Когда я передаю данные со всеми 10 массивами как один, я получаю следующую ошибку:

Ошибка при проверке ввода модели: список массивов Numpy, которые вы передаете своей модели, не соответствует размеру моделиожидается.Ожидается увидеть 1 массив (ов), но вместо этого получен следующий список из 10 массивов.

Но если я добавлю один из этих массивов одной меткой, он будет работать и переопределится (как и должно быть).Если batch_size = 1, не должна ли программа взять один из этих 10 образцов для обучения?

Вот мой код:

import os
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM

data = []
directory = 'realData'
for filename in os.listdir(directory):
    data.append(np.load('realData/' + filename))

for i in range(len(data)):
    data[i] = data[i].reshape(1,data[i].shape[0],3)

sad = np.array([[0]] * 2)
okay = np.array([[1]] * 3)
happy = np.array([[2]] * 2)
perfect = np.array([[3]] * 3)

labels = np.concatenate([sad,okay,happy,perfect],axis=0)

model = Sequential()
model.add(LSTM(32, input_shape=(None,3)))
model.add(Dense(1))

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

print('Train...')    
model.fit(data, labels,
          batch_size=1,
          epochs=15,
          validation_data=(data, labels))

score, acc = model.evaluate(data, labels, batch_size=1)
print('Test score:', score)
print('Test accuracy:', acc)

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

LSTM-ввод во время обучения ожидает массив Numpy.В этом случае вы можете заполнить каждый массив до максимальной длины в пакете / вводе, а затем преобразовать их в массив Numpy.

import numpy as np

def pad_txt_data(arr):
  paded_arr = []
  prefered_len = len(max(arr, key=len))

  for each_arr in arr:
    if len(each_arr) < prefered_len:
      print('padding array with zero')
      while len(each_arr) < prefered_len:
          each_arr.insert(0, np.zeros(3))
      paded_arr.append(each_arr)
  return np.array(paded_arr)

# your_arr = [shape(16, 3), shape(32, 3), . .. .]
# loop through your_arr and prepare a single array with all the arrays and pass this array to padding function.

interm_arr = []
def input_prep():
  for each_arr in your_arr:
    interm_arr.append(each_arr)
  final_arr = pad_txt_data(interm_arr)

Таким образом, конечный массив будет иметь форму (input_size, maxlength, features_size)).В этом случае, если у вас есть 10 массивов на входе, final_arr будет иметь форму (10, max_lenth, 3).Вы можете использовать это как вход для LSTM.

0 голосов
/ 10 февраля 2019

Ваша модель ожидает в качестве входных данных массив значений, где первое измерение - это измерение пакета.Вместо этого вы предоставляете ему список массивов.Вы можете преобразовать список массивов в один массив с помощью data = np.array(data).

...