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),

Другие вопросы по тегам