赞
踩
以MNIST数据集为例子,由于该数据集是1channel的,所以以下代码可能不具有泛用性,但是核心部分是一致的
方法1:
stackoverflow上有以下代码:
- from torchvision.datasets import MNIST
- import torchvision.transforms as transforms
-
- trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True)
- print('Min Pixel Value: {} \nMax Pixel Value: {}'.format(trainset.data.min(), trainset.data.max()))
- print('Mean Pixel Value {} \nPixel Values Std: {}'.format(trainset.data.float().mean(), trainset.data.float().std()))
- print('Scaled Mean Pixel Value {} \nScaled Pixel Values Std: {}'.format(trainset.data.float().mean() / 255, trainset.data.float().std() / 255))
输出(注意,由于数据没有经过 torchvision.transforms.ToTensor()进行变换,所以仍然是[0,255]范围):
- Min Pixel Value: 0
- Max Pixel Value: 255
- Mean Pixel Value 33.31002426147461
- Pixel Values Std: 78.56748962402344
- Scaled Mean: 0.13062754273414612
- Scaled Std: 0.30810779333114624
方法2:
利用如下公式:
- dataset_img_width = train_dataset.data.shape[2]
- dataset_img_height = train_dataset.data.shape[1]
- # 像素点总数,相当于总样本数
- total_pixels_count = train_dataset.__len__() * dataset_img_height * dataset_img_width
-
- pixels_sum = 0.0
- pixels_sum_sq = 0.0
- for data, targets in train_loader:
- # 像素点值的和,一个像素点就是一个样本
- pixels_sum += data.sum(axis=[0, 2, 3])
- # 像素点值的平方和
- pixels_sum_sq += data.square().sum(axis=[0, 2, 3])
-
- total_mean = pixels_sum / total_pixels_count
- std = torch.sqrt(pixels_sum_sq/total_pixels_count-total_mean.square())
- print(std)
有误差的方法3:算每个batch(批次)的标准差,再除以批次数,这个肯定会有误差,但没有实际验证过误差到底有多大。
了解以下
从局部方差和均值计算整体方差:
手写推导,留给自己看的,你们就别看了:
博客或者描述或者代码有错误欢迎指正
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。