DnCnn

图像去噪的背景

参考:https://blog.csdn.net/weixin_40446557/article/details/81451651

一、什么是图像噪声?

噪声在图像上常表现为一引起较强视觉效果的孤立像素点或像素块。一般,噪声信号与要研究的对象不相关,它以无用的信息形式出现,扰乱图像的可观测信息。通俗的说就是噪声让图像不清楚。

在图像的采集、传输和量化编码解码的过程中,会产生噪声,常见的噪声有高斯噪声、泊松噪声、和椒盐噪声。

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。

产生原因:

1)图像传感器在拍摄时市场不够明亮、亮度不够均匀;

2)电路各元器件自身噪声和相互影响;

3)图像传感器长期工作,温度过高。

泊松噪声就是符合泊松分布的噪声模型,泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。如某一服务设施在一定时间内受到的服务请求的次数,电话交换机接到呼叫的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的次数、DNA序列的变异数、放射性原子核的衰变数等等。

泊松噪声一般在亮度很小或者高倍电子放大线路中出现

椒盐噪声,椒盐噪声又称脉冲噪声,它随机改变一些像素值,是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。

椒盐噪声往往由图像切割引起。

实现:skimage库 skimage.util.random_noise(imagemode=’gaussian’seed=Noneclip=True**kwargs)

其中image (height, weight,channel)

————————————————————————————————————————————————————————

评价指标:

PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比

 

VGG网络:

VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5),也就是说VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复的使用3x3的小型卷积核和2x2的最大池化层,VGGNet成功地构筑了16~19层深的卷积神经网络。

VGG16网络的好处

接触过深度学习的应该都知道最早的卷积神经网络都是通过比较大的卷积核进行卷积来提取特征的(例如AlexNet,LeNet),虽然卷积核的尺寸越大,越能够总结空间信息。但是同样也增加了参数的数量,提高了计算量。而VGG网络通过每个block中多个3x3 的卷积核来代替之前的大尺寸卷积核,可以说是非常的nice!举个例子,用3个3x3的卷积核来卷积得到像素对应的感受野大小与一个7x7卷积核得到的感受野大小是一样的。但是,参数量却是差了近一倍(3x3x3=27,7x7=49)

5x5卷积核可以用2个3x3卷积核替代的原因,好处降低参数量

(1)保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果;(2)减少计算参数量


VGGNet的优缺点总结:

  • VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2),每个block中通过多个Conv的操作,即减少了参数量还保留了同样的感受野。

  • 验证了通过不断加深网络结构可以提升性能通过网络结构的加深,网络能够提取更加抽象的高阶特征,这也就是为什么最后提取了512通道的feature map。

  • 缺点:它的参数量太大,耗费了很多的计算资源,这主要是因为最后的三个全连接层。而后也提出了Inception v1、v2、v3版本以及FCN。

为什么网络的深度可以影响网络的性能?

  • 非线性表达能力更强,可以获取更多抽象的特征,能够解决更加复杂的问题
  • 每一层的工作量会减小

卷积

卷积的三种模式:full, same, valid;full为从filter和image刚相交开始做卷积,same是保持卷积后的和原来一样,valid是卷积后的变小。(n + 2*p - f)/s + 1  new size 卷积的三种模式

卷积操作:一个滤波器大小映射成一个像素点。

感受野:其实就是指一个像素点和之前的多少个像素有关联。

卷积的优势:参数共享和稀疏连接【有防止过拟合的功效】

参数共享:(卷积核)滤波器的参数是共享的

即低阶/高阶特征。这是随着卷积网络的加深对不同深度的feature map的取名。低阶特征可以理解为颜色、边缘等特征,就好比是一个图片中车的轮廓。 高阶特征可以理解为是更加抽象的特征,相当于更加细化的,比如说车中车轮,以及车轮中的车胎等。而通过卷积网络深度的增加,提取到的最后的高阶特征就是组成元素的基本组成单位:比如点、线、弧等。而最后的全连接层的目的其实就是进行这些高阶特征的特征组合

池化

池化操作主要包含最大池化和平均池化:
最大池化:其实就是降低维度,提取图像的主要特征。
平均池化:取一个区域的平均值,用来保留图像的背景信息。

