TensorFlow构建多层多类多标签LSTM时维度不匹配错误求助
兄弟,这个维度不匹配的坑我之前踩过,咱们先拆解一下错误信息:ValueError: Dimensions must be equal, but are 1000 and 923 for 'rnn/while/rnn/multi_rnn_cell/cell_0/lstm_cell/MatMul_1',核心问题是输入特征的维度(1000)和你手动定义的LSTM权重矩阵的输入维度(923)不匹配,导致矩阵乘法没法执行。
问题根源分析
你应该是手动构建LSTM的权重(从你提到的weight_variable函数能看出来),而不是用Keras高层API。LSTM里的门控计算需要输入特征x和权重矩阵W_xh做乘法,W_xh的形状必须是[输入特征数, 4*隐藏单元数]——这里的“输入特征数”是你每个时间步输入数据的特征维度,而错误里你的输入特征数是1000,但权重矩阵用了923,自然就冲突了。
一步步排查解决
先确认输入数据的真实维度:在把数据喂给RNN之前,加一行代码打印形状:
print("输入数据形状:", input_data.shape)你会得到类似
(batch_size, timesteps, 1000)的结果,最后一个数字就是你的输入特征数(这里是1000)。修正权重矩阵的定义:找到你用
weight_variable定义LSTM输入权重的地方,把权重的第一个维度改成输入特征数。比如如果你的LSTM隐藏单元数是500(那4*500=2000),那权重定义应该是:# 原来可能是weight_variable([923, 2000]),现在改成输入特征数1000 W_xh = weight_variable([1000, 2000])多层LSTM的维度校验:如果是多层
MultiRNNCell,要保证每一层的输入维度和前一层的输出维度一致:- 第一层的输入维度是你的输入特征数(1000)
- 第二层及以后的输入维度是前一层LSTM的隐藏单元数(比如第一层用了500,那第二层的权重输入维度就是500)
额外提醒
如果之后还遇到维度问题,记得LSTM的输入张量形状必须是[batch_size, timesteps, input_dim],别搞混了时间步和特征维度的顺序。
内容的提问来源于stack exchange,提问作者Michal Fašánek

