【问题标题】:Pytorch cifar10 images are not normalizedPytorch cifar10 图像未标准化
【发布时间】:2021-10-28 15:58:36
【问题描述】:
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
  
trainset.data[0]

我正在使用上面的代码并期望数据会被规范化。但事实并非如此,下面是结果。我需要使用 data 方法访问数据以进行更多处理。输出如下。

array([[[ 59,  62,  63],
        [ 43,  46,  45],
        [ 50,  48,  43],
        ...,
        [158, 132, 108],
        [152, 125, 102],
        [148, 124, 103]],

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    torchvision.transforms.Normalize 只是一个 shift-scale 运算符。给定参数mean"shift")和std"scale"),它会将输入映射到(input - shift) / scale

    由于您在所有三个通道上都使用了mean=0.5std=0.5,因此结果为(input - 0.5) / 0.5,如果它的统计数据实际上是mean=0.5std=0.5,这当然不是案例。

    考虑到这一点,您应该做的是提供实际数据集的统计信息。对于 CIFAR10,例如可以找到 here:

    mean = [0.4914, 0.4822, 0.4465]
    std = [0.2470, 0.2435, 0.2616]
    

    使用这些值,您将能够正确地将数据标准化为mean=0std=1

    我写了一个更笼统的长篇答案here

    【讨论】:

    • pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html ,我关注这个。我看到的是,当我使用下面的代码时,我可以看到值被标准化。 dataiter = iter(trainloader) images, labels = dataiter.next() print(images.shape, images[0]) tensor([[[0.9843, 0.9843, 0.9843, ..., 0.9843, 0.9843, 0.9843], [0.9843 , 0.9843, 0.9843, ..., 0.9843, 0.9843, 0.9843], [0.9843, 0.9843, 0.9843, ..., 0.9843, 0.9843, 0.9843],我怀疑当我使用 trainset.data[0] 时,我没有查看归一化值,但是当我加载然后获取它正在工作的值时
    • 转换管道(包括 T.Normalize 转换)由数据加载器应用(在您的示例中,更准确地说是训练数据加载器,而不是测试数据加载器),不是数据集乙>。这就是trainset.data[0] 没有被规范化的原因。
    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 2021-10-07
    • 2022-01-12
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2021-04-13
    • 2017-03-31
    相关资源
    最近更新 更多