池化的优点:池化层的降采样,进一步降低了输出的参数量,并赋予模型以轻度形变的容忍性,提高了模型的泛化能力。

全连接

把之前提取的所有特征重新组合起来。

参考博客如下:

https://blog.csdn.net/qq_19329785/article/details/84504722?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/amusi1994/article/details/81461968?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://www.jianshu.com/p/72481d794a6b

https://blog.csdn.net/bemy1008/article/details/84559905

——————————————————————————————————————————————————————————

批量归一化Batch Normalization

参考博客:https://www.cnblogs.com/guoyaohua/p/8724433.html

  1. 整体说一下:机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
  2. 接着引入covariate shift的概念如果ML系统实例集合<X,Y>中的输入值X的分布老是变,这不符合IID假设,网络模型很难稳定的学规律,这不得引入迁移学习才能搞定吗,我们的ML系统还得去学习怎么迎合这种分布变化啊。对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层。
  3. BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。其实一句话就是:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。
    所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift)。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
  4. BN优点:不仅仅极大提升了训练速度,收敛过程大大加快;②还能增加分类效果,一种解释是这是类似于Dropout的一种防止过拟合的正则化表达方式,所以不用Dropout也能达到相当的效果;③另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等。

——————————————————————————————————————————————————————————

残差学习Residual learning

Dncnn中的残差学习:与使用许多残差单元的残差网络[29]不同,我们的DnCNN使用单个残差单元来预测残差图像。干净图片为x,噪声为v,那么加噪图像是y = x + v。残差学习不是让网络直接根据y预测出干净图像x,二是让残差单元R(y)预测v,那么干净图像就是y - R(y).

不同的是DnCNN并非每隔两层就加一个shortcut connection,而是将网络的输出直接改成residual image(残差图片),设纯净图片为x,带噪音图片为y,假设y=x+v,则v是残差图片。即DnCNN的优化目标不是真实图片与网络输出之间的MSE(均方误差),而是真实残差图片与网络输出之间的MSE。

根据ResNet中的理论,当残差为0时,堆积层之间等价于恒等映射,而恒等映射是非常容易训练优化的。作者注意到在图像复原领域(尤其是在噪音程度较小的情况下),噪音图片与纯净图片的残差非常小,所以理论上残差学习非常适合运用到图像复原上。

 

而我们常说的残差网络是怎么回事呢?

ResNet:

原文链接:https://blog.csdn.net/weixin_43624538/article/details/85049699

1、网络性能退化

网络的深度造成的问题:

  • 增加深度带来的首个问题就是梯度爆炸/消散的问题,这是由于随着层数的增多,在网络中反向传播的梯度会随着连乘变得不稳定,变得特别大或者特别小。这其中经常出现的是梯度消散的问题。
  • 为了克服梯度消散也想出了许多的解决办法,如使用BN,relu激活函数使用Xaiver初始化等,可以说梯度消散已经得到了很好的解决
  • 增加深度的另一个问题就是网络的degradation问题,即随着深度的增加,网络的性能会越来越差,直接体现为在训练集上的准确率会下降,残差网络文章解决的就是这个问题,而且在这个问题解决之后,网络的深度上升了好几个量级。

2、残差网络原理

随着网络深度的增加,网络的性能由好变差,我们可以设想一下,当我们直接对网络进行简单的堆叠到特别长,网络内部的特征在其中某一层已经达到了最佳的情况,至少让深度网络实现和浅层网络一样的性能,即让深度网络后面的层至少实现恒等映射的作用,根据这个想法,作者提出了残差模块来帮助网络实现恒等映射

F(x)=H(x)−xx为浅层的输出,H(x)为深层的输出,F(x)为夹在二者中间的的两层代表的变换,当浅层的x代表的特征已经足够成熟,如果任何对于特征x的改变都会让loss变大的话,F(x)会自动趋向于学习成为0,x则从恒等映射的路径继续传递。这样就在不增加计算成本的情况下实现了一开始的目的:在前向过程中,当浅层的输出已经足够成熟(optimal),让深层网络后面的层能够实现恒等映射的作用。

3、残差网络的优势

