RNN模型报‘Input 0 of layer与层不兼容’错误的排查求助
解决RNN输入形状不兼容问题
错误核心原因
报错expected shape=(None, 90, 3), found shape=(None, 3)的本质问题:
- RNN层要求输入为3维张量:
(批次大小, 时间步长, 特征数) - 你的
X_train是2维张量(样本数, 3),缺少关键的「时间步」维度;同时input_shape里写的90无意义,既不匹配数据集规模,也和你定义的sequence_length=10矛盾 - 代码中定义了
sequence_length=10但未用来构造时序样本,等于无效设置
具体修复步骤
1. 构造时序数据集
将2维特征数据转换为RNN需要的3维时序格式:用过去sequence_length个时间步的特征,预测当前目标值PDB。添加以下函数生成时序样本:
def create_sequences(data, target, sequence_length): X, y = [], [] for i in range(len(data) - sequence_length): # 取连续sequence_length个时间步的特征 X.append(data[i:i+sequence_length]) # 取对应时间步的目标值 y.append(target[i+sequence_length]) return np.array(X), np.array(y)
用该函数处理训练、测试数据:
# 将DataFrame转为numpy数组 X_train_np = X_train.values y_train_np = y_train.values X_test_np = X_test.values y_test_np = y_test.values # 生成时序样本 X_train_seq, y_train_seq = create_sequences(X_train_np, y_train_np, sequence_length) X_test_seq, y_test_seq = create_sequences(X_test_np, y_test_np, sequence_length)
2. 修正模型输入形状
将input_shape改为实际使用的时间步长和特征数,同时删除重复的编译代码:
model = Sequential() # input_shape对应(时间步长, 特征数),批次维度由框架自动处理(即None) # 若当前RNN层后不再堆叠其他循环层,建议将return_sequences设为False,避免维度冗余 model.add(SimpleRNN(units=3, activation='relu', input_shape=(sequence_length, input_dim), return_sequences=False)) # 仅保留一次编译操作 adam = Adam(learning_rate=0.01) model.compile(optimizer=adam, loss='mean_squared_error')
3. 用时序样本训练模型
传入构造好的时序数据启动训练:
model.fit(X_train_seq, y_train_seq, epochs=10, batch_size=30)
额外注意事项
return_sequences=True仅在当前循环层后还堆叠其他循环层时需要开启,否则会导致输出维度冗余,引发后续层输入不兼容- 构造时序样本后,有效样本数会变为
原样本数 - sequence_length,若原数据集样本量过小,需适当调小sequence_length值
内容的提问来源于stack exchange,提问作者Alwan Rahmana Subian
相关产品推荐
相关产品推荐

