ValueError: Ошибка при проверке цели: ожидалось, что у density_1 будет 2 измерения, но получен массив с формой (2849, 1, 2) - PullRequest
1 голос
/ 16 июня 2020

Итак, я хочу предсказать местоположение агента в среде, закодированной с использованием декартовых координат. Для этого я хочу использовать модель LSTM, но у меня возникают некоторые проблемы с настройкой простой модели, которую я затем могу расширить. Данные, которые я использую, выглядят так:

    x0  y0  x1  y1  x2  y2  x5  y5
0   0   5   1   5   1   4   3   3
1   1   5   1   4   2   4   3   2
2   1   4   2   4   2   3   4   2
3   2   4   2   3   3   3   4   1

Где от x0 до y2 - это функции (или X) (с числом, указывающим временной шаг), а x5 и y5 - это прогнозируемые значения (или y ). Итак, сначала я предварительно обработал данные, чтобы они соответствовали модели LSTM, например:

path_df = pd.read_csv("data/preprocessed_data.csv", sep="\t", index_col=0)

X = path_df[["x0", "y0", "x1", "y1", "x2", "y2"]].to_numpy()
y = path_df[["x5", "y5"]].to_numpy()

X = X.reshape(len(X), 3, 2)
y = y.reshape(len(y), 1, 2)

Это дает мне массивы, которые выглядят так:

X[0] = 
  [[[ 3  1]
    [ 3  2]
    [ 2  2]]
Y[0] = 
  [[ 1 4]]

Я думаю, что это правильно отформатировано для использования в модели LSTM (если это не так, скажите мне). Затем я создаю простую модель usig keras, например:

model = Sequential()

model.add(LSTM(4, input_shape=(3, 2)))
model.add(Dense(1))
model.compile(loss="mean_squared_error", optimizer="adam")
model.fit(X, y, epochs=100, verbose=2)

Если я прав, я считаю, что это дало бы мне модель, которая имеет входной слой формы (3,2), что является правильным учитывая исходные данные. И выходной слой, который должен дать мне 1 значение, которое будет предсказанным местоположением. Но когда я запускаю это, я получаю:

ValueError: Error when checking target: expected dense_1 to have 2 dimensions, but got array with shape (2849, 1, 2)

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

1 Ответ

1 голос
/ 16 июня 2020

ваша модель на самом деле является двухмерной, поэтому вам нужно пройти двумерную цель. вам не нужно изменять форму цели таким образом y.reshape(len(y), 1, 2). просто позвольте ему в исходном 2D формате

X = np.random.uniform(0,1, (100,3,2))
y = np.random.uniform(0,1, (100,2))

model = Sequential()
model.add(LSTM(4, input_shape=(3, 2)))
model.add(Dense(2))
model.compile(loss="mean_squared_error", optimizer="adam")
model.fit(X, y, epochs=100, verbose=2)

ваши входные данные выглядят правильно. не забудьте установить Dense (2) на выходе, потому что у вас есть 2 выходных объекта / координаты

...