可以训练更深层的网络。

————————————————————————————————————————————————————————————

数据增强方法

1、常用的数据增强方法

参考博客:https://blog.csdn.net/zhelong3205/article/details/81810743?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

为什么需要数据增强 :

一般而言,比较成功的神经网络需要大量的参数,许许多多的神经网路的参数都是数以百万计,而使得这些参数可以正确工作则需要大量的数据进行训练,而实际情况中数据并没有我们想象中的那么多

数据增强的作用 :

增加训练的数据量,提高模型的泛化能力
增加噪声数据,提升模型的鲁棒性

如何获得大量的数据 :

一种方法是获得新的数据,这种方法比较麻烦,需要大量的成本,而第二种方法则是对数据进行增强,即利用已有的数据比如翻转、平移或旋转,创造出更多的数据,来使得神经网络具有更好的泛化效果。

数据增强的分类 :

数据增强可以分为两类,一类是离线增强,一类是在线增强。

离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子 x 原数据集的数目 ,这种方法常常用于数据集很小的时候
在线增强 : 这种增强的方法用于,获得 batch 数据之后,然后对这个 batch 的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。


常用的数据增强技术 :

首先定义增强因子 : 指的是数据做离线增强之后增长的倍数。

翻转 :增强因子 2 或 3 
数据翻转是一种常用的数据增强方法,这种方法不同于旋转 180 这种方法是做一种类似于镜面的翻折。 
旋转 : 增强因子 2 到 4 
旋转就是顺时针或者逆时针的旋转,注意在旋转的时候, 最好旋转 90 - 180 度否则会出现尺度的问题 
缩放 :增强因子任意 
图像可以被放大或缩小。放大时,放大后的图像尺寸会大于原始尺寸。大多数图像处理架构会按照原始尺寸对放大后的图像 进行裁切。我们将在下一章节讨论图像缩小,因为图像缩小会减小图像尺寸,这使我们不得不对图像边界之外的东西做出假设。下面是图像缩放的例子。 
裁剪 :增强因子任意 
这种方法更流行的叫法是随机裁剪,我们随机从图像中选择一部分,然后降这部分图像裁剪出来,然后调整为原图像的大小 
平移 : 增强因子任意 
平移是将图像沿着 x 或者 y 方向 (或者两个方向) 移动。我们在平移的时候需对背景进行假设,比如说假设为黑色等等,因为平移的时候有一部分图像是空的,由于图片中的物体可能出现在任意的位置,所以说平移增强方法十分有用。 
添加噪声 :增强因子任意 看噪声的类型 
过拟合通常发生在神经网络学习高频特征的时候 (因为低频特征神经网络很容易就可以学到,而高频特征只有在最后的时候才可以学到) 而这些特征对于神经网络所做的任务可能没有帮助,而且会对低频特征产生影响,为了消除高频特征我们随机加入噪声数据来消除这些特征。 

Dncnn中用到的数据增强

首先对BSD400数据集【400*180*180】进行【1,0.9,0.8,0.7】四种程度的缩放处理,然后分成40*40的图像块patch,每隔10像素裁剪,大约裁剪14*14*400*4接近20w的图像块,每个图像块再随机进行 原图,翻转,旋转 的处理,使用np.save保存图像,文件后缀为npy.

——————————————————————————————————————————————————————


https://blog.csdn.net/sinat_35512245/article/details/78796328?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/woaidapaopao/article/details/77806273

激活函数

1、梯度消失、梯度爆炸 
  梯度消失:这本质上是由于激活函数的选择导致的, 最简单的sigmoid函数为例,在函数的两端梯度求导结果非常小(饱和区),导致后向传播过程中由于多次用到激活函数的导数值使得整体的乘积梯度结果变得越来越小,也就出现了梯度消失的现象。 
  梯度爆炸:同理,出现在激活函数处在激活区,而且权重W过大的情况下。但是梯度爆炸不如梯度消失出现的机会多。

2.如何解决梯度消失和梯度膨胀?

(1)梯度消失: 
  根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0,可以采用ReLU激活函数有效的解决梯度消失的情况。 
(2)梯度膨胀 
  根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于1的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大,可以通过激活函数来解决。
 

