AttributeError: ‘torch.Size‘ object has no attribute ‘numpy‘

在构建图像-关键点标签数据集时,使用PyTorch的transforms进行图像尺寸变换,导致尺寸信息无法正确转换。错误出现在尝试将torch.Size对象调用numpy()方法。解决方案是先将torch.Tensor转换为numpy数组,然后获取尺寸信息。修复此问题后,可以确保图像和关键点标签在缩放后正确同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

提示:这里是图像-关键点标签,制作数据集生成器时的一个bug

项目场景:
图像和标签数据制作数据集生成器:
数据集预处理过程中,需要改变图像的尺寸,因为标签数据是坐标群,需要和图像同步变化。这时候,有图像变化前后的比例来计算坐标变化后的结果。由于,采用的图像变换是torchvision封装的transforms中的transforms变换方法,返回的数据为torch.Tensor。返回的size为torch.Size
运行中,函数 __getitem__报错:

def __getitem__(self, idx):
    img_id = self._image_paths[idx]
    img_id = os.path.join(self.root_dir, img_id)
    image = Image.open(img_id).convert('RGB')  # (宽,高,通道数)= (w, h, c)
    imgSize = image.size  # 原始图像宽高
    landmarks = np.asfortranarray(self._labels[idx])  # (x, y, 显隐)=(宽,高,显隐性)
    category = self._categories.index(self._cates[idx])  # 0,1,2,3,4

    if self.transform_img:
        image = self.transform_img(image)  # 返回torch.Size([3, 256, 256])
    else:
        image.resize((256, 256))  # 使用resize
    afterSize = image.shape[1:].numpy()  # 缩放后图像的宽高
    print(imgSize, afterSize)
    bi = afterSize / imgSize
    landmarks[:, 0:2] = landmarks[:, 0:2] * bi

    return image, landmarks, category

报错内容:

File "E:/TanhaiyansCode/kpdem_with_pytorch/dataset/dataset_by_PIL.py", line 78, in __getitem__
    afterSize = image.shape[1:].numpy()  # 缩放后图像的宽高
AttributeError: 'torch.Size' object has no attribute 'numpy'


问题描述

提示:这里描述项目中遇到的问题:

例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP 中接收数据代码:

@Override
	public void run() {
		bytes = mmInStream.read(buffer);
		mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
	}

原因分析:

定位错误代码:

 afterSize = image.shape[1:].numpy()  # 缩放后图像的宽高

错误码:AttributeError: 'torch.Size' object has no attribute 'numpy'

image是torch.Tensor类型, image.shape返回的是torch.Size,只有torch.Tensor有numpy()方法。所以需要把.numpy()放到image后面,才能用。

解决方案:

只有torch.Tensor有numpy()方法,就先转换为numpy数组,再取size。

代码修改:

afterSize = image.numpy().shape[1:]  # 缩放后图像的宽高
在使用 PyTorch 时,若遇到 `AttributeError: 'torch.dtype' object has no attribute 'device'` 错误,通常是因为代码中尝试访问了 `dtype` 对象的 `device` 属性,而该属性并不存在。这种错误常见于旧版本的 PyTorch 中,尤其是在从较新版本迁移至旧版本(如 v1.5.1 或更早)时,某些 API 的行为或可用性可能发生变化[^2]。 ### 常见原因 1. **版本兼容性问题** 某些方法或属性在新版本中被引入,在旧版本中则不可用。例如,`torch.dtype` 类型对象在较新版本中可能支持 `.device` 属性,但在旧版本中并未实现。因此,如果代码依赖于这些特性,则需要确保使用的 PyTorch 版本支持它们[^2]。 2. **不正确的类型操作** 当试图对 `torch.dtype` 实例调用 `.device` 方法时,实际上应检查是否应该直接作用于张量本身。每个张量实例具有 `device` 属性,可用于查询其所在设备(CPU 或 GPU)。而 `dtype` 只表示数据类型,与设备无关[^4]。 3. **混合使用 NumPyPyTorch 张量** 如果在计算过程中将 `torch.Tensor` 转换为 NumPy 数组,并尝试再次利用 `np.mean()` 等函数处理包含 `torch.dtype` 的对象,则可能导致此类错误。建议改用 `torch.mean(torch.stack(...))` 来替代 `np.mean()`,以保持数据一致性[^4]。 ### 解决方案 - **升级 PyTorch 到最新稳定版** 若当前项目允许更新依赖库版本,可考虑将 PyTorch 升级至最新稳定版本。这有助于避免因 API 差异导致的问题,并享受性能优化和新功能支持。可通过以下命令完成安装: ```bash pip install --upgrade torch ``` - **检查并修改代码逻辑** 确认所有涉及 `dtype` 的地方是否真的需要访问 `device`。如果不是必要操作,应移除相关代码;如果是获取张量所在设备的需求,请改用如下方式: ```python x = torch.randn(3, 4) print(x.device) # 正确获取张量所在的设备 ``` - **转换张量为 NumPy 数组前进行预处理** 在将 `torch.Tensor` 转换为 NumPy 数组之前,建议先将其移动到 CPU 上,并显式调用 `.numpy()` 方法。这样可以避免潜在的类型冲突: ```python tensor_cpu = some_tensor.data.cpu() numpy_array = tensor_cpu.numpy() result = np.mean(numpy_array) ``` - **重构涉及聚合操作的部分** 如需对多个张量执行平均等统计操作,推荐使用 `torch.stack()` 结合 `torch.mean()` 替代 `np.mean()`,从而保证输出仍为张量形式,便于后续梯度传播或其他张量运算: ```python losses = [loss1, loss2, loss3] # 假设 loss1~3 均为 torch.Tensor 类型 mean_loss = torch.mean(torch.stack(losses)) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏常青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值