数据归一化处理transforms.Normalize()

数据归一化处理transforms.Normalize()数据归一化处理transforms.Normalize()1.图像预处理Transforms(主要讲解数据标准化)1.1理解torchvisiontransforms属于torchvision模块的方法,它是常见的图像预处理的方法在这里贴上别人整理的transforms运行机制:可以看出torchvision工具包中包含三个主要模块,主要讲解学习transformstorchvision.transforms:常用的数据预处理方法,提升泛化能力包括:数据中心化、数据标准化、缩放、裁剪、旋

大家好,又见面了,我是你们的朋友全栈君。

数据归一化处理transforms.Normalize()

1. 图像预处理Transforms(主要讲解数据标准化)

1.1 理解torchvision

transforms属于torchvision模块的方法,它是常见的图像预处理的方法
在这里贴上别人整理的transforms运行机制:
在这里插入图片描述
可以看出torchvision工具包中包含三个主要模块,主要讲解学习transforms

torchvision.transforms:常用的数据预处理方法,提升泛化能力
包括:数据中心化、数据标准化、缩放、裁剪、旋转、翻转、填充、噪声添加、灰度变换、线性变换、仿射变换、亮度、饱和度及对比度变换等

1.2 数据标准化——transforms.normalize()

功能:逐channel的对图像进行标准化(均值变为0,标准差变为1),可以加快模型的收敛
output = (input – mean) / std
mean:各通道的均值
std:各通道的标准差
inplace:是否原地操作
思考:
(1)据我所知,归一化就是要把图片3个通道中的数据整理到[-1, 1]区间。
x = (x – mean(x))/std(x)
只要输入数据集x确定了,mean(x)和std(x)也就是确定的数值了,为什么Normalize()函数还需要输入mean和std的数值呢????

(2)RGB单个通道的值是[0, 255],所以一个通道的均值应该在127附近才对。
如果Normalize()函数去计算 x = (x – mean)/std ,因为RGB是[0, 255],算出来的x就不可能落在[-1, 1]区间了。

(3)在我看的了论文代码里面是这样的:
torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
为什么就确定了这一组数值,这一组数值是怎么来的? 为什么这三个通道的均值都是小于1的值呢?
理解:
(1)针对第一个问题,mean 和 std 肯定要在normalize()之前自己先算好再传进去的,不然每次normalize()就得把所有的图片都读取一遍算这两个
(2)针对第二个问题,有两种情况
(a )如果是imagenet数据集,那么ImageNet的数据在加载的时候就已经转换成了[0, 1].
(b) 应用了torchvision.transforms.ToTensor,其作用是将数据归一化到[0,1](是将数据除以255),transforms.ToTensor()会把HWC会变成C *H *W(拓展:格式为(h,w,c),像素顺序为RGB)
(3)针对第三个问题:[0.485, 0.456, 0.406]这一组平均值是从imagenet训练集中抽样算出来的。
继续有疑问:
ToTensor 已经[0,1]为什么还要[0.485, 0.456, 0.406]?那么归一化后为什么还要接一个Normalize()呢?Normalize()是对数据按通道进行标准化,即减去均值,再除以方差
解答:
别人的解答:数据如果分布在(0,1)之间,可能实际的bias,就是神经网络的输入b会比较大,而模型初始化时b=0的,这样会导致神经网络收敛比较慢,经过Normalize后,可以加快模型的收敛速度。
因为对RGB图片而言,数据范围是[0-255]的,需要先经过ToTensor除以255归一化到[0,1]之后,再通过Normalize计算过后,将数据归一化到[-1,1]。
是否可以这样理解:
[0,1]只是范围改变了, 并没有改变分布,mean和std处理后可以让数据正态分布?
参考:
pytorch torchvision.transforms.Normalize()中的mean和std参数—解惑
pytorch的transform中ToTensor接着Normalize
另外这篇包含数据增强部分:
Pytorch框架学习(6)——transforms与normalize
拓展:
数据增强又称为数据增广,数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152318.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql官网下载详细教程图文

    mysql官网下载详细教程图文2019年的mysql官网下载教程■打开地址https://www.mysql.com/downloads/点击打开■进入首页点击MySQLCommunity(GPL)Downloads»■再点击MySQLCommunityServer这里选择的是linux版本。如果是Windows或者其他版本请另请选择即可■点击下载后…

    2022年5月1日
    55
  • 开发工具-Java SDK下载地址「建议收藏」

    开发工具-Java SDK下载地址「建议收藏」更新记录2022年6月14日加入更多的下载地址。2022年6月10日完善标题。下载地址:https://www.oracle.com/java/technologies/downloads/https://docs.microsoft.com/en-us/java/openjdk/downloadhttps://jdk.java.net/archive/…

    2022年10月20日
    2
  • 深入理解Java中的容器

    深入理解Java中的容器1 容器的概念在 Java 当中 如果有一个类专门用来存放其它类的对象 这个类就叫做容器 或者就叫做集合 集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体 2 容器与数组的关系之所以需要容器 1 数组的长度难以扩充 2 数组中数据的类型必须相同容器与数组的区别与联系 1 容器不是数组 不能通过下标的方式访问容器中的元素 2 数组的所有功能通过 Arraylist 容器

    2025年10月12日
    2
  • windows环境下pycharm配置conda虚拟环境,解决无法发现conda虚拟环境问题「建议收藏」

    windows环境下pycharm配置conda虚拟环境,解决无法发现conda虚拟环境问题「建议收藏」环境:windows10anaconda4.7pycharmcommunity2019.3问题:打开pycharm,在projectinterpreter=>Add…,打开下图,无法自动显示conda环境解决方法:在Interpreter后直接定位conda虚拟环境所在位置,windows下在路径c:\用户\.conda\envs中,…

    2022年8月27日
    4
  • Oracle没有WM_CONCAT函数的解决办法

    Oracle没有WM_CONCAT函数的解决办法解决ORA-00904:”WMSYS”.”WM_CONCAT”WM_CONCAT是oracle的非公开函数,并不鼓励使用,新版本oracle并没有带此函数,需要手工加上。1、下载根据下方链接下载三个文件:owmctab.plb、owmaggrs.plb、owmaggrb.plbhttps://download.csdn.net/download/qq_39997939/741429102、执行用sqlplus登录,执行下载的脚本sqlplus/assysdba

    2022年6月14日
    91
  • c++ 静态函数_c语言if结构格式

    c++ 静态函数_c语言if结构格式1、对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员或静态方法2、只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变量.(因为静态成员变量在对象创建之前就已经被分配了内存空间)3、静态成员变量虽然在类中,但它并不是随对象的建立而分配空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放…

    2025年6月6日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号