Keras RNN维度报错:reshape操作无法解决输入维度不匹配问题
错误原因
- 数据集生成函数逻辑错误
你写的create_dataset函数把滞后阶数作为了数组第一维,样本数放在了第二维,导致lags=1时输出的x_train形状为(1, 49),和RNN要求的输入维度(样本数, 时间步长, 特征数)完全不匹配。同时你生成的y_train形状为(1, 49),也不符合训练时标签的维度要求。 - 输入reshape逻辑错误
你后续reshape时直接把最后一维设为原x_train的第二维(也就是49),得到的形状为(1, 1, 49),和你在SimpleRNN层定义的input_shape=(1, 1)(时间步长1、单特征)完全不匹配,所以触发第二次报错。
解决方法
第一步:修正数据集生成函数
把遍历逻辑改为遍历所有样本,将样本数作为输出数组的第一维:
def create_dataset(dataset, lags): dataX, dataY = [], [] # 总样本数 = 数据集长度 - 滞后阶数 for i in range(len(dataset) - lags): # 取i到i+lags的数据作为输入特征 dataX.append(dataset[i:i+lags]) # 取i+lags位置的数据作为标签 dataY.append(dataset[i+lags]) return np.array(dataX), np.array(dataY)
修正后调用x_train, y_train = create_dataset(df_train, lags = 1),得到的x_train形状为(49, 1),y_train形状为(49,)。
第二步:正确reshape输入适配RNN要求
RNN要求输入为三维,对应(样本数, 时间步长, 特征数),你的场景下时间步长=1,单特征,所以按如下方式reshape即可:
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
reshape后x_train形状为(49, 1, 1),和你定义的input_shape=(1, 1)完全匹配。
第三步:正常训练模型
原有的模型定义、训练代码无需修改,直接运行即可正常训练。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

