基于Mediapipe的LSTM手部动作训练报错求助:尺寸不匹配与属性错误
解决LSTM手势识别训练中的两个错误
第一个错误:Reshape尺寸不匹配
问题原因
输入张量实际总元素数(4032)与指定的目标形状(163263=32256)不匹配。即便你将batch_size改为2后数值匹配,但硬编码batch_size的做法缺乏灵活性,后续若输入batch_size变化(如验证集batch不同)仍会出问题。
解决方法
将硬编码的self.batch_size改为动态获取当前输入的batch_size:
# 原代码 x = x.reshape(self.batch_size, self.seq_len, CFG.num_feats * 21) # 修改后代码 x = x.reshape(x.size(0), self.seq_len, CFG.num_feats * 21)
x.size(0)会自动读取输入张量的第一维(即当前batch_size),无论输入batch是多少都能完成正确reshape。
第二个错误:torchsummary的AttributeError
问题原因
torchsummary在解析模型结构时,会调用模型的forward方法并检查返回值。如果你的LSTM模型forward方法返回的是元组(tuple)(比如同时返回输出和隐藏层状态),torchsummary会尝试调用返回值的.size()方法,而元组没有该属性,因此触发报错。
解决方法
方法1:临时修改模型forward方法(仅用于查看结构)
如果你的模型forward方法是类似这样的:
def forward(self, x): # 中间计算逻辑 return output, hidden_state
可以临时改为只返回输出张量:
def forward(self, x): # 中间计算逻辑 return output
查看完模型结构后,再恢复原返回逻辑即可。
方法2:用Lambda包装模型(无需修改原模型)
在调用torchsummary的位置,用lambda将模型包装为仅返回输出的版本:
from torchsummary import summary # 假设你的模型实例为model wrapped_model = lambda x: model(x)[0] summary(wrapped_model, input_size=(CFG.seq_len, 21, CFG.num_feats))
model(x)[0]取返回元组的第一个元素(即输出张量),让torchsummary能正常处理。
方法3:确认输入尺寸匹配
确保传入summary的input_size与实际输入尺寸(除batch_size外)一致。你的输入是[2,32,21,3],所以input_size应设为(32,21,3),对应(seq_len, num_keypoints, num_feats)。
内容的提问来源于stack exchange,提问作者Quynh Ly
相关产品推荐
相关产品推荐

