基于RNN与Keras的信号预测:输入数据正确形状咨询
解决Keras编码器-解码器模型输入形状不匹配的问题
咱们先拆解下你遇到的这个错误:ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 2 array(s), but instead got the following list of 1 arrays:
这个错误的核心是:你的模型是双输入的编码器-解码器架构,但你把两个输入打包成了一个数组传给它,Keras自然识别不出这是两个独立的输入。
先搞懂模型需要的输入格式
你的模型定义了两个输入层:
encoder_inputs:接收编码器的输入序列,要求形状是(样本数量, 输入序列长度, 特征数),这里你的输入序列长度是15,特征数是1,所以单样本形状是(15,1),批量样本就是(N,15,1)decoder_inputs:接收解码器的输入序列,要求形状是(样本数量, 目标序列长度, 1),这里目标序列长度是15,所以批量形状是(N,15,1)
而你的getXY()函数返回的X是把两个序列打包成了一个数组(形状是(100,2,15)),相当于把两个输入揉成了一个,Keras肯定会懵圈。
另外还有个隐藏问题:你生成的序列是二维的(比如[random.random() for _ in range(15)]是(15,)形状),但RNN要求输入必须是三维张量(哪怕特征数只有1,也要保留最后一维),否则模型也会报错。
修正后的代码实现
第一步:重新生成符合要求的输入数据
修改getXY()函数,分别生成两个独立的输入数组,并且给每个序列加上特征维度:
def getXY(): encoder_input_data = [] decoder_input_data = [] target_data = [] sample_count = 100 for _ in range(sample_count): # 生成编码器输入:15个随机数,转成(15,1)的形状(每个时间步1个特征) enc_seq = np.array([random.random() for _ in range(input_sequence_length)]).reshape(-1, 1) # 解码器输入按原逻辑用全0序列,同样转成(15,1) dec_seq = np.array([0.0 for _ in range(target_sequence_length)]).reshape(-1, 1) # 目标序列:15个随机数,转成(15,1) target_seq = np.array([random.random() for _ in range(target_sequence_length)]).reshape(-1, 1) encoder_input_data.append(enc_seq) decoder_input_data.append(dec_seq) target_data.append(target_seq) # 转成numpy数组,最终形状都是(100,15,1) return np.array(encoder_input_data), np.array(decoder_input_data), np.array(target_data)
第二步:正确传入输入数据进行训练
# 获取三个独立的数组 enc_X, dec_X, y = getXY() # 可以打印形状验证一下,确保符合要求 print(f"编码器输入形状: {enc_X.shape}") # 输出 (100, 15, 1) print(f"解码器输入形状: {dec_X.shape}") # 输出 (100, 15, 1) print(f"目标输出形状: {y.shape}") # 输出 (100, 15, 1) model = getModel() # 把两个输入用列表包裹传入fit(),而不是传一个打包好的数组 model.fit([enc_X, dec_X], y)
核心要点总结
- 编码器-解码器模型是多输入模型,训练时必须把每个输入作为独立的数组传入,用列表或字典封装
- RNN层的输入必须是三维张量:
(样本数, 时间步, 特征数),哪怕只有1个特征,也不能省略最后一维 - 你的目标输出
y也需要是三维的,因为模型输出是序列(每个时间步对应一个预测值)
内容的提问来源于stack exchange,提问作者M.M
相关产品推荐
相关产品推荐