常见的激活函数表达式,及优缺点
Sigmoid    σ(x)=1/(1+e−x)   

  • 1、会有梯度弥散
  • 2、不是关于原点对称
  • 3、计算exp比较耗时    -

Tanh    tanh(x)=2σ(2x)−1 

缺点:梯度弥散没解决  

优点:

  •  1、解决了原点对称问题
  • 2、比sigmoid更快

ReLU    f(x)=max(0,x)

缺点:梯度弥散没完全解决,在(-)部分相当于神经元死亡而且不会复活 

优点:

1、解决了部分梯度弥散问题
2、收敛速度更快

疑问:为什么relu是线性分段函数,但是确是非线性函数。线性非线性是作用在定义域上的,在定义域上如果一阶倒数不是常数就是非线性函数。x>=0时导数为1, x<0时倒数为0。

————————————————
原文链接:https://blog.csdn.net/woaidapaopao/article/details/77806273

常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数(btw,在本博客中SVM那篇文章开头有提过)。

Sigmoid的函数表达式如下:

也就是说,Sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常小的负数时,则g(z)会趋近于0。

压缩至0到1有何用处呢?用处是这样一来便可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。

举个例子,如下图(图引自Stanford机器学习公开课):
 

补充,为什么需要原点对称:

一句话总结就是:sigmoid函数处理完输出都是0-1的正值,没有负值。y = w1*x1+w2*x2+b,如果w1 = 20, w2=20,w1 < w1*,w2 > w2*,那么需要一个增大,一个下降,而这个只能下降。

https://liam.page/2018/04/17/zero-centered-active-function/?from=singlemessage&isappinstalled=0 

神经网络激活函数的使用原因?

  • 如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
  • 如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

神经网络中激活函数的真正意义?一个激活函数需要具有哪些必要的属性?

  1. 非线性:即导数不是常数。这个条件前面很多答主都提到了,是多层神经网络的基础,保证多层网络不退化成单层线性网络。这也是激活函数的意义所在。 
  2. 几乎处处可微:可微性保证了在优化中梯度的可计算性。传统的激活函数如sigmoid等满足处处可微。对于分段线性函数比如ReLU,只满足几乎处处可微(即仅在有限个点处不可微)。对于SGD算法来说,由于几乎不可能收敛到梯度接近零的位置,有限的不可微点对于优化结果不会有很大影响[1]。 
  3. 计算简单:正如题主所说,非线性函数有很多。极端的说,一个多层神经网络也可以作为一个非线性函数,类似于Network In Network[2]中把它当做卷积操作的做法。但激活函数在神经网络前向的计算次数与神经元的个数成正比,因此简单的非线性函数自然更适合用作激活函数。这也是ReLU之流比其它使用Exp等操作的激活函数更受欢迎的其中一个原因。 
  4. 非饱和性(saturation):饱和指的是在某些区间梯度接近于零(即梯度消失),使得参数无法继续更新的问题。最经典的例子是Sigmoid,它的导数在x为比较大的正值和比较小的负值时都会接近于0。更极端的例子是阶跃函数,由于它在几乎所有位置的梯度都为0,因此处处饱和,无法作为激活函数。ReLU在x>0时导数恒为1,因此对于再大的正值也不会饱和。但同时对于x<0,其梯度恒为0,这时候它也会出现饱和的现象(在这种情况下通常称为dying ReLU)。Leaky ReLU[3]和PReLU[4]的提出正是为了解决这一问题。

sigmoid和softmax的区别:

• 如果模型输出为非互斥类别,且可以同时选择多个类别,则采用Sigmoid函数计算该网络的原始输出值。

• 如果模型输出为互斥类别,且只能选择一个类别,则采用Softmax函数计算该网络的原始输出值。

参考https://m.sohu.com/a/321563936_100118081/?pvid=000115_3w_a&from=groupmessage

——————————————————————————————————————————————————————————

https://liam.page/2018/04/17/zero-centered-active-function/?from=singlemessage&isappinstalled=0

——————————————————————————————————————————————————————

手推LR

参考链接:

https://zhuanlan.zhihu.com/p/35709485

https://blog.csdn.net/suipingsp/article/details/41822313?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

