Model_concept
Last updated
Last updated
举个例子
:将10kg的面粉使用面条加工机(每次只能处理2kg),加工成10kg的面条。首先得把10kg面粉分成5份2kg的面粉,然后放入机器加工,经过5次,可以将这10kg面粉首次加工成面条,但是现在的面条肯定不好吃,因为不劲道,于是把10kg面条又放进机器再加工一遍,还是每次只处理2kg,处理5次,现在感觉还行,但是不够完美;于是又重复了一遍:将10kg上次加工好的面条又放进机器,每次2kg,加工5次,最终成型了,完美了,结束了。那么到底重复加工几次呢?只有有经验的师傅才知道。这就形象地说明:Epoch就是10斤面粉被加工的次数(上面的3次);Batch Size就是每份的数量(上面的2kg),Iteration就是将10kg面粉加工完一次所使用的循环次数(上面的5次)。显然
1个epoch = BatchSize * Iteration
EPOCH:官方文档中给出的解释是:“简单说,epochs指的就是训练过程接中数据将被“轮”多少次”
(1)释义:训练过程中当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个epoch,网络会在每个epoch结束时报告关于模型学习进度的调试信息
(2)为什么要训练多个epoch,即数据要被“轮”多次?
在神经网络中传递完整的数据集一次是不够的,对于有限的数据集(是在批梯度下降情况下),使用一个迭代过程,更新权重一次或者说使用一个epoch是不够的,需要将完整的数据集在同样的神经网络中传递多次,随着epoch次数增加,神经网络中的权重的更新次数也增加,模型从欠拟合变得过拟合
batch
(1)keras官方文档中给出的解释:深度学习的优化算法,说白了就是梯度下降。
每次的参数更新有两种方式:
第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这种称为Batch gradient descent,批梯度下降
另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降,stochastic gradient descent.这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点,两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。
为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent,小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。
(2)batch_size:
Keras中参数更新是按批进行的,就是小批梯度下降算法,把数据分为若干组,称为batch,按批更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,一批数据中包含的样本数量称为batch_size
iteration
将数据分为几个batch而不是一次性通过神经网络时,iteration是batch需要完成一个epoch的次数,也就是number of batches (区别于 batch size) , 在一次epoch中 number of batches = iteration = 训练样本总数 / batch size
比如,对于一个有2000个训练样本的数据集,将2000个样本分成大小为500的batch,那么完成一个epoch需要4个iteration
(1)训练网络过程中,一个batch中的样本规模大小,即batch size 和epoch个数一起通过影响更新权重的频率定义了网络学习数据的速度。
对于固定的epoch:
(a)在合理范围内,随着batch size增大,跑完一次epoch所需的迭代数减少,对于相同数据量的处理速度进一步加快,确定的下降方向越准,引起的训练震荡越小。
(b)batch size 过大时,跑完一次epoch所需的迭代数减少,想要达到相同的精度,所花费的时间大大增加了,从而对参数的修正也变得缓慢,batch size增大到一定程度,其确定的下降方向已经基本不再变化
对于固定的batch size:
(a)在合理范围内随着epoch的增加,训练集和测试集的误差呈下降趋势,模型的训练有了效果
(b)随着epoch的继续增加,训练集的误差呈下降而测试集的误差呈上升趋势,模型过拟合训练集对测试集性能不好
(2)实验实验,通过实验+经验选取合适的batch size 和 epoch
网络的权重参数W在每一个batch size都会进行一次更新,界面显示的loss值是 iteration次batch size训练后loss值的加权求和值。val_loss是跑完一次Epoch后,跑完一次验证集计算的值。
---------训练总结------------
train loss 不断下降,test loss不断下降,说明网络仍在学习;(最好的)
train loss 不断下降,test loss趋于不变,说明网络过拟合;(max pool或者正则化)
train loss 趋于不变,test loss不断下降,说明数据集100%有问题;(检查dataset)
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;(减少学习率)
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。(最不好的情况)
作用:
跨通道的特征整合
特征通道的升维和降维
减少卷积核参数(简化模型)
如果当前层和下一层都只有一个通道那么1×1卷积核确实没什么作用,但是如果它们分别为m层和n层的话,1×1卷积核可以起到一个跨通道聚合的作用,所以进一步可以起到降维(或者升维)的作用,起到减少参数的目的。
这里通过一个例子来直观地介绍1x1卷积。输入6x6x1的矩阵,这里的1x1卷积形式为1x1x1,即为元素2,输出也是6x6x1的矩阵。但输出矩阵中的每个元素值是输入矩阵中每个元素值x2的结果。
上述情况,并没有显示1x1卷积的特殊之处,那是因为上面输入的矩阵channel为1,所以1x1卷积的channel也为1。这时候只能起到升维的作用。这并不是1x1卷积的魅力所在。
让我们看一下真正work的示例。当输入为6x6x32时,1x1卷积的形式是1x1x32,当只有一个1x1卷积核的时候,此时输出为6x6x1。此时便可以体会1x1卷积实质作用:
降维。当1x1卷积核的个数小于输入channels数量时,即降维。
注意,下图中第二行左起第二幅图像中的黄色立方体即为1x1x32卷积核,而第二行左起第一幅图像中的黄色立方体即是要与1x1x32卷积核进行叠加运算的区域。
其实1x1卷积,可以看成一种全连接(full connection)。
注:1x1卷积一般只改变输出通道数(channels),而不改变输出的宽度和高度
由于 1×1 并不会改变 height 和 width,改变通道的第一个最直观的结果,就是可以将原本的数据量进行增加或者减少。这里看其他文章或者博客中都称之为升维、降维。但我觉得维度并没有改变,改变的只是 height × width × channels 中的 channels 这一个维度的大小而已[5]。
图像来自知乎ID: YJango[6]
1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep。
备注:一个filter对应卷积后得到一个feature map,不同的filter(不同的weight和bias),卷积以后得到不同的feature map,提取不同的特征,得到对应的specialized neuron[7]。
例子:使用1x1卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,3x3,64channels的卷积核后面添加一个1x1,28channels的卷积核,就变成了3x3,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互[7]。
注意:只是在channel维度上做线性组合,W和H上是共享权值的sliding window
以下图为例,我们可以看到,计算量明显减少。
这一点孙琳钧童鞋讲的很清楚。1×1的卷积层(可能)引起人们的重视是在NIN的结构中,论文中林敏师兄的想法是利用MLP代替传统的线性卷积核,从而提高网络的表达能力。文中同时利用了跨通道pooling的角度解释,认为文中提出的MLP其实等价于在传统卷积核后面接cccp层,从而实现多个feature map的线性组合,实现跨通道的信息整合。而cccp层是等价于1×1卷积的,因此细看NIN的caffe实现,就是在每个传统卷积层后面接了两个cccp层(其实就是接了两个1×1的卷积层)。
进行降维和升维引起人们重视的(可能)是在GoogLeNet里。对于每一个Inception模块(如下图),原始模块是左图,右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小,但是当输入和输出的通道数很大时,乘起来也会使得卷积核参数变的很大,而右图加入1×1卷积后可以降低输入的通道数,卷积核参数、运算复杂度也就跟着降下来了。
以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,如果是左图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。
同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量,左图pooling后feature map是不变的,再加卷积层得到的feature map,会使输出的feature map扩大到416,如果每个模块都这样,网络的输出会越来越大。
而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)[8]。
ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,使得卷积层的输入和输出的通道数都减小,参数数量进一步减少,如下图的结构[8]。
卷积之后的尺寸大小计算公式为:
输入图片大小 W×W
Filter大小 F×F
步长strides S
padding的像素数 P
输出大小为NxN
我们可以得出:
长宽不等时,卷积之后的计算公式也是如此,只需分别计算即可。
在实际操作时,我们还会碰到 **padding的两种方式 “SAME” 和 “VALID”,padding = “SAME”时,会在图像的周围填 “0”,padding = “VALID”则不需要,即 P=0。**一般会选“SAME”,以来减缓图像变小的速度,二来防止边界信息丢失(即有些图像边界的信息发挥作用较少)。
注意!!!
此时可能会发现,按照这两中方式,按照上面的公式怎么不对呀
其实公式是没有问题的,
padding = “VALID”: P=0
padding = “SAME”: kernel_size=1时,P=0;kernel_size=3时,P=1;kernel_size=5时,P=3,以此类推。
问题可能也就出在上面
tensorflow官网给出了另一种计算方式,也是正确的:
padding = “SAME”时:
( 解释:输入w / 步长s 之后向上取整)
padding = “VALID”时:
(也是向上取整)
当输入是5*5,卷积核是3*3,步长S = 2
padding= “SAME”时:
padding= “VALID”时:
如下:
L1,L2 范数即 L1-norm 和 L2-norm,自然,有L1、L2便也有L0、L3等等。因为在机器学习领域,L1 和 L2 范数应用比较多,比如作为正则项在回归中的使用 Lasso Regression(L1) 和 Ridge Regression(L2)。
在线性代数以及一些数学领域中,norm 的定义是
a function that assigns a strictly positive length or size to each vector in a vector space, except for the zero vector. ——Wikipedia
简单点说,一个向量的 norm 就是将该向量投影到 [0, ) 范围内的值,其中 0 值只有零向量的 norm 取到。看到这样的一个范围,相信大家就能想到其与现实中距离的类比,于是在机器学习中 norm 也就总被拿来表示距离关系:根据怎样怎样的范数,这两个向量有多远。
上面这个怎样怎样也就是范数种类,通常我们称为p-norm,严格定义是:
其中当 p 取 1 时被称为 1-norm,也就是提到的 L1-norm,同理 L2-norm 可得。
根据上述公式 L1-norm 和 L2-norm 的定义也就自然而然得到了。
先将 p=1 代入公式,就有了 L1-norm 的定义: $ |\boldsymbol{x}|{1}:=\sum{i=1}^{n}\left|x_{i}\right|$
然后代入 p=2,L2-norm 也有了: $|\boldsymbol{x}|{2}:=\left(\sum{i=1}^{n}\left|x_{i}\right|^{2}\right)^{\frac{1}{2}} $
L2 展开就是熟悉的欧几里得范数:$|\boldsymbol{x}|{2}:=\sqrt{x{1}^{2}+\cdots+x_{n}^{2}}$
题外话,其中 L1-norm 又叫做 taxicab-norm 或者 Manhattan-norm,可能最早提出的大神直接用在曼哈顿区坐出租车来做比喻吧。下图中绿线是两个黑点的 L2 距离,而其他几根就是 taxicab 也就是 L1 距离,确实很像我们平时用地图时走的路线了。
L1 和 L2 范数在机器学习上最主要的应用大概分下面两类
作为损失函数使用
作为正则项使用也即所谓 L1-regularization 和 L2-regularization
先来看个回归问题
我们需要做的是,获得一条线,让数据点到线上的总距离(也就是error)最小。
还记得之前在范数介绍中提到的用来表示距离吗,于是也可以用能表示距离的 L1-norm 和 L2-norm 来作为损失函数了。
首先是 L1-norm 损失函数,又被称为 least absolute deviation (LAD,最小绝对偏差) $S=\sum_{i=1}^{n}\left|y_{i}-f\left(x_{i}\right)\right|$
如果我们最小化上面的损失函数,其实就是在最小化预测值 和目标值 的绝对值。
之后是大家最熟悉的 L2-norm 损失函数,又有大名最小二乘误差 (least squares error, LSE): $S=\sum_{i=1}^{n}\left(y_{i}-f\left(x_{i}\right)\right)^{2}$
这个便不多解释了。
那么问题来了,这里不谈挖掘机,为什么大家一般都用 L2 损失函数,却不用 L1 呢?
这个就说来话长了,如果你问一个学习过微积分的同学,如何求一个方程的最小值,他/她大概会想当然的说:“求导,置零,解方程。” 号称微积分届的农夫三拳。
但如果给出一个绝对值的方程,突然就会发现农夫三拳不管用了,求最小值就有点麻烦了。主要是因为绝对值的倒数是不连续的。
同样的对于 L1 和 L2 损失函数的选择,也会碰到同样的问题,所以最后大家一般用 L2 损失函数而不用 L1 损失函数的原因就是:
因为计算方便!
可以直接求导获得取最小值时各个参数的取值。
此外还有一点,用 L2 一定只有一条最好的预测线,L1 则因为其性质可能存在多个最优解。(更多关于L1 L2 损失函数参考索引5)
因为机器学习中众所周知的过拟合问题,所以用正则化防止过拟合,成了机器学习中一个非常重要的技巧。
但数学上来讲,其实就是在损失函数中加个正则项(Regularization Term),来防止参数拟合得过好。
L1-regularization 和 L2-regularization 便都是我们常用的正则项,两者公式的例子分别如下
这两个正则项最主要的不同,包括两点:
如上面提到的,L2 计算起来更方便,而 L1 在特别是非稀疏向量上的计算效率就很低;
还有就是 L1 最重要的一个特点,输出稀疏,会把不重要的特征直接置零,而 L2 则不会;
最后,如之前多次提过,L2 有唯一解,而 L1 不是。
这里关于第二条输出稀疏我想再进行一些详细讲解,因为 L1 天然的输出稀疏性,把不重要的特征都置为 0,所以它也是一个天然的特征选择器。
可是为什么 L1 会有这样的性质呢,而 L2 没有呢?这里用个直观的例子来讲解。
来一步一步看吧,首先获知用梯度下降法来优化时,需要求导获得梯度,然后用以更新参数。
于是分别先对 L1 正则项和 L2 正则项来进行求导,可得。
之后将 L1 和 L2 和它们的导数画在图上
于是会发现,在梯度更新时,不管 L1 的大小是多少(只要不是0)梯度都是1或者-1,所以每次更新时,它都是稳步向0前进。
而看 L2 的话,就会发现它的梯度会越靠近0,就变得越小。
也就是说加了 L1 正则的话基本上经过一定步数后很可能变为0,而 L2 几乎不可能,因为在值小的时候其梯度也会变小。于是也就造成了 L1 输出稀疏的特性。
讨论:
张旭--------------------------------->
端到端指的是输入是原始数据,输出是最后的结果,原来输入端不是直接的原始数据,而是在原始数据中提取的特征,这一点在图像问题上尤为突出,因为图像像素数太多,数据维度高,会产生维度灾难,所以原来一个思路是手工提取图像的一些关键特征,这实际就是就一个降维的过程。 那么问题来了,特征怎么提? 特征提取的好坏异常关键,甚至比学习算法还重要,举个例子,对一系列人的数据分类,分类结果是性别,如果你提取的特征是头发的颜色,无论分类算法如何,分类效果都不会好,如果你提取的特征是头发的长短,这个特征就会好很多,但是还是会有错误,如果你提取了一个超强特征,比如染色体的数据,那你的分类基本就不会错了。 这就意味着,特征需要足够的经验去设计,这在数据量越来越大的情况下也越来越困难。 于是就出现了端到端网络,特征可以自己去学习,所以特征提取这一步也就融入到算法当中,不需要人来干预了。
YJango---------------------------->
经典机器学习方式是以人类的先验知识将raw数据预处理成feature,然后对feature进行分类。分类结果十分取决于feature的好坏。所以过去的机器学习专家将大部分时间花费在设计feature上。那时的机器学习有个更合适的名字叫feature engineering 。
后来人们发现,利用神经网络,让网络自己学习如何抓取feature效果更佳。于是兴起了representation learning。这种方式对数据的拟合更加灵活。
网络进一步加深,多层次概念的representation learning将识别率达到了另一个新高度。于是你听到了是个搞机器学习的人都知道的名字:deep learning。实指多层次的特征提取器与识别器统一训练和预测的网络。
end to end的好处:通过缩减人工预处理和后续处理,尽可能使模型从原始输入到最终输出,给模型更多可以根据数据自动调节的空间,增加模型的整体契合度。
拿语音识别为具体实例。普遍方法是将语音信号转成频域信号,并可以进一步加工成符合人耳特点的MFCC进行编码(encode)。也可以选择Convolutional layers对频谱图进行特征抓取。这样可在encode的部分更接近end to end 中的第一个end。
但识别出的结果并不可以告诉我们这段语音到底是什么。DNN-HMM混合模型还需要将DNN识别出的结果通过HMM来解码(decode)。而RNN-CTC就将HMM的对齐工作交给了网络的output layer来实现。在decode的部分更接近end to end 中的第二个end。
王赟---------------------------->
传统的语音识别系统,是由许多个模块组成的,包括声学模型、发音词典、语言模型。其中声学模型和语言模型是需要训练的。这些模块的训练一般都是独立进行的,各有各的目标函数,比如声学模型的训练目标是最大化训练语音的概率,语言模型的训练目标是最小化 perplexity。由于各个模块在训练时不能互相取长补短,训练的目标函数又与系统整体的性能指标(一般是词错误率 WER)有偏差,这样训练出的网络往往达不到最优性能。
针对这个问题,一般有两种解决方案:
端到端训练(end-to-end training):一般指的是在训练好语言模型后,将声学模型和语言模型接在一起,以 WER 或它的一种近似为目标函数去训练声学模型。由于训练声学模型时要计算系统整体的输出,所以称为「端到端」训练。可以看出这种方法并没有彻底解决问题,因为语言模型还是独立训练的。
端到端模型(end-to-end models):系统中不再有独立的声学模型、发音词典、语言模型等模块,而是从输入端(语音波形或特征序列)到输出端(单词或字符序列)直接用一个神经网络相连,让这个神经网络来承担原先所有模块的功能。典型的代表如使用 CTC 的 EESEN [1]、使用注意力机制的 Listen, Attend and Spell [2]。这种模型非常简洁,但灵活性就差一些:一般来说用于训练语言模型的文本数据比较容易大量获取,但不与语音配对的文本数据无法用于训练端到端的模型。因此,端到端模型也常常再外接一个语言模型,用于在解码时调整候选输出的排名(rescoring),如 [1]。
「端到端训练」和「端到端模型」的区分,在 [2] 的 introduction 部分有比较好的论述。
参考文献: [1] Yajie Miao, Mohammad Gowayyed, and Florian Metze, "EESEN: End-to-End Speech Recognition using Deep RNN Models and WFST-based Decoding," in Proc. ASRU 2015. [2] William Chan, et al. "Listen, attend and spell: A neural network for large vocabulary conversational speech recognition," in Proc. ICASSP 2016.
陈永志-------------->
我从目标检测角度来说说我对end-to-end的理解。
非end-to-end方法: 目前目标检测领域,效果最好,影响力最大的还是RCNN那一套框架,这种方法需要先在图像中提取可能含有目标的候选框(region proposal), 然后将这些候选框输入到CNN模型,让CNN判断候选框中是否真的有目标,以及目标的类别是什么。在我们看到的结果中,往往是类似与下图这种,在整幅图中用矩形框标记目标的位置和大小,并且告诉我们框中的物体是什么。 这种标记的过程,其实是有两部分组成,一是目标所在位置及大小,二是目标的类别。在整个算法中,目标位置和大小其实是包含在region proposal的过程里,而类别的判定则是在CNN中来判定的。
这种标记的过程,其实是有两部分组成,一是目标所在位置及大小,二是目标的类别。在整个算法中,目标位置和大小其实是包含在region proposal的过程里,而类别的判定则是在CNN中来判定的。
end-to-end方法: end-to-end方法的典型代表就是有名的yolo。前面的方法中,CNN本质的作用还是用来分类,定位的功能其并没有做到。而yolo这种方法就是只通过CNN网络,就能够实现目标的定位和识别。也就是原始图像输入到CNN网络中,直接输出图像中所有目标的位置和目标的类别。这种方法就是end-to-end(端对端)的方法,一端输入我的原始图像,一端输出我想得到的结果。只关心输入和输出,中间的步骤全部都不管。
杨楠---------------------->
end-end在不同应用场景下有不同的具体诠释,对于视觉领域而言,end-end一词多用于基于视觉的机器控制方面,具体表现是,神经网络的输入为原始图片,神经网络的输出为(可以直接控制机器的)控制指令,如:
总之,end-end不是什么新东西,也不是什么神奇的东西,仅仅是直接输入原始数据,直接输出最终目标的一种思想。
胖子不胖------------------------>
其实就是joint learning.
end-to-end 的本质是你要解决的问题是多阶段的或多步的(跟所谓的raw feature没啥关系)。如果分阶段学习的话,第一阶段的最优解不能保证第二阶段的问题达到最优。end-to-end把他们堆在一起来优化,确保最后阶段的解达到最优。
想飞的石头-------------------------->
因为多层神经网络被证明能够耦合任意非线性函数,通过一些配置能让网络去做以前需要人工参与的特征设计这些工作,然后配置合适的功能如classifier,regression,而现在神经网络可以通过配置layers的参数达到这些功能,整个输入到最终输出无需太多人工设置,从raw data 到最终输出指标。
是一种衡量图像质量的指标。在很多领域都会需要这个指标,比如在超分辨率重建图像的时
WIKI解释:峰值信噪比(英语:Peak signal-to-noise ratio,常缩写为PSNR)是一个表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值的工程术语。由于许多信号都有非常宽的动态范围,峰值信噪比常用对数分贝单位来表示。
计算PSNR要先知道MSE(均方误差)的计算。两个_m_×_n_单色图像_g_和_f_,如果一个为另外一个的噪声近似,那么它们的的均方误差定义为:
MSE的概念应该是比较熟悉的,这也是常见的损失函数。而PSNR就是通过MSE得出来的,公式如下:
其中, L 表示重建图像中各像素的位深,一般取 L = 8, $2^L$ 表示通常情况下图像中像素值的最大值,一般取 255。
其中,_MAXI_是表示图像点颜色的最大数值,如果每个采样点用 8 位表示,那么就是 255。如公式9
可以看出,PSNR事实上只是将MSE换成了信号处理中常用的db(分贝)表达形式,所以PSNR与MSE没有什么本质上的不同,只是数字上看起来更加有区分度一些(从数学上讲这算不得什么根本性的东西,但从人的辨识度来讲,这个优势还是挺明显的)。由于PSNR公式将MSE放在了分母上,所以在进行图像质量评估时,**PSNR数值越大表明待评估的图像质量越好,这一点与MSE相反。**PSNR公式中的L是一个常数,它表示图像数据类型的最大动态范围。比如对于float型的图像数据,其取值范围是[0, 1],所以L=1。对于uint8类型的图像数据,其取值范围是[0, 255],所以L=255。一般情况下L就这两种情况,至于HDR(High Dynamic Range,宽动态范围)的图像,则根据图像的位深另算。
上面是针对灰度图像的计算方法,如果是彩色图像,通常有三种方法来计算。
分别计算 RGB 三个通道的 PSNR,然后取平均值。
计算 RGB 三通道的 MSE ,然后再除以 3 。
将图片转化为 YCbCr 格式,然后只计算 Y 分量也就是亮度分量的 PSNR。
其中,第二和第三种方法比较常见。
一般来说,
PSNR高于40dB说明图像质量极好(即非常接近原始图像),
在30—40dB通常表示图像质量是好的(即失真可以察觉但可以接受),
在20—30dB说明图像质量差;
最后,PSNR低于20dB图像不可接受
针对超光谱图像,我们需要针对不同波段分别计算 PSNR,然后取平均值,这个指标称为 MPSNR。
SSIM公式基于样本x和y之间的三个比较衡量:亮度 (luminance)、对比度 (contrast) 和结构 (structure)。
一般取$c_3 = c_2 / 2 $。
$\mu_x $为x的均值
$\mu_y$为y的均值
$\sigma_x^2$为x的方差
$\sigma_y^2$为y的方差
$\sigma_{xy}$为x和y的协方差
$c_1 = (k_1L)^2, c_2 = (k_2L)^2$为两个常数,避免除零
l为像素值的范围,$2^B-1$
$k_1=0.01, k_2=0.03$为默认值
那么
Skimage.measure 的compare_psnr和compare_ssim的改动
最近看一个代码里面计算psnr和ssim使用的是老版本的用法,代码跑不起来。
查阅之后发现是新版本废弃了这两个方法。然后在API文档中搜索找到了新版本应该使用的API
计算两个图片之间的平均结构相似指数。
参数:
im1, im2: ndarray 两个图片,任何具有相同形状的维度。 win_size: int or None, optional 用来比对的滑动窗口的变长。必须是奇数。如果gaussian_weights是True,将其忽略,窗口尺寸将依赖于sigma gradient: bool, optional 如果为True,也会返回相对于im2的梯度 data_range: float, optional 输入图像的数据范围(最大和最小值之间可能的距离)使用默认,这会从图像数据类型中估计 channel_axis: int or None, optional 如果为None,图像被假定为灰度图(单通道),否则,使用该参数索引轴的数组对应的通道。 multichannel: bool, optional 如果为True,则将数组的最后一维视为通道。相似度计算是独立完成的每个通道,然后平均。
此参数已弃用:请指定channel_axis。 gaussian_weights: bool, optional 如果为True,则每个patch的均值和方差由宽度σ =1.5的归一化高斯核进行空间加权。 full: bool, optional 如果为True,也返回完整的结构相似度图像。
返回值
mssim: float 图像上的平均结构相似度指数。 grad: ndarray im1和im2之间的结构相似度梯度。这只在梯度设置为True时返回。
S: ndarray 完整的SSIM映像。这只在full设置为True时返回。
最后再说一下,如果是以前的代码改成现在的这个structural_similarity,如果用了multichannel,他会提示使用channel_axis,选定通道的那个维度即可。
给一个图片计算峰值信噪比
参数:(注意前两个的先后顺序)
image_true: ndarray Ground-truth图像,与im_test形状相同。
image_test: ndarray 测试图像
data_range: int, optional ==输入图像的数据范围==(可能值的最小值和最大值之间的距离)。默认情况下,这是根据图像数据类型估计的。,一般为“1.”或者“255.”
psnr: float PSNR值度量
计算SSIM时出现:
进到structural_similarity
源码,发现win_size默认大小为7:
win_size大小要大于图片的shape,否则的话就会raise ValueError:
本人验证集50张图片,batch size=16,在计算SSIM时传进去的数组尺寸为(B,H,W,C),即使再设置multichannel=True后也需要im.shape>win_size,因此当验证集按照bs=16,取到最后一个batch时输入尺寸为(2,H,W,C),此时B<win_size如果像我这样按照一个batch去计算SSIM,当出现一个batch中数量小于win_size时则会出现上诉错误!
解决方法
按照单张图去计算SSIM,此时注意输进去的图片去掉batch这个维度,应为(H,W,C)。
取batch时确保每一个batch数都大于win_size(默认为7)
(不推荐)更改win_size大小,此做法并不推荐,因为要是和别的文章中数值进行比较,win_size大小不一样应该会对结果有一定影响,还是默认大小比较好
版权声明:本文为CSDN博主「aspirin0524」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/xwyljt/article/details/124408257
[1] 1*1的卷积核与Inception:
[2] 《Network in network》:
[3]吴恩达DeepLearning.ai视频教程
[4]
[5]【CNN】卷积神经网络中的 1*1 卷积 的作用:
[6]
[7] 1×1 卷积核的作用?(附实例):
[8] 1X1卷积核到底有什么作用呢?:
扩展知乎话题:卷积神经网络中用1*1 卷积有什么作用或者好处呢?:
本文转自 ,如有侵权,请联系删除。
本文转自 ,如有侵权,请联系删除。
因此,此两者的辨析也总被提及,或是考到。不过在说明两者定义和区别前,先来谈谈什么是。
当然 L1 损失函数难道就没有什么好处了吗,也是有的,那就是** (Robust) 更强,对异常值更不敏感**。
来源: 著作权归作者所有。
我的理解跟 不太一样。我就在语音识别的范围内说说我的理解吧。
与 的答案不同,我觉得「输入是语音波形(raw waveform)」并不是端到端模型的本质特征,端到端模型的输入也可以是特征序列(MFCC 等)。端到端模型的本质特征是把声学模型、发音词典、语言模型这些传统模块融合在一起。
1. Nvidia的基于CNNs的end-end自动驾驶,输入图片,直接输出steering angle。从视频来看效果拔群,但其实这个系统目前只能做简单的follow lane,与真正的自动驾驶差距较大。亮点是证实了end-end在自动驾驶领域的可行性,并且对于数据集进行了augmentation。链接:
2. Google的paper: Learning Hand-Eye Coordination for Robotic Grasping with Deep Learning and Large-Scale Data Collection,也可以算是end-end学习:输入图片,输出控制机械手移动的指令来抓取物品。这篇论文很赞,推荐:
3. DeepMind神作Human-level control through deep reinforcement learning,其实也可以归为end-end,深度增强学习开山之作,值得学习:
4. Princeton大学有个Deep Driving项目,介于end-end和传统的model based的自动驾驶之间,输入为图片,输出一些有用的affordance(实在不知道这词怎么翻译合适…)例如车身姿态、与前车距离、距路边距离等,然后利用这些数据通过公式计算所需的具体驾驶指令如加速、刹车、转向等。链接:
本文转自 ,如有侵权,请联系删除。
将设为 1,可以得到
每次计算的时候都从图片上取一个的窗口,然后不断滑动窗口进行计算,最后取平均值作为全局的 SSIM。
针对超光谱图像,我们需要针对不同波段分别计算 SSIM,然后取平均值,这个指标称为 MSSIM。
本文转自 ,如有侵权,请联系删除。
就是把相关方法放到了metrics里面了,名字都从缩写变成了全名;在附上API说明吧。,
本文转自 ,如有侵权,请联系删除。