Keras Functional API Ошибки формы ввода
Я использую Keras Functional API для прогнозирования временных рядов с многомерным входом и одним выходом: (x_1, x_2, y)
,
Поэтому у меня есть две ветви сети с несколькими слоями, которые я объединяю после обработки.
Код выглядит так:
# Define Model Input Sets
inputA = Input(shape=(4, 1))
inputB = Input(shape=(4, 1))
# Build Model Branch 1
branch_1 = layers.LSTM(8, activation='tanh', dropout=0.2, return_sequences=True)(inputA)
branch_1 = layers.Dense(8, activation='tanh')(branch_1)
branch_1 = layers.Dropout(0.2)(branch_1)
branch_1 = layers.LSTM(6, activation='tanh', dropout=0.2, return_sequences=True)(branch_1)
branch_1 = layers.Dense(6, activation='tanh')(branch_1)
branch_1 = layers.Dropout(0.2)(branch_1)
branch_1 = Model(inputs=inputA, outputs=branch_1)
# Build Model Branch 2
branch_2 = layers.LSTM(8, activation='tanh', dropout=0.2, return_sequences=True)(inputB)
branch_2 = layers.Dense(8, activation='tanh')(branch_2)
branch_2 = layers.Dropout(0.2)(branch_2)
branch_2 = layers.LSTM(6, activation='tanh', dropout=0.2, return_sequences=True)(branch_2)
branch_2 = layers.Dense(6, activation='tanh')(branch_2)
branch_2 = layers.Dropout(0.2)(branch_2)
branch_2 = Model(inputs=inputB, outputs=branch_2)
# Combine Model Branches
combined = layers.concatenate([branch_1.output, branch_2.output])
# apply a FC layer and then a regression prediction on the combined outputs
comb = layers.Dense(2, activation='tanh')(combined)
comb = layers.Dense(1, activation="linear")(comb)
# Accept the inputs of the two branches and then output a single value
model = Model(inputs=[branch_1.input, branch_2.input], outputs=comb)
model.compile(loss='mae', optimizer='adam', metrics=['accuracy'])
# Training
model.fit([x_1_train, x_2_train], y_train, epochs=ep, batch_size=bs)
Теперь, когда слой LSTM ожидает трехмерный массив, я соответственно изменяю свои входные данные:
# Data
x_1 = data[['Temp']].values
x_2 = data[['Precip']].values
y = data[['GWL']].values
# Reshape Data
x_1 = np.reshape(x_1, (len(x_1), x_1.shape[1], 1)) # 3D tensor with shape (batch_size, timesteps, input_dim)
x_2 = np.reshape(x_2, (len(x_2), x_2.shape[1], 1))
y = np.reshape(y, (len(y), 1, 1))
Теперь мои входные данные имеют форму:
x_1: (4000, 4, 1)
x_2: (4000, 4, 1)
y: (4000, 1, 1)
как я также использую движущееся окно / просмотр 4 входных данных.
И здесь проблема. Потому что движущиеся window/lookback
не относится к моему выводу, конечно.
Поэтому я предполагаю, что именно поэтому я получаю эту ошибку при запуске сети:
Msgstr "Ошибка при проверке цели: ожидается, что dens_6 будет иметь форму (4, 1), но получил массив с формой (1, 1) "
Потому что это работает, когда я не применяю движущееся окно. Но мне это нужно, поэтому я не знаю, что делать.
Может кто-нибудь помочь??
1 ответ
Вы должны использовать model.summary()
Чтобы увидеть выходные формы ваших слоев и модели, а затем соответственно скорректировать модель и / или цели, проблема заключается в том, что существует несоответствие между выходом модели и целями.
Например, если вы используете LSTM
с участием return_sequences=True
, то выход этого LSTM является 3D, который подается в Dense
это работает только в последнем измерении, а также выводит трехмерную фигуру. Может быть, это не то, что вы хотите. Вы могли бы просто установить return_sequences=False
к слоям LSTM, которые находятся ближе к выходу, или просто сглаживаются, если они действительно нужны для вывода последовательности, поэтому Dense
слои выводят 2D фигуры, в этом случае вы должны изменить цели как (4000, 1)
,