SimpleRNN做帕金森步态预测时输入维度不匹配报错如何解决
错误原因与解决方案
该
ValueError的核心原因是SimpleRNN层要求输入为3维张量,格式为(批量大小, 时间步长, 单步特征数),但你当前输入的图像数据为4维张量,多了一个灰度通道维度。
你的单批次输入shape为(64, 16, 240, 1),各维度含义为:批量大小64、图像宽度16(对应RNN的时间步长)、图像高度240(对应单时间步的特征数)、灰度通道数1,多余的最后一个通道维度是报错的直接原因。
你之前设置input_shape=a.shape[1:]依然报错的原因是,a.shape[1:]得到的是(16,240,1),输入到模型时整体维度还是(64,16,240,1)的4维结构,没有解决多余通道的问题。
可选解决方案
方案1:提前预处理输入数据,删除多余通道
使用squeeze方法去掉输入张量最后一个长度为1的通道维度,处理后的数据直接符合RNN输入要求:
# 处理输入数据,去掉最后一个通道维度 a = tf.squeeze(a, axis=-1) # 处理后a的shape为(64, 16, 240),符合RNN的3维输入要求
同步修改模型的输入形状配置,注意input_shape不需要包含批量大小维度,对应时间步长16、单步特征240即可:
model = Sequential() # 把原来的input_shape=(64,240)改成(16,240) model.add(SimpleRNN(24, kernel_initializer='glorot_uniform', input_shape=(16,240), return_sequences = True)) # 后续层代码保持不变
方案2:在模型中添加Reshape层自动调整维度
如果不想修改输入数据的预处理逻辑,可以直接在模型最开始加一层Reshape,自动去掉多余的通道维度:
model = Sequential() # 新增Reshape层,适配4维输入,自动转换为RNN需要的3维格式 model.add(Reshape((16, 240), input_shape=(16,240,1))) model.add(SimpleRNN(24, kernel_initializer='glorot_uniform', return_sequences = True)) # 后续层代码保持不变
内容的提问来源于stack exchange,提问作者Anu Deepa
相关产品推荐
相关产品推荐

