是的,你没有看错,笔者在费劲敲c语言算法的时候也小小学了一点深度学习。(笑)

标题或许起得狂了一点,但乱象却一点不夸张。在标准化与归一化的统一和翻译方面,CSDN上的文章真是帮了我不少倒忙...忙了一下午,翻阅了很多资料,现在把笔者认为对于标准化与归一化(即所谓的Standardization与Normalization)的最权威解释分享出来。如有遗漏与错误请各位大佬随时指正。

感谢https://en.wikipedia.org/wiki/Feature_scaling、标准化和归一化什么区别? - 知乎与pytorch个人学习笔记(2)—Normalize()参数详解及用法_pytorch normalize-CSDN博客对本文的大力支持。

进入正题。

引入(学过深度学习的大佬可以跳过)

相信各位炼丹人在漫漫学习路上,一定听说过小土堆与李沐的Pytorch课程(顺带提一句,小土堆的课没有字幕,看得我那叫一个难受...)。今日笔者在听小土堆时,在常见的Transforms一节看到了Normalize的用法,但是土堆先生讲得我一头雾水(什么是Normalize?它干嘛的?为什么std和mean要设成0.5?弹幕里说什么归一化和标准化,这到底是什么?)笔者深度学习还没有学完,网上的解释也是各执一词。一怒之下我决定翻阅最最最权威的维基百科,直到刚才才有了那么一点点头绪。现在,笔者尽量以最严谨的方式(包括用词、公式、翻译不统一之处使用英文原文等等),试图解释这个问题。

首先从源头讲起。让我们把脑海中的所谓 标准化 、 归一化 这些中文翻译抛到九霄云外,

之所以中文里有“标准化”、“归一化”混用和很多人搞不清区别,是因为目前中文翻译对几种 Normalization 的翻译是有些歧义,尤其是部分博客文章完全混用。

通常来说,它们都是指特征工程中的特征缩放过程,由于中文翻译的原因,网上对它们的解释也是五花八门,但其实我们不考虑它们的名字,直接看它们的作用和操作方法,可能会更容易理解。

强烈建议直接用 Normalization 来区分和理解,不用中文翻译了,这样可以省很多理解时间。

1.Feature scaling

先看维基原文。

Feature scaling is a method used to normalize the range of independent variables or features of data. In data processing, it is also known as data normalization and is generally performed during the data preprocessing step.

即特征缩放,特征缩放是用来统一资料中的自变项或特征范围的方法,在资料处理中,通常会被使用在资料前处理这个步骤。(简介中,维基官方翻译巧妙地避开了对normalization的解释)。

Normalization 操作被用于对数据属性进行缩放,使其落在较小的范围之内(即变化到某个固定区间中),比如 [-1,1] 和 [0, 1],简单理解就是特征缩放过程。但是为什么要缩放?这里图片更为清晰直观一些:

看到了没?使用feature scaling时,梯度下降的收敛速度比不使用特征缩放时要快得多。

而feature scaling一共有四种方法:Rescaling (min-max normalization)、Mean normalization、Standardization (Z-score Normalization)与Scaling to unit length。

至于其余的公式、叫法、翻译、解释,本文一概不涉及。

先看公式。

用处:重新缩放特征范围,将范围缩放到[a, b] 之间。

rescaling(直译为重缩放)为什么又叫min-max normalization呢?很简单,该缩放是通过引入最小、最大值(min x,max x)实现缩放。例如,假设我们有学生的体重资料,范围落在[160磅, 200磅],为了重新缩放这个资料,我们会先将每个学生的体重减掉160,接着除与40(最大体重与最小体重的差值)

[0,1] 的最小-最大值的一般公式为

该式使用频率最多。

Mean normalization

公式:

个人认为其与min-max normalization的区别就是将min x换为均值,从而使其在x轴上有均匀的正负分布。

Standardization (Z-score Normalization)

 

sigma为标准差

把每个特征值中的所有数据,变成平均值为0,标准差为1的数据,这有点像正态分布(注意,并不是正态分布,与正态分布是否相像只取决于原始数据),见下图。

该式也为经常使用的公式。

Scaling to unit length

公式:

该公式笔者认为,包括所谓的MaxAbsScaler(原始数据除以数据最大绝对值)以及Normalizer(将每个样本的特征向量调整到单位范数(即长度为1))。它的作用就是将原始数据简单粗暴地除以某值,以求达到缩放到[0,1]中的目的。

Normalize的用法及原理?

现在我们熟悉了feature scaling的四个公式,回头转向最初的问题。

什么是normalize?我们依旧不做翻译,只能说它是一种对张量作计算的方法,将某张图片转化为normalization形式。

那么它的计算过程是什么?

贴出源码:

引入png格式图片

img_path = "dataset/0000.png"

img = Image.open(img_path)

# 将png格式转化为totensor格式

writer = SummaryWriter("logs")

trans_to_tensor = transforms.ToTensor()

tensor_img = trans_to_tensor(img)

# 进行normalize计算

trans_to_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) # 前一个为均值,后一个为标准差

img_norm = trans_to_norm(tensor_img)

第一步不必多说,我们从第二步看起。

很多人都说Normalize是按照

x = (x - mean) / std

得来的,实则大错特错。这个用法实际上并不是这个函数的本意,只是借用了(x-mean)/std这个公式。

1.ToTensor在将图片转换为Tensor格式时,使用了feature scaling中的公式Scaling to unit length(所谓的MaxAbsScaler),即out = in/255,将原tensor缩放为[0,1]之间。

2.之后使用区间化公式Rescaling (min-max normalization),a,b分别取-1,1,将缩放为[0,1]区间的图像再次缩放为[1,-1]区间。

3.将a = -1,b = 1带入公式

刚好为mean = 0.5,std = 0.5 ,刚好为此形式,所以笔者并不认为是x = (x - mean) / std,只是形式恰好为此而已。

精彩文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。