BP推导

https://blog.csdn.net/qq_29762941/article/details/80343185?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-8

————————————————————————————————————————————————————

优化算法及其优缺点?

GD梯度下降法
1) 批量梯度下降 
优点:可以一定程度上解决局部最优解的问题 
缺点:收敛速度较慢 
2)随机梯度下降 
优点:容易陷入局部最优解 
缺点:收敛速度较快 
3)mini_batch梯度下降 
综合随机梯度下降和批量梯度下降的优缺点,提取的一个中和的方法。 
动量Momentum优化法:

引入指数加权平均,在更新新的梯度时考虑以前的梯度信息,解决梯度下降中摆动比较大的问题。

RMSprop算法:

在梯度的分母上加了一个均方根,二次动量,可以自适应的调节学习率。

AdamAdam通常被认为对超参数的选择相当鲁棒,适合解决含大规模数据和参数的优化问题

  • 首先,Adam中动量直接并入了梯度一阶矩(指数加权)的估计。其次,相比于缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSProp,Adam包括偏置修正,偏置修正针对的是早期的预测,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩估计。

     

https://blog.csdn.net/weixin_40170902/article/details/80092628?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4

https://blog.csdn.net/qsczse943062710/article/details/76763739?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1

——————————————————————————————————————————————————————

CV领域很重要的网络架构:

一、LeNet-5

现在版本的 LeNet-5 输出层一般会采用 softmax 激活函数,在 LeNet-5 提出的论文中使用的激活函数不是 softmax,但其现在不常用。该层神经元数量为 10,代表 0~9 十个数字类别。(图 1 其实少画了一个表示全连接层的方框,而直接用 y^y^ 表示输出层。 )

LeNet5性质:

  • 结构是卷积+池化+卷积+池化+全连接3,共七层,卷积核5*5,是最早的卷积神经网络架构之一
  • 之后卷积+池化+全连接被广泛使用
  • LeNet-5 大约有 60,000 个参数。
  • 随着网络越来越深,图像的高度和宽度在缩小,与此同时,图像的 channel 数量一直在增加。
  • 现在常用的 LeNet-5 结构和 Yann LeCun 教授在 1998 年论文中提出的结构在某些地方有区别,比如激活函数的使用,现在一般使用 ReLU 作为激活函数,输出层一般选择 softmax。

二、AlexNet

Alex网络特点

1. 更深的网络结构,网络参数很大

2. 使用层叠的卷积层,即卷积层+卷积层+池化层来提取图像的特征

3. 使用Dropout抑制过拟合

4. 使用数据增强Data Augmentation抑制过拟合

5. 使用Relu替换之前的sigmoid的作为激活函数

6. 多GPU训练

三、VGG网络

  • VGG-16 中所有卷积层 filter 宽和高都是 3,步长为 1,padding 都使用 same convolution;所有池化层的 filter 宽和高都是 2,步长都是 2。

见上面总结。

四、ResNET

ResNet和VGG Net的对比以及创新

ResNet提出residual learning的思想。ResNet通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度。RetNet和VGG Net最大的区别在于前者有很多的旁路将输入直接连接到后面的层,这种结构也被称为shortcut

在ResNet网络结构中会用到两种残差模块,一种是以两个3*3的卷积网络串接在一起作为一个残差模块,另外一种是1*1、3*3、1*1的3个卷积网络串接在一起作为一个残差模块。ResNet有不同的网络层数,常用的是50-layer,101-layer,152-layer,他们都是由以下两种残差模块堆叠在一起实现的。 


详细见上面总结

参考:

https://www.cnblogs.com/wuliytTaotao/p/9544625.html 【写的很清楚】

五、GoogleNet Inception网络

1*1卷积核的作用:

1、增添了一个非线性函数,可以改变输入的通道数量

2、通过构建1*1卷积来构建瓶颈,从而降低计算成本

Inception网络

1*1, 3*3, 5*5 和池化层并行,一同训练,组成Inception网络。

作用:代替人工来确定卷积层中的过滤器类型,从而确定是否构建卷积或者池化。

基于Inception构建了GoogLeNet的网络结构(共22层)

