Я строю несколько простых моделей в Керасе, чтобы улучшить свои знания в области глубокого обучения, и сталкиваюсь с некоторыми проблемами, которые я не совсем понимаю, как отлаживать.
Я хочу использовать 1D CNN для выполнения регрессии на некоторых данных временных рядов. Мой тензор входных объектов имеет форму N x T x D
, где N - количество точек данных, T
- количество последовательностей, а D
- количество измерений. Мой целевой тензор имеет форму N x T x 1
(1, потому что я пытаюсь вывести скалярное значение).
Я настроил свою модель архитектуры следующим образом:
feature_tensor.shape
# (75584, 40, 38)
target_tensor.shape
# (75584, 40, 1)
inputs = Input(shape=(SEQUENCE_LENGTH,DIMENSIONS))
conv1 = Conv1D(filters=64, kernel_size=3, activation='relu')
x = conv1(inputs)
x = MaxPooling1D(pool_size=2)(x)
x = Flatten()(x)
x = Dense(100, activation='relu')(x)
predictions = Dense(1, activation="linear")(x)
model = Model(inputs, predictions)
opt = Adam(lr=1e-5, decay=1e-4 / 200)
model.compile(loss="mean_absolute_error", optimizer=opt)
Однако, когда я пытаюсь обучить мою модель, я получаю следующий вывод:
r = model.fit(cleaned_tensor, target_tensor, epochs=100, batch_size=2058)
ValueError: Ошибка при проверке целевого объекта: ожидается, что плотность_доступна 2
размеры, но получил массив с формой (75584, 40, 1).
Первые два числа знакомы: 75584 - это число выборок, 40 - длина последовательности.
Когда я отлаживаю свой сводный объект модели, я вижу, что ожидаемый результат от слоя Flatten
должен быть 1216
:

Однако мы с коллегой долго смотрели на код и не могли понять, почему форма (75584, 40, 1)
была получена через архитектуру, когда она достигла плотного слоя.
Может ли кто-нибудь указать мне, что я делаю неправильно?