我正在使用Keras Functional API进行带有多变量输入和单个输出的时间序列预测:WhatsApp
。
因此,我有两个带有几层的网络分支,这些分支在处理后会串联在一起。
代码如下:
(x_1, x_2, y)
现在,由于LSTM层希望使用3D numpy数组,因此我将相应地重塑输入数据:
# 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)
现在,我的输入数据具有以下形状:
# 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))
因为我还在输入数据上使用了4个时间步长的移动窗口/回溯。
这是问题所在。因为移动x_1: (4000, 4, 1)
x_2: (4000, 4, 1)
y: (4000, 1, 1)
当然不适用于我的输出。
所以我认为这就是为什么在运行网络时出现此错误的原因:
“检查目标时出错:预期density_6的形状为(4,1),但数组的形状为(1,1)
因为当我不应用移动窗口时它可以工作。但是我需要它,所以我不知道该怎么办。
任何人都可以帮忙吗?
答案 0 :(得分:0)
您应该使用model.summary()
查看图层和模型的输出形状,然后相应地调整模型和/或目标,问题是模型的输出与模型的输出不匹配。目标。
例如,如果您将LSTM
与return_sequences=True
一起使用,则该LSTM的输出为3D,并被馈送到Dense
中,后者仅在最后一个维度上运行,输出3D形状。也许那不是您想要的。您可以将return_sequences=False
设置为更接近输出的LSTM图层,或者如果确实需要它们来输出序列,则可以将其平坦,因此Dense
图层可以输出2D形状,在这种情况下,您应该将目标重塑为(4000, 1)
。