网络特点如下:【Inception结构、计算高效】

1. GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;

2. 网络最后采用了average pooling来代替FC,该想法来自NIN,可以将准确率提高0.6%。但是,实际在最后还是加了一个FC,主要是为了方便对输出进行灵活调整;

3. 虽然移除了FC,但是网络中依然使用了Dropout ; 

4. 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化。但是在实际测试的时候,这两个额外的softmax会被去掉。

整个架构中使用了9个Inception 模型,总共22层。这已经很深了……没有使用完全连接的层。他们使用一个平均池代替,从 7x7x1024 的体积降到了 1x1x1024,这节省了大量的参数。比AlexNet的参数少了12X在测试中,相同图像的多个剪裁建立,然后填到网络中,计算softmax probabilities的均值,然后我们可以获得最后的解决方案。在感知模型中,使用了R-CNN中的概念。Inception有一些升级的版本(版本6和7),“少数高端的GPU”一周内就能完成训练。

https://blog.csdn.net/weixin_43821874/article/details/102980949

正则化问题 dropout L1 L2

1、什么是过拟合?过拟合的原因是什么?如何解决

所谓过拟合,指的是当一个模型过于复杂之后,它可以很好地“记忆”每一个训练数据中随机噪声的部分而忘记了要去学习训练数据中通用的趋势。

原因:

  • 数据:数据不规范,数据量少,数据穿越,统计特征用到了未来的信息或者标签信息 
  • 算法:算法过于复杂 

解决: 1.数据扩充(数据增强)2.正则化3、BN4、early stopping
 

2、正则化的作用

降低过拟合,提高模型的泛化能力。

正则化是针对过拟合而提出的,以为在求解模型最优的是一般优化最小的经验风险,现在在该经验风险上加入模型复杂度这一项(正则化项是模型参数向量的范数),并使用一个rate比率来权衡模型复杂度与以往经验风险的权重,如果模型复杂度越高,结构化的经验风险会越大,现在的目标就变为了结构经验风险的最优化,可以防止模型训练过度复杂,有效的降低过拟合的风险。 

3、L1/L2正则化?

在Loss中加入刻画模型复杂度的指标,λ表示模型复杂损失在总损失中的比例。无论哪种方式基本思想都是通过限制权重的大小,使得模型不能任意拟合训练数据中的随机噪声。

L1/L2区别:

L1会让权重稀疏的更彻底【好多参数为0】,L2也会让权重衰减,但是不会到0【如0.001的平方就很小了,不至于再降到0】;

L2是处处可导的,而L1存在拐点,不是处处可导的。

https://charlesliuyx.github.io/2017/10/03/【直观详解】什么是正则化/

详细:

L1和L2的区别 

  • 1、L1是Lasso Regression,表示向量中每个元素绝对值的和:L1范数的解通常是稀疏性的,倾向于选择数目较少的一些非常大的值或者数目较多的insignificant的小值。 
  • 2、L2是岭回归,Ridge Regression,是欧氏距离也就是平方和的平方根。L2范数越小,可以使得w的每个元素都很小,接近于0,但L1范数不同的是他不会让它等于0而是接近于0。 
  • 3、L1正则化的w可取的值是转置的方形,L2对应的是圆形。这样损失函数l(w)的最小值更容易在L1对应的边角上取得,从而这些维度变成0了。 
  • 4、从贝叶斯的角度来看,加入正则项相当于加入了一种先验。即当训练一个模型时,仅依靠当前的训练数据集是不够的,为了实现更好的泛化能力,往往需要加入先验项。 L1范数相当于加入了一个Laplacean先验;L2范数相当于加入了一个Gaussian先验。 
  • 5、L2对大数的惩罚更大,但是解相对来说比较均匀。

 

4、dropout

参数:keep_prob删除节点的概率,随机消除一定的节点,使得网络简单,这样不会过分依赖某一特征,也达到了权重衰减得作用。防止参数过分依赖训练数据,增加参数对数据集的泛化能力,让其他神经元向泛化能力更好的方向学习。

dropout 包括参数的设置,还有实现的细节,比如输出/p,从而保证期望相同(重要)

关键词:随即删除,bernoulli二项式分布,随机生成01向量,缩放处理。

