TensorFlow搭建SimpleRNN时输入维度不匹配报错求解决
报错根因
TensorFlow中所有循环神经网络层(包括SimpleRNN、LSTM、GRU)的输入要求为3维张量,维度格式固定为(样本数, 时间步长, 单时间步特征数),你当前的输入训练数据只有2维(8, 50),缺少最后一维的特征维度,所以触发维度不匹配报错。
另外你代码中给SimpleRNN传入input_dim参数的写法错误,input_dim是全连接层(Dense)的入参,RNN层需要通过input_shape指定输入的时间步和特征维度。
修复方案
首先明确你输入数据的业务含义,按最常见的场景(8为样本数、50为单样本的序列长度)修改,步骤如下:
- 第一步:给训练数据增加特征维度,将二维数据扩展为三维
# 假设每个时间步的特征数为1,添加最后一维后数据形状从(8,50)变为(8,50,1) trainingData = np.expand_dims(trainingData, axis=-1)
- 第二步:修改SimpleRNN层的输入参数配置,指定正确的输入形状
import numpy as np from tensorflow import keras from tensorflow.keras import layers from keras.regularizers import l2 model = keras.Sequential() model.add(layers.SimpleRNN( units= 8, activation='sigmoid', kernel_regularizer=l2(0.0), # 输入形状对应(时间步长=50, 单时间步特征数=1),样本数维度不需要显式指定 input_shape = (50, 1))) model.compile(optimizer=keras.optimizers.RMSprop(learning_rate=1e-3), loss=keras.losses.MeanSquaredError(), metrics=[keras.metrics.MeanSquaredError()],) # 此时trainingData形状为(8,50,1),OutputData形状为(8,8),维度匹配可以正常训练 model.fit( x=trainingData, y=OutputData, batch_size=5, epochs=2000, verbose=0,)
其他场景适配
如果你的业务逻辑中50为样本数、8为单时间步特征数、时间步长为1,则修改方式为:
- 将训练数据调整为形状
(50, 1, 8) - SimpleRNN层的input_shape改为
(1, 8) - 对应输出标签的维度调整为
(50, 8)即可
内容的提问来源于stack exchange,提问作者Islam Ahmed A. Mohammed
相关产品推荐
相关产品推荐

