Ошибка при проверке ввода модели: ожидалось, что lstm_1_input будет иметь 3 измерения, но получил массив с формой (339732, 29)

Мой ввод - это просто файл csv с 339732 строками и двумя столбцами:

  • первая из 29 значений характеристик, т. е. X
  • второй - двоичное значение метки, то есть Y

Я пытаюсь обучить свои данные многослойной модели LSTM:

data_dim = 29
timesteps = 8
num_classes = 2

model = Sequential()
model.add(LSTM(30, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 30
model.add(LSTM(30, return_sequences=True))  # returns a sequence of vectors of dimension 30
model.add(LSTM(30))  # return a single vector of dimension 30
model.add(Dense(1, activation='softmax'))

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

model.summary()
model.fit(X_train, y_train, batch_size = 400, epochs = 20, verbose = 1)

Это вызывает ошибку:

Traceback (последний вызов последним): файл first_approach.py, строка 80, в model.fit (X_train, y_train, batch_size = 400, epochs = 20, verbose = 1)

ValueError: ошибка при проверке ввода модели: ожидалось, что lstm

data_dim = 29
timesteps = 8
num_classes = 2

model = Sequential()
model.add(LSTM(30, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 30
model.add(LSTM(30, return_sequences=True))  # returns a sequence of vectors of dimension 30
model.add(LSTM(30))  # return a single vector of dimension 30
model.add(Dense(1, activation='softmax'))

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

model.summary()
model.fit(X_train, y_train, batch_size = 400, epochs = 20, verbose = 1)
input будет иметь 3 измерения, но получил массив с формой (339732, 29)

Я попытался изменить форму ввода с помощью X_train.reshape((1,339732, 29)), но это не сработало, показывая ошибку:

ValueError: ошибка при проверке ввода модели: ожидалось, что lstm

data_dim = 29
timesteps = 8
num_classes = 2

model = Sequential()
model.add(LSTM(30, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 30
model.add(LSTM(30, return_sequences=True))  # returns a sequence of vectors of dimension 30
model.add(LSTM(30))  # return a single vector of dimension 30
model.add(Dense(1, activation='softmax'))

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

model.summary()
model.fit(X_train, y_train, batch_size = 400, epochs = 20, verbose = 1)
input будет иметь форму (None, 8, 29), но получил массив с формой (1, 339732, 29)

Как я могу передать свой ввод в LSTM?


person Saurav--    schedule 22.06.2017    source источник
comment
Почему вы используете модель LSTM без временных шагов?   -  person from keras import michael    schedule 28.08.2018


Ответы (3)


Установка timesteps = 1 (поскольку мне нужен один временной шаг для каждого экземпляра) и изменение формы X_train и X_test как:

import numpy as np
X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
X_test = np.reshape(X_test, (X_test.shape[0], 1, X_test.shape[1]))

Это сработало!

person Saurav--    schedule 22.06.2017

Для timesteps != 1 вы можете использовать следующую функцию (адаптированную из здесь)

import numpy as np
def create_dataset(dataset, look_back=1):
  dataX, dataY = [], []
  for i in range(len(dataset)-look_back+1):
    a = dataset[i:(i+look_back), :]
    dataX.append(a)
    dataY.append(dataset[i + look_back - 1, :])
  return np.array(dataX), np.array(dataY)

Примеры

X = np.reshape(range(30),(3,10)).transpose()
array([[ 0, 10, 20],
       [ 1, 11, 21],
       [ 2, 12, 22],
       [ 3, 13, 23],
       [ 4, 14, 24],
       [ 5, 15, 25],
       [ 6, 16, 26],
       [ 7, 17, 27],
       [ 8, 18, 28],
       [ 9, 19, 29]])

create_dataset(X, look_back=1 )
(array([[[ 0, 10, 20]],
       [[ 1, 11, 21]],
       [[ 2, 12, 22]],
       [[ 3, 13, 23]],
       [[ 4, 14, 24]],
       [[ 5, 15, 25]],
       [[ 6, 16, 26]],
       [[ 7, 17, 27]],
       [[ 8, 18, 28]],
       [[ 9, 19, 29]]]),
array([[ 0, 10, 20],
       [ 1, 11, 21],
       [ 2, 12, 22],
       [ 3, 13, 23],
       [ 4, 14, 24],
       [ 5, 15, 25],
       [ 6, 16, 26],
       [ 7, 17, 27],
       [ 8, 18, 28],
       [ 9, 19, 29]]))

create_dataset(X, look_back=3)
(array([[[ 0, 10, 20],
        [ 1, 11, 21],
        [ 2, 12, 22]],
       [[ 1, 11, 21],
        [ 2, 12, 22],
        [ 3, 13, 23]],
       [[ 2, 12, 22],
        [ 3, 13, 23],
        [ 4, 14, 24]],
       [[ 3, 13, 23],
        [ 4, 14, 24],
        [ 5, 15, 25]],
       [[ 4, 14, 24],
        [ 5, 15, 25],
        [ 6, 16, 26]],
       [[ 5, 15, 25],
        [ 6, 16, 26],
        [ 7, 17, 27]],
       [[ 6, 16, 26],
        [ 7, 17, 27],
        [ 8, 18, 28]],
       [[ 7, 17, 27],
        [ 8, 18, 28],
        [ 9, 19, 29]]]),
array([[ 2, 12, 22],
       [ 3, 13, 23],
       [ 4, 14, 24],
       [ 5, 15, 25],
       [ 6, 16, 26],
       [ 7, 17, 27],
       [ 8, 18, 28],
       [ 9, 19, 29]]))
person Shadi    schedule 07.07.2017
comment
Получение этой ошибки, когда я передаю объект, возвращенный из create_dataset(), в model.fit() AttributeError: 'tuple' object has no attribute 'shape' - person jlewkovich; 19.03.2019
comment
create_dataset возвращает кортеж x, y. Попробуйте x_train, y_train = create_dataset(dataset), а затем model.fit(x_train, y_train) - person Shadi; 19.03.2019
comment
У меня есть входной обучающий набор, который представляет собой np.array, состоящий из 100 строк и 50 столбцов. Некоторые из этих столбцов содержат значения с плавающей запятой, некоторые содержат горячие кодировки, построенные с помощью keras.utils.to_categorical(), которые в основном являются просто массивами. Я не понимаю, как использовать x_train и y_train. Мои обучающие метки находятся в отдельном массиве, модель ввода содержит только обучающие данные (первый ввод в model.fit ()) - person jlewkovich; 19.03.2019
comment
В этом случае просто игнорируйте y_train из этой функции и используйте тот, который у вас уже есть в отдельном массиве. Кроме того, model.fit примет x_train из этой функции и вашей собственной цели. - person Shadi; 19.03.2019
comment
все еще не работает, я объявил награду за вопрос, который имитирует мою проблему: stackoverflow.com/questions/51469446/ В основном обработка на последовательном уровне обучающего набора, который содержит как массивы, так и числовые значения. - person jlewkovich; 19.03.2019
comment
Я только что опубликовал для вас ответ с работающей записной книжкой jupyter. - person Shadi; 19.03.2019
comment
@JLewkovich помог тебе мой ответ? - person Shadi; 25.03.2019

Изменить форму ввода для LSTM:

X = array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
X_train = X.reshape(1, 3, 3) # X.reshape(samples, timesteps, features)
person Ashok Kumar Jayaraman    schedule 12.07.2018