数据归一化处理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
拓展:
数据增强又称为数据增广,数据扩增,它是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • BS和CS对比_CS与BS对接

    BS和CS对比_CS与BS对接BS和CS对比牛腩新闻发布系统已经开始了不短的时间了,CS的项目也算是接触了下,接下来对比下CS和BS       CS和BS是什么?       C/S结构即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销(客户端和服务器端的通信),可以充分利用两端硬件环境的优势。B/S结

    2022年10月16日
  • 基于Docker的Kafka集群搭建

    基于Docker的Kafka集群搭建1.pulldocker,在机器上下载最新版本的kafka和zookeeper镜像,这里使用的是wurstmeister的镜像dockerpullwurstmeister/kafkadockerpullwurstmeister/zookeeper2.装好的docker镜像3.启动zk容器Dockerrun–d–namezookeeper–p2181:…

  • 一张图讲解对象锁和关键字synchronized修饰方法(代码块)

    每个对象在出生的时候就有一把钥匙(监视器Monitor),那么被synchronized 修饰的方法相当于给方法加了一个锁,这个方法就可以进行同步,在多线程的时候,不会出现线程安全问题。注:Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个 Monitor。

  • origin做多个图_origin几个图合并

    origin做多个图_origin几个图合并9.0rigin画图软件版本:9.0写论文画图阶段有时候会遇到需要把多个子图(layer)画到同一张画布(graph)上。百度了一下,大部分介绍都是使用merge(mergeallopengraphwindowsingraph*),这个按键在origin9.0版本的右边栏。如果是多个2D子图,这种方式是可以实现多个子图融合。但如果是多个3D的子图,再点击merge后,会…

  • 浅谈当前的手机开发技术[通俗易懂]

    浅谈当前的手机开发技术[通俗易懂]随便聊聊现在的各种手机软件开发技术

  • 另一个视角解读计算机编码-补码编码

    另一个视角解读计算机编码-补码编码

发表回复

您的电子邮箱地址不会被公开。

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