LSTM предсказывает один результат за раз - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь предсказать один результат из моей LSTM модели

моя модель имеет n_features = 32 и time_step = 100 со следующим кодом

  model = tf.keras.Sequential([
  tf.keras.layers.InputLayer( input_shape=(time_step , n_features)), 
  tf.keras.layers.LSTM(64),
  tf.keras.layers.Dense(1)]
)

Я обучил свою модель с помощью генератора

generator = TimeseriesGenerator(x_feature,y_target,length=time_step ,batch_size = 128)

Когда я пытаюсь предсказать мою модель, используя набор тестовых данных с формой (2,32), которая имеет 2 строки и 32 объекта.

(я планирую получить 2 прогноза от моей модели)

У меня есть следующая ошибка

ValueError: Input 0 of layer sequential is incompatible with the layer: expected ndim=3, found ndim=2. 
Full shape received: [None, 32]

Я понимаю это, потому что мой тестовый набор данных имеет форму [None,32], но как я могу изменить его, чтобы он приобрел форму (100,32)

Я пытался изменить его, используя

x_feature.reshape(-1,100,36)
model.predict(x_feature)

Однако он показывает

ValueError: cannot reshape array of size 64 into shape (100,36)

Как я могу справиться с такой проблемой изменения формы, когда моя форма ввода модели 100,36, но набор тестовых данных имеет форму 2,36?

Спасибо!

1 Ответ

0 голосов
/ 22 марта 2020

Keras модель всегда ожидает, что inputs будет иметь форму (batch_size, time_steps, n_features) в случае LSTM слоев. Когда вы тренируетесь, это работает, потому что вы тренируетесь на нескольких примерах, то есть с фиксированным размером партии. Однако, когда вы прогнозируете и используете один пример, вам следует добавить пакетное измерение, чтобы оно работало. Допустим, ваш единственный пример x имеет форму (time_steps,n_features), вы должны использовать:

x = numpy.expand_dims(x, 0)

, который преобразует ваш x в форму (1, time_steps, n_features), и модель будет работать так, как если бы входы имеют размер пакета 1 . Теперь, если вы позвоните

output = model.predict(x)

, вы получите список с одним элементом. Так что output[0] будет предсказанием для вашего оригинального x .

Указанная вами ошибка вызвана тем, что вы не добавляете размер пакета, и, следовательно, модель жалуется на то, что она получает ввод с ndim = 2 вместо 3. Предлагаемые выше модификации устранят ошибку, однако это все еще не работает для проблемы, которую вы пытаетесь решить, потому что вы обучаете модель с time_steps 100 и функциями 32. Так что это будет работать, только если ваш тестовый пример имеет столько временных шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...