UNet调用TF.resize报TypeError:传入torch.Tensor而非要求的PIL图像
问题描述
- 基于PyTorch搭建的UNet代码包含DoubleConv基础卷积模块、下采样特征提取路径、带跳跃连接的上采样恢复路径、瓶颈连接层
- 测试逻辑为生成维度(3, 1, 161, 161)的随机张量作为网络输入,校验输出张量形状与输入是否一致
- 运行代码时抛出类型错误,错误定位在上采样阶段对齐特征尺寸的代码行:
x = TF.resize(x, size=skip_connection.shape[2:]
完整报错信息:
raise TypeError('img should be PIL Image. Got {}'.format(type(img))) TypeError: img should be PIL Image. Got <class 'torch.Tensor'>
根因定位
- 此处导入的
TF为torchvision.transforms.functional模块,旧版本下该模块的resize接口仅支持PIL Image类型输入,内置了严格的输入类型校验 - UNet前向传播过程中传入
TF.resize的参数x是卷积、下采样输出的Tensor特征图,并非PIL格式图像,因此触发类型校验失败
修复方案
- 优先使用PyTorch原生的Tensor适配尺寸变换接口替换现有代码,无额外依赖:
# 导入torch.nn.functional后,替换原resize行 x = torch.nn.functional.interpolate(x, size=skip_connection.shape[2:], mode='bilinear', align_corners=False) - 若需保留使用
TF.resize的逻辑,可将torchvision升级至0.10及以上版本,该版本的TF.resize已支持Tensor类型输入,需注意匹配对应PyTorch版本避免兼容问题
内容的提问来源于stack exchange,提问作者smriti
相关产品推荐
相关产品推荐

