如何将张量填充至指定高度?MediaPipe动作识别代码原理咨询
理解PyTorch F.pad处理动作识别张量帧统一的逻辑
我用MediaPipe关键点做动作识别,部分张量形状如下:
torch.Size([3, 3, 75]) torch.Size([3, 6, 75]) torch.Size([3, 10, 75])
torch.Size([3, 11, 75]) torch.Size([3, 9, 75]) torch.Size([3, 4, 75])
torch.Size([3, 21, 75])
每个张量的第二维度(height)对应样本帧数,不同样本的帧数存在差异。我想把所有样本统一为8帧,清楚帧数不足8需要填充、超过8需要截断,但我写的代码不管height小于还是大于8都执行填充操作,而且实际运行有效,想搞懂这段代码的工作原理:
if height < 8: source_pad = F.pad(tensor1, pad=(0, 0, 0, 8 - height)) else: source_pad = F.pad(tensor1, pad=(0,0, 0, 8 - height))
代码工作原理拆解
PyTorch F.pad的参数规则
对于3维张量,pad=(a,b,c,d,e,f)的填充/截断逻辑是从后往前对应维度:- 最后一维(你的张量里是75维的关键点特征):前填充a个、后填充b个
- 中间维度(你的张量里是帧数维度):前填充c个、后填充d个
- 第一维度:前填充e个、后填充f个
你的代码参数分析
你写的pad=(0,0,0,8-height),对应到3维张量的处理:- 最后一维:前后都填0,等于完全不处理
- 中间帧数维度:前面填0,后面填
8-height个元素
两种场景的实际效果
- 当
height < 8时:8-height是正数,会在帧数维度的末尾填充对应数量的默认值(通常是0),把帧数补到8,完成填充需求。 - 当
height > 8时:8-height是负数,此时F.pad会把负数识别为截断指令——对帧数维度的末尾截断height-8个元素,最终只保留前8帧,刚好实现截断需求。
- 当
冗余的if-else分支
你代码里的if和else分支执行的是完全一样的逻辑,所以这个判断完全多余,直接写source_pad = F.pad(tensor1, pad=(0,0,0,8-height))就能同时处理填充和截断两种情况。
内容的提问来源于stack exchange,提问作者peony
相关产品推荐
相关产品推荐

