transforms.Compose,transforms.ToTensor(),transforms.Normalize()的含义与原理

1.问题描述

  • 问题来源于pytorch实现CNN神经网络的示例代码读取数据的部分:
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

作用主要是读取CIFAR10数据集时,归一化操作,它的含义是将图像值都转换到[-1,1]之间,但其中细节并不清楚。以下通过源码解读,简述三个函数的作用及转换原理。

2.transforms.Compose

Composes several transforms together. This transform does not support torchscript.
将几个变换组合在一起。这个转换不支持torchscript。

  • 即组合几个变换方法,按顺序变换相应数据。
  • 其中torchscript为脚本模块,用于封装脚本跨平台使用,若需要支持此情况,需要使用torch.nn.Sequential,而不是compose
  • 对应于问题描述中代码,即先应用ToTensor()使[0-255]变换为[0-1],再应用Normalize自定义标准化

3.transforms.ToTensor()

Convert a PIL Image or numpy.ndarray to tensor
转换一个PIL库的图片或者numpy的数组为tensor张量类型;转换从[0,255]->[0,1]

  • 实现原理,即针对不同类型进行处理,原理即各值除以255,最后通过torch.from_numpyPIL Image or numpy.ndarray针对具体数值类型比如Int32,int16,float等转成torch.tensor数据类型
  • 需要注意的是,源码中有一小段内容:
    if isinstance(pic, np.ndarray):# handle numpy arrayif pic.ndim == 2:pic = pic[:, :, None]img = torch.from_numpy(pic.transpose((2, 0, 1))).contiguous()# backward compatibilityif isinstance(img, torch.ByteTensor):return img.float().div(255)else:return img

我们可以看到在转换过程中有一个轴的转置操作pic.transpose((2, 0, 1))contiguous() 函数

  • pic.transpose((2, 0, 1))将第三维轴换到第一个位置,这样做的原因主要是因为PIEimage与torch和numpy数据类型多维参数位置的区别,以下表说明
参数 含义
torch:(x,y,z) x个y*z
PIEimage:(x,y,z) z个x*y

即三维表示的结构顺序有区别,导致numpy与torch多维转换时需要转置

4.transforms.Normalize()

Normalize a tensor image with mean and standard deviation
通过平均值和标准差来标准化一个tensor图像,公式为:
output[channel] = (input[channel] - mean[channel]) / std[channel]

transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))解释:

  • 第一个(0.5,0.5,0.5) 即三个通道的平均值
  • 第二个(0.5,0.5,0.5) 即三个通道的标准差值

由于ToTensor()已经将图像变为[0,1],我们使其变为[-1,1],以第一个通道为例,将最大与最小值代入公式

  • (0-0.5)/0.5=-1
  • (1-0.5)/0.5=1
  • 其他数值同理操作,即映射到[-1,1]

transforms.Compose,transforms.ToTensor(),transforms.Normalize()的含义与原理相关推荐

  1. transforms.Compose和transforms.ToTensor()

    1.图像处理.转不同格式显示 import torch import torchvision import torchvision.transforms as transforms import cv ...

  2. pytorch的图像通道变换,torchvision.transforms.Compose,T.ToTensor

    torchvision.transforms.ToTensor 显示的二值化图片如图所示, 将numpy的图片shape是hwc(高,宽,通道)格式的图片矩阵转换为chw格式的torch.tensor ...

  3. Pytorch下transforms.ToTensor(),transforms.Normalize()详解,及代码实现和复原

    一.在数据处理时,我们要经常用到transforms.ToTensor(),transforms.Normalize()语句,将图像数据转换为tensor并标准化到[-1,1]之间. 其计算过程为: ...

  4. torchvision 笔记:transforms.Compose()

    torchvision.transforms.Compose()类的主要作用是串联多个transforms列表里面的transform操作 比如,在torchvision 笔记:transforms. ...

  5. transforms.Compose()函数

    torchvision.transforms是pytorch中的图像预处理包.一般用Compose把多个步骤整合到一起: 比如说: transforms.Compose([transforms.Cen ...

  6. Pytorch中transforms.Compose()的使用

    torchvision介绍 torchvision是pytorch的一个图形库,它服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型.torchvision.transforms主要是用于 ...

  7. 使用transforms.Compose套件做图像数据变换

    首先需要安装依赖pip install -i https://mirrors.aliyun.com/pypi/simple/ torchvision 然后使用如下代码: from PIL import ...

  8. Transform的normalize参数含义

    注:在此之前transforms.ToTensor()已经把数据落在0.1区间了 比如原来的tensor是三个维度的,值在0到1之间,那么经过以下变换之后就到了-1到1区间. transforms.N ...

  9. 数据处理中ToTensor紧接着Normalize

    transform = transforms.Compose([ transforms.ToTensor(),transforms.Normalize(mean=(0.5, 0.5, 0.5), st ...

最新文章

  1. CentOS 7磁盘格式化
  2. win7电脑蓝牙 耳机
  3. 算法--------字母异位词分组 (Java 版本)
  4. Yarn将用TypeScript重写,Flow惨遭亲爹抛弃!
  5. Bootstrap系列 -- 17. 复选框checkbox和单选择按钮radio
  6. UI基础控件创建(UILabel、UITextField、UIButton)
  7. 直接让web服务运行在80端不行吗,为什么要用nginx反向代理?
  8. 今天开博第一篇,呵呵
  9. DirectInfo.GetFiles 排序
  10. 计算机专业课如何阅卷,全国计算机等级考试评卷老师是如何阅卷的?
  11. 【Zookeeper】源码分析之Watcher机制(一)
  12. itext设置字体间距_汉语拼音的字体到底选哪个?你是不是一直很困扰?来看总结方法...
  13. 遗传算法之TSP问题
  14. 介绍7个适合普通大学生参加的编程比赛/考试(注:有的比赛如蓝桥杯有多种赛别,本文仅介绍其中的程序设计/编程比赛)
  15. matlab中文本框的边框旋转,ParaView Clip/Slice,Box参数:位置,旋转,缩放的含义;在Matlab中重建框...
  16. 2022年下半年网络工程师上午真题及答案解析
  17. Spring07 Java配置
  18. 网页制作用html和sc,实验二:html的基本标签和javasc
  19. css 各种高度和宽度
  20. Parasol and GreenSwitch: Managing Datacenters Powered by Renewable Energy

热门文章

  1. 2017年全国大学生电子设计竞赛 单相用电器分析监测装置(k题)
  2. 汉堡大学计算机科学,汉堡大学 - 录取条件,专业,排名,学费「环俄留学」
  3. 做短视频的经历——成长与心酸
  4. 怎样更改软件默认安装路径由C盘到其他盘
  5. 解决JPEGImageEncoder生成的图片全黑的问题
  6. 高性能服务器dyna软件重启动,LSDYNA 中的完全重启动是什么功能,实际使用过程中,如何实现完全重启动...
  7. 小程序 朋友圈,点赞 ,评论,发布动态,功能,上传图片 -----发布动态
  8. MYSQL 基础篇 | 02-MYSQL基础应用
  9. CLIP Passo:Semantically-Aware Object Sketching图像生成简笔画
  10. Hypergraph Neural Networks HGNN