You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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自然识别不出这是两个独立的输入。


先搞懂模型需要的输入格式

你的模型定义了两个输入层:

  1. encoder_inputs:接收编码器的输入序列,要求形状是 (样本数量, 输入序列长度, 特征数),这里你的输入序列长度是15,特征数是1,所以单样本形状是(15,1),批量样本就是(N,15,1)
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:50:29