torchvison源码剖析【1】transform.ToTensor()

PIL转tensor:

def pil2tensor():
    img=Image.open(img_path)
    totensor=torchvision.transforms.ToTensor()
    #torchvision.transforms.ToTensor()函数自动转格式
    img=totensor(img)
    img=img.cpu()
    print(img.size())# torch.Size([3, 300, 533])
    print(img.dtype)# torch.float32
    print(type(img))# <class 'torch.Tensor'>
pil2tensor()

源码:

class ToTensor(object):
    """Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor.

    Converts a PIL Image or numpy.ndarray (H x W x C) in the range
    [0, 255] to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0].
    """

    def __call__(self, pic):
        """
        Args:
            pic (PIL Image or numpy.ndarray): Image to be converted to tensor.

        Returns:
            Tensor: Converted image.
        """
       
若`transforms.ToTensor()`未将数据转化为`tensor`,可以参考以下解决办法: - **检查数据格式**:`transforms.ToTensor()`要求输入为`PIL`图像或`numpy`数组格式。若加载的数据集类型不满足其输入格式要求,可先将数据集转化为`np.array`,再应用`transforms.ToTensor()`进行转化和归一化到`[0,1]`。示例代码如下: ```python import torchvision import torchvision.transforms as transforms from torchvision import datasets import numpy as np data_dir = './data' train_dataset = datasets.MNIST(data_dir, train=True, download=True, transform=None) train_dataset = transforms.ToTensor()(np.array(train_dataset.data)) train_dataset = transforms.Normalize([0.1307, ], [0.3081, ])(train_dataset) ``` 此代码先将`MNIST`数据集的数据部分转换为`np.array`,再用`transforms.ToTensor()`将其转换为`tensor`,最后进行归一化处理[^1]。 - **检查数据范围**:`transforms.ToTensor()`会把`[0, 255]`范围的数据转换到`[0, 1]`,若数据不在此范围,可能影响转换。确保数据范围正确,若数据已在`[0, 1]`范围,可跳过`transforms.ToTensor()`的缩放操作。 - **检查代码逻辑**:检查代码中是否存在其他操作影响`transforms.ToTensor()`的执行,如数据被意外修改或截断等。确保`transforms.ToTensor()`按正确顺序应用于数据。例如,使用`transforms.Compose()`组合多个转换操作时,要保证`transforms.ToTensor()`在合适位置: ```python import torchvision.transforms as transforms transform = transforms.Compose([ # 其他转换操作 transforms.ToTensor(), # 后续转换操作 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) ``` 此代码使用`transforms.Compose()`组合了多个转换操作,`transforms.ToTensor()`按正确顺序对数据进行转换[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值