前言

该函数是对图片进行均一化处理的
有3个输入函数
分别是mean, std, inplace
mean是每个channel的平均值序列
std是每个channel的标准差序列
inplace是指是否改变原有的变量

官方Api介绍

_Normalize a tensor image with mean and standard deviation.
This transform does not support PIL Image.
Given mean: (mean[1],...,mean[n]) and std: (std[1],..,std[n]) for n
channels, this transform will normalize each channel of the input
torch.*Tensor i.e.,
output[channel] = (input[channel] - mean[channel]) / std[channel]

.. note::
This transform acts out of place, i.e., it does not mutate the input tensor.

Args:
mean (sequence): Sequence of means for each channel.
std (sequence): Sequence of standard deviations for each channel.
inplace(bool,optional): Bool to make this operation in-place._

需准备的东西

演示代码

  1. # 导入库
  2. import torchvision.transforms as transforms
  3. import torchvision as tv
  4. import matplotlib.pyplot as plt
  5. import matplotlib
  6. import numpy as np
  7. # 设置字体 这两行需要手动设置
  8. matplotlib.rcParams['font.sans-serif'] = ['SimHei']
  9. matplotlib.rcParams['axes.unicode_minus'] = False
  10. transform = transforms.Compose([
  11. transforms.ToTensor(),
  12. transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5), inplace=False)
  13. ])
  14. # 读取图片
  15. picTensor = tv.io.read_image('testpic.png')
  16. print(type(picTensor))
  17. # 转换图片
  18. picTransformed = transform(picTensor.permute(1, 2, 0).numpy())
  19. print(picTransformed.dtype)
  20. print(picTransformed)
  21. # 显示
  22. print('图像处理之前的图片大小:', picTensor.shape)
  23. print('图像处理之后的图片大小:', picTransformed.shape)
  24. picNumpy = picTensor.permute(1, 2, 0).numpy()
  25. plt.imshow(picNumpy)
  26. plt.title('图像处理之前的图片')
  27. plt.show()
  28. picNumpy = picTransformed.permute(1, 2, 0).numpy()
  29. plt.imshow(picNumpy)
  30. plt.title('图像处理之后的图片')
  31. plt.show()

总结

transforms.Normalize()经常和transforms.ToTensor()配合使用
那transform.Normalize()是怎么工作的呢?以上面代码为例,ToTensor()能够把灰度范围从0-255变换到0-1之间,而后面的transform.Normalize()则把0-1变换到(-1,1).具体地说,对每个通道而言,Normalize执行以下操作:

image=(image-mean)/std

其中mean和std分别通过(0.5,0.5,0.5)和(0.5,0.5,0.5)进行指定。原来的0-1最小值0则变成(0-0.5)/0.5=-1,而最大值1则变成(1-0.5)/0.5=1.