LSTM Keras - Какая правильная форма ввода - PullRequest
0 голосов
/ 07 августа 2020

на самом деле я пытаюсь построить LSTM-модель в Keras и Tensorflow. В моем наборе данных около 3200 элементов с 4 характеристиками и 3 метками.

X Shape: (3200, 4)
Y Shape: (3200, 3)

Если я хочу, чтобы шаги были примерно в 5 раз, мне нужно изменить форму следующим образом:

n_time_steps= 5
n_features = 4
X_train = X_train.reshape((-1, n_time_steps, n_features))

, поэтому я получите эти формы:

X Shape: (640, 5, 4)
Y Shape: (3200, 3)

Я немного запутался, потому что 640 =! 3200 точек данных ... но модель компилируется и подходит без ошибок. Но а cc и потеря безумны. Когда я пытаюсь изменить форму Y_train, Y Shape: (640, 5, 3) выдает

Несовместимые формы: [10,3] vs. [10,5,3] [[подузловой под (определен на: 12)]] [ Op: __ inference_train_function_74818 Стек вызовов функций: train_function

Вот моя модель

opt = 'adam'
model = keras.Sequential()
model.add(layers.LSTM(128, input_shape=(n_time_steps,4)))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(3 ,activation="sigmoid"))
model.compile(optimizer=opt,loss=hn_multilabel_loss,metrics=['accuracy','mae'])
model.summary()

history = model.fit(X_train, Y_train,batch_size = 10, epochs=10, validation_split = 0.1)

Кто-нибудь знает, как создать LSTM с 5 временными шагами и 4 функциями? Какая правильная форма ввода и вывода?

Спасибо, ребята!

1 Ответ

0 голосов
/ 07 августа 2020

Вы можете использовать эту функцию для преобразования 2D-набора данных в набор данных с настраиваемым количеством временных шагов:

def multivariate_data(dataset, target, start_index, end_index, history_size,
                      target_size, step, single_step=False):
  data = []
  labels = []

  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size

  for i in range(start_index, end_index):
    indices = range(i-history_size, i, step)
    data.append(dataset[indices])

    if single_step:
      labels.append(target[i+target_size])
    else:
      labels.append(target[i:i+target_size])

  return np.array(data), np.array(labels)

Я успешно справился с вашей задачей (я немного упростил):

import tensorflow as tf
import numpy as np
from tensorflow.keras import layers

X_train = np.random.rand(3200, 4)
y_train = np.random.randint(0, 2, (3200, 3))

def multivariate_data(dataset, target, start_index, end_index, history_size,
                      target_size, step, single_step=False):
  data, labels = [], []
  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size
  for i in range(start_index, end_index):
    indices = range(i-history_size, i, step)
    data.append(dataset[indices])
    if single_step:
      labels.append(target[i+target_size])
    else:
      labels.append(target[i:i+target_size])

  return np.array(data), np.array(labels)

X_train, y_train = multivariate_data(X_train, y_train, 0, 3200, 5, 0, 1, True)

n_time_steps, n_features = 5, 4

model = tf.keras.Sequential()
model.add(layers.LSTM(128, input_shape=(n_time_steps,4)))
model.add(layers.Dense(3))
model.compile(optimizer='adam',loss='mae')

history = model.fit(X_train, y_train, batch_size = 10, epochs=1)

Вывод:

  10/3195 [..............................] - ETA: 16:12 - loss: 0.3244
 120/3195 [>.............................] - ETA: 1:19 - loss: 0.2725 
 230/3195 [=>............................] - ETA: 40s - loss: 0.2536 
 330/3195 [==>...........................] - ETA: 27s - loss: 0.2545
 440/3195 [===>..........................] - ETA: 20s - loss: 0.2597
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...