Keras功能API输入形状错误

时间:2019-08-08 08:44:37

标签: api keras functional-programming lstm multiple-input

我正在使用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)   

因为当我不应用移动窗口时它可以工作。但是我需要它,所以我不知道该怎么办。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您应该使用model.summary()查看图层和模型的输出形状,然后相应地调整模型和/或目标,问题是模型的输出与模型的输出不匹配。目标。

例如,如果您将LSTMreturn_sequences=True一起使用,则该LSTM的输出为3D,并被馈送到Dense中,后者仅在最后一个维度上运行,输出3D形状。也许那不是您想要的。您可以将return_sequences=False设置为更接近输出的LSTM图层,或者如果确实需要它们来输出序列,则可以将其平坦,因此Dense图层可以输出2D形状,在这种情况下,您应该将目标重塑为(4000, 1)