PyTorch张量维度变化触发ToPILImage类型报错原因咨询
问题描述
测试transforms.Resize实现原理时遇到异常,初始运行代码如下:
import numpy as np import torch from torchvision import transforms tim = np.array([[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]) # 形状为(2, 3, 3) tim = torch.from_numpy(tim) tf = transforms.Compose([ transforms.ToPILImage(), transforms.Resize((6, 6)), # 参数为目标尺寸(高, 宽) transforms.ToTensor() ]) mask = tf(tim) squ = mask.squeeze()
运行后触发如下报错:
Traceback (most recent call last): File "C:/Users/Tim/Desktop/U-Net/test.py", line 62, in <module> mask = tf(tim) File "C:\Users\Tim\.conda\envs\Segment\lib\site-packages\torchvision\transforms\transforms.py", line 95, in __call__ img = t(img) File "C:\Users\Tim\.conda\envs\Segment\lib\site-packages\torchvision\transforms\transforms.py", line 227, in __call__ return F.to_pil_image(pic, self.mode) File "C:\Users\Tim\.conda\envs\Segment\lib\site-packages\torchvision\transforms\functional.py", line 315, in to_pil_image raise TypeError(f"Input type {npimg.dtype} is not supported") TypeError: Input type int32 is not supported
将输入张量修改为如下形状后,代码可以正常运行:
tim = np.array([[[1, 2, 3], [1, 2, 3], [1, 2, 3]]]) # 形状为(1, 3, 3)
核心疑惑:报错提示为输入数据类型不支持,看似和张量尺寸无关,为什么修改维度后问题消失?
问题成因
这个报错是输入形状不符合ToPILImage接口约定导致的连锁反应,最终错误提示落在类型检查环节,才会产生“和尺寸无关”的误导,具体逻辑如下:
transforms.ToPILImage对3维输入的形状有明确要求:必须为(通道数C, 高H, 宽W)的CHW格式,且通道数C仅支持1(灰度图)、3(RGB图)、4(RGBA图)三个取值。- 当输入形状为
(2, 3, 3)时,通道数C=2不属于合法取值,接口不会将其识别为合法的CHW格式图像,因此不会执行后续的维度转置、类型自动转换(将numpy默认的int32类型转换为PIL支持的uint8类型)逻辑,直接把原始int32数组传入PIL的图像构造方法。而PIL原生不支持直接读取int32类型的数组构造图像,因此抛出类型不支持的报错。 - 当输入形状修改为
(1, 3, 3)时,通道数C=1属于合法取值,接口正常识别为单通道灰度图,自动完成类型适配(int32转uint8)、维度调整的逻辑,因此不会触发报错。
补充说明:如果手动将(2,3,3)形状的张量先转换为uint8类型,再传入ToPILImage,会继续抛出维度/形状不匹配的错误——只是因为原输入是int32类型,代码在类型检查环节就提前终止,没走到形状校验的步骤而已。
避坑建议
- 老版本torchvision的transforms算子大多基于PIL实现,输入必须符合PIL图像的格式要求,PIL本身不支持2通道图像,因此不要直接传入通道数为2的张量走
ToPILImage链路。 - 若需要处理非1/3/4通道的张量(比如双通道掩码、光流数据),可以直接使用新版torchvision支持张量输入的Resize算子,不需要转PIL格式;也可以将各通道拆分后单独做Resize,再拼接回原格式。
- 调用
ToPILImage前最好手动将数据类型转为uint8(数值范围0-255)或float32(数值范围0-1),避免隐式类型转换带来的异常。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