为什么要缩放?

在源代码中,p为丢弃概率,那么1-p就为保留概率,缩放的时候某个点的输出期望为E(x) = (1-p)(x/(1-p)) + p * 0 = x,因此输出的时候就不用特殊处理。

详细见这篇博客,公式什么的也需要弄懂https://blog.csdn.net/program_developer/article/details/80737724

https://blog.csdn.net/stdcoutzyx/article/details/49022443?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2

网络不收敛的原因及工程中如何分析处理

train loss与test loss结果分析【采用交叉验证法分析】

train loss 不断下降,test loss不断下降,说明网络仍在学习;

train loss 不断下降,test loss趋于不变,说明网络过拟合;

train loss 趋于不变,test loss不断下降,说明数据集100%有问题;

train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;

train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

网络不收敛原因

训练技巧:

因此在训练时,先用小样本测试一下网络的训练是否逐渐下降到0,如果loss不下降需要调试学习率和检查数据归一化问题,从而减轻计算成本。【对于如何调参,参考吴恩达课程】

偏差、方差:

方法:1、先看偏差高不高,也就是训练loss收敛的好不好;解决:需要更深的网络,寻找适合的网络架构

            2、如果方差高,出现过拟合;解决:1、更多数据,数据增强;2、正则化方法l2正则化和dropout;3、early stopping

具体的超参调整见博客。

https://blog.csdn.net/qq_20259459/article/details/70316511?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3

——————————————————————————————————————————————————

总结部分;项目阐述和项目难点

项目阐述

本项目用深度学习算法解决图像去噪问题,算法主题使用卷积神经网络、批量归一化、数据增强技术和残差学习等方法。

首先实现盲高斯去噪和非盲高斯去噪,之后扩展并实现对高斯噪声、椒盐噪声、泊松噪声这三种噪声进行盲去噪。

项目难点

1、前期知识储备,学深度学习的基础知识;看神经网络的书和吴恩达课程,学习tensorflow的使用

2、机器运行速度达不到,没有gpu的使用,本科毕设老师不让用;使用google colab挂载,使用云GPU;刚开始没经验,直接把数据堆上去,计算成本很大,后来了解到降低计算成本的方法,先取少量数据看训练loss是否持续下降到0,从而判断数据和学习率、模型等发挥了效果;

贴Shuffle实现原理

Python里面random.shuffle源码如下:

 1   def shuffle(self, x, random=None, int=int):
 2         """x, random=random.random -> shuffle list x in place; return None.
 3 
 4         Optional arg random is a 0-argument function returning a random
 5         float in [0.0, 1.0); by default, the standard random.random.
 6         """
 7 
 8         if random is None:
 9             random = self.random
10         for i in reversed(xrange(1, len(x))):
11             # pick an element in x[:i+1] with which to exchange x[i]
12             j = int(random() * (i+1))
13             x[i], x[j] = x[j], x[i]

 

  核心的代码就3行,其实就是非常经典的Fisher–Yates shuffle算法的实现,Fisher–Yates shuffle算法伪码如下:

-- To shuffle an array a of n elements (indices 0..n-1):
for i from n−1 downto 1 do
     j ← random integer such that 0 ≤ ji
     exchange a[j] and a[i]

  第一步 即从0到N-1个元素中随机选择一个与第N-1个替换

  第二步 从0到N-2个元素中随机选择一个与第N-2个替换

  第k步 从0到N-k个元素中随机选择一个与第N-K个替换

 

  要证明算法的正确性也很简单,即任何一个元素shuffle之后出现在任意位置的概率都是1/N。任意一个元素,放在第N-1个位置的概率是1/N, 放在pos N-2的位置是 (N-1)/N * 1 / (N-1) = 1/N 。需要注意的是,一个元素一旦被交换到了序列的尾部,那么就不会再被选中,这也是算法一目了然的原因。

Shuffle是一种训练的技巧,因为机器学习其假设和对数据的要求就是要满足独立同分布。

作用:Shuffle可以防止训练过程中的模型抖动,有利于模型的健壮性;

Shuffle可以防止过拟合,并且使得模型学到更加正确的特征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值