Python 如何修复';检查输入时出错:预期输入_1有2个维度,但得到的数组的形状为(32,168,5)';

Python 如何修复';检查输入时出错:预期输入_1有2个维度,但得到的数组的形状为(32,168,5)';,python,tensorflow,machine-learning,keras,lstm,Python,Tensorflow,Machine Learning,Keras,Lstm,我正在尝试实现一个多输入LSTM-DNN混合模型,其中两个层的输出是串联的。不幸的是,在开始培训后,这种情况就发生了: ValueError: Error when checking input: expected input_1 to have 2 dimensions, but got array with shape (32, 168, 5) 我研究过其他方法,但最关心的是当得到的数组的维数小于预期值时的情况。我已经读到扁平化可能会有帮助,但我不确定如何实现它 这是我的模型: # fi

我正在尝试实现一个多输入LSTM-DNN混合模型,其中两个层的输出是串联的。不幸的是,在开始培训后,这种情况就发生了:

ValueError: Error when checking input: expected input_1 to have 2 dimensions, but got array with shape (32, 168, 5)

我研究过其他方法,但最关心的是当得到的数组的维数小于预期值时的情况。我已经读到扁平化可能会有帮助,但我不确定如何实现它

这是我的模型:

# first input model
input_1 = Input(shape=(5, ))
input_1_expand = tf.expand_dims(input_1, axis=-1) 
dense_1 = Dense(units=64, input_shape=(None, 5,))(input_1_expand)

# second input model
input_2 = Input(shape=(7, ))
input_2_expand = tf.expand_dims(input_2, axis=-1)
lstm_1 = LSTM(units=64, return_sequences=True, input_shape=(None, 7,))(input_2_expand)

# merge input models
merge = concatenate([dense_1, lstm_1], axis=1)
output = Dense(num_y_signals, activation='sigmoid')(merge)
model = Model(inputs=[input_1, input_2], outputs=output)
# summarize layers
print(model.summary())
模型培训:

%time
model.fit_generator(generator=generator,
                    epochs=10,
                    steps_per_epoch=30,
                    validation_data=validation_data,
                    callbacks=callbacks)
其中generator是一个生成

 [x_batch_1, x_batch_2], y_batch
其中32为批量大小,168为序列长度

我也不确定如何实现tf.expand和concatenate axis。我只是尝试了使模型编译的组合

编辑: 我忘了包括验证数据:

validation_data = ([np.expand_dims(x_test1_scaled, axis=0),
                    np.expand_dims(x_test2_scaled, axis=0)],
                   np.expand_dims(y_test_scaled, axis=0))
在哪里

expanded x_test1_scaled Shape: (1, 5808, 5)
expanded x_test2_scaled Shape: (1, 5808, 7)
expanded y_test_scaled Shape: (1, 5808, 1)

您还需要将
sequencr length
放入输入形状中,形状必须与
x\u batch.shape[1://code>

像这样

input_1 = Input(shape=(168, 5, ))
dense_1 = Dense(units=64, input_shape=(None, 5,))(input_1)

input_2 = Input(shape=(168, 7, ))
lstm_1 = LSTM(units=64, return_sequences=True, input_shape=(None, 7,))(input_2)


我想您尝试使用
扩展\u dims
来修复此问题,因此我不包括该问题。

您的输入\u 1和输入\u 2示例得到了1维,这使得培训输入\u 1或输入\u 2仅为2维,但您的生成器为每个输入\u 1或输入\u 2都提供了3维

input_1 = Input(shape=(5, ))

input_2 = Input(shape=(7, ))

顺便说一句,如果你编辑了你的姿势,你也应该在评论中通知回答者,否则不会通知。我已经更新了帖子,加入了关于验证数据的信息。我已经试过你的帖子(删除了expand_dims和concatenate中的轴),我还用None替换了168,以允许可变输入和它训练!谢谢。如果您的意思是希望使用
验证\u数据
,即5808而不是168,那么这可能不起作用。您需要使它们相同,因为
Dense
LSTM
需要特定于输入形状。对不起,使它们相同是什么意思?但是没有允许可变大小的吗?我把输入1和输入2的168都改成了无,它确实可以训练。真的吗?我原以为密集层需要输入形状才能得到准确的数字,而且不能更改,但我可能错了
input_1 = Input(shape=(5, ))

input_2 = Input(shape=(7, ))