使用Einops rearrange遇维度不匹配错误,求助解决方案
问题解决步骤
1. 错误原因分析
你的输入张量是3维(torch.Size([3, 337, 225]),对应通道数C、高度H、宽度W),但你写的rearrange模式(b1 b2) h w c期望输入是4维张量,这直接导致维度不匹配错误。此外,当前图像高度337无法被2整除,后续拆分时也会触发错误。
2. 具体修正方案
步骤1:调整图像尺寸,确保可被分块参数整除
修改Resize操作,将图像调整为高度和宽度能被b1=2、b2=2整除的尺寸,比如(336, 224):
process = transforms.Compose([ transforms.Resize((336, 224)), # 336=2*168,224=2*112 transforms.ToTensor() ])
步骤2:修正Einops的rearrange模式
根据输入张量的3维格式(C, H, W),调整模式以匹配维度,同时实现2x2分块拼接的需求:
from einops import rearrange cat = Image.open('cat.jpeg').convert('RGB') cat = process(cat) # 模式解析:将Cx(b1*h)x(b2*w) 重组为 (b1*h)x(b2*w)xC result = rearrange(cat, 'c (b1 h) (b2 w) -> (b1 h) (b2 w) c', b1=2, b2=2)
3. 模式解释
- 输入模式
c (b1 h) (b2 w):对应输入张量的3个维度,其中高度H被拆分为b1(分块行数)和h(单块高度)的乘积,宽度W被拆分为b2(分块列数)和w(单块宽度)的乘积。 - 输出模式
(b1 h) (b2 w) c:将分块按行拼接成新的高度b1*h,按列拼接成新的宽度b2*w,同时将通道维度移到最后(符合PIL图像的HxWxC格式)。
内容的提问来源于stack exchange,提问作者Manu Dwivedi
相关产品推荐
相关产品推荐

