归一化

[转载] ReLU和BN层简析

眉间皱痕 提交于 2019-12-05 20:45:55
[转载] ReLU和BN层简析 来源: https://blog.csdn.net/huang_nansen/article/details/86619108 卷积神经网络中,若不采用非线性激活,会导致神经网络只能拟合线性可分的数据,因此通常会在卷积操作后,添加非线性激活单元,其中包括logistic-sigmoid、tanh-sigmoid、ReLU等。 sigmoid激活函数应用于深度神经网络中,存在一定的局限性,当数据落在左右饱和区间时,会导致导数接近0,在卷积神经网络反向传播中,每层都需要乘上激活函数的导数,由于导数太小,这样经过几次传播后,靠前的网络层中的权重很难得到很好的更新,这就是常见的梯度消失问题。这也是ReLU被使用于深度神经网络中的一个重要原因。 Dead ReLU 若数据落在负区间中,ReLU的结果为0,导数也是0,就会导致反向传播无法将误差传递到这个神经元上,这会导致该神经元永远不会被激活,导致Dead ReLU问题。 解决方法: 1)Leraning Rate 导致Dead ReLU问题的其中一个潜在因素为Learning Rate太大,假设在某次更新中,误差非常大,这时候若LR也很大,会导致权重参数更新后,神经元的数据变化剧烈,若该层中多数神经元的输出向负区间偏向很大,导致了大部分权重无法更新,会陷入Dead ReLU问题中。 当然,小learning

keras学习笔记(三)

我是研究僧i 提交于 2019-12-05 10:36:46
数据归一化 通过上次对cifar10数据集分类的任务,我的分类精度在0.79,但是当我对输入的数据做了归一化后,精度达到了0.99,实现的语句如下: X_train = X_train.astype('float32')/255 X_test = X_test.astype('float32')/255 Y_train =Y_train.reshape(Y_train.shape[0])/10 Y_test = Y_test.reshape(Y_test.shape[0])/10 对输入进行归一化处理。对标签也进行归一化处理。是数据预处理的一种常见的手段。 数据归一化与标准化存在一定区别,归一化是数据标准化的一种典型做法,即将数据统一映射到[0,1]区间上. 数据的标准化是指将数据按照比例缩放,使之落入一个特定的区间. 归一化最明显的在神经网络中的影响有如下几个方面: 1.有利于初始化的进行 2.避免给梯度数值的更新带来数字的问题 3.有利于学习率的调整 4.加快寻找最优解的速度 上篇博客说了上面那段是自己写的,下面那段是网上别人写的。我自己写的进行了标准化前是0.79的精度,标准化后是0.99的精度,很显然看出数据标准化对精度是有一定影响的。但是后面的那段我并没有看到有数据归一化,结果仍然能达到0.99.暂时还不清楚原因。可能是我选用了不同的损失函数的原因吧,可以自己进行更改验证

pytorch实践(改造属于自己的resnet网络结构并训练二分类网络)

无人久伴 提交于 2019-12-05 07:24:58
在学习pytorch过程中,突然想拥有属于自己的网络结构,于是便自己选择了一个比较简单的resnet18进行改造,并用其对蚂蚁和蜜蜂进行分类,比较一下没有经过预训练的resnet18好还是自己改造的resnet_diy好。 在开始撸代码之前,为了方便大家自己设计网络,我把resnet的pytorch实现详细的解读一遍。 ResNet ResNet 解决了 deep NN 的两大问题:1. deep NN 的梯度弥散和爆炸问题;2. deep NN 的精度随着模型的加深,会逐渐饱和不再上升,甚至会大幅度下降。其算法原理简单的说,就是通过shorcut将远端的output与近端的output相连接,即H(x)=F(x)+x,以此来解决这两大问题。这个过程并没有严格的数学证明,大概因为shortcut可以很好的bp,详细了解请戳 这里 。 网络结构如上图所示,resnet有很多变形18/34/50/152。其中 ResNet 18/34 采用 Basic Block 作为基本单元,而 ResNet 50/101/152 则采用 Bottlenet Block 作为基本单元。 BasicBlock和Bottleneck Basic Block就是左边的图,包括两个3×3的卷积操作。bollteneck是右边的图,为了减少参数,它采用了两个1×1的卷积。 Resnet18 ResNet 18

torch_12_BigGAN全文解读

混江龙づ霸主 提交于 2019-12-05 04:06:48
1.摘要: 尽管近来生成图片模型取得了进步,成功生成了高分辨率的图片,但是在复杂的数据集中,样本的多样性仍然是难以捉摸的目标。本文尝试在大规模上训练生成对抗网络,并研究这种规模下的不稳定性。我们发现将正交正则化应用于生成器使其能够适应简单的‘截断处理,允许通过减少生成器输入的方差来精细的控制样本保真度和变化之间的权衡。 2.三个贡献: 1.增大GAN的规模能显著提升建模的效果,模型的参数比之前增大2-4倍,训练的batch尺寸增加了8倍。文章提出了两种简单而又具有一般性的框架改进,可以提高模型的收缩性,并且改进了一种正则化策略来提升条件作用,证明了这些方法能够提升性能。 2.作为这些策略的副产品,本文提出的模型变得更服从截断技巧。截断技巧是一种简单的采样方法,能够在样本的逼真性,多样性之间做显式的,细粒度的控制。 3.发现了使大规模GAN不稳定的原因,对它们进行了经验性的分析,更进一步的,作者发现将已有的和新的技巧的组合使用能够降低这种不稳定性,但是完全的训练只有在巨大的性能代价下才能获得 3.背景 生成对抗网络由一个生成器和一个判别器组成,前者的作用是根据随机噪声数据生成逼真的随机样本,后者的作用是鉴别样本是真实的还是生成器生成的。在最早的版本中,GAN训练时的优化目标为达到极大值-极小值问题的纳什平衡。当用于图像分类任务时,G和D一般都是卷积神经网络

吴恩达《深度学习》第二门课(3)超参数调试、Batch正则化和程序框架

微笑、不失礼 提交于 2019-12-05 00:39:33
3.1调试处理 (1)不同超参数调试的优先级是不一样的,如下图中的一些超参数,首先最重要的应该是学习率α(红色圈出),然后是Momentum算法的β、隐藏层单元数、mini-batch size(黄色圈出)、再之后是Layer、learning rate decay(紫色圈出)、最后是Adam算法中的β 1 、β 2 、ε。 (2)用随机取值代替网格点取值。下图左边是网格点取值,如果二维参数中,一个参数调试的影响特别小,那么虽然取了25个点,其实只相当于取了5个不同的点;而右图中随机取值取了多少个点就代表有多少不同值的点。 (3)由粗糙到精细的取值,先粗糙取值,然后发现最好的点,再在这个点附近进行精细的取值。如下图所示 3.2为超参数选择合适的范围 (1)随机取值并不是在取值范围内随机均匀取值,而是要选择合适的标尺来随机取值。 (2)案例1:在选择网络层数时,其范围是[2,4],那么直接均匀取值2,3,4都是合理的。 (3)案例2:如果在给学习率取值时,其范围是[0.0001,1],如果均匀取值,将会有90%的点落在0.1到1之间,这时不合理的;此时应该用对数坐标0.0001=10 -4 ,1=10 0 ,所以应该是在[-4,0]上随机均匀取值作为r,然后10 r 作为学习率α。如下图所示 (4)指数加权平均的超参数β取值范围是[0.9,0.999],其方法是:1-β=[0.1,0

【机器学习】机器学习入门03 - 数据归一化

我是研究僧i 提交于 2019-12-04 20:39:08
1. 数据归一化 1.1 医疗事故? ——之前的kNN算法哪里出了问题? 在之前讲kNN算法时我们举过的肿瘤的例子中,有一个问题,也许很多读者没有考虑过。 回顾一下,kNN算法的第一步是求最为邻近的k个点,也就是要先求每个数据点与待预测的数据点的距离。我们仍然以p=2的明可夫斯基距离(欧拉距离)为例。肿瘤的实例中,数据点的两个坐标值是发现时间和肿瘤大小,我们所要求的其实就是这样一个表达式的值并进行大小比较。 为了后续表达简单,我们将上式简写如下: 好了,新的病人来了,做个检查吧。 哔~~~ 肿瘤直径:140mm 发现时间:0.8年 嗯,是时候检验一下我们kNN算法的功力了。简单点,我们假设原本的数据点只有2个,k=1。来看一下原本的两个数据点: 肿瘤1 肿瘤直径:150mm 发现时间:1年 肿瘤2 肿瘤直径:139mm 发现时间:5年 好吧,你聪明的,告诉我,你选1还是选2? 虽然我不懂医学,数据也都是我编的,我也不知道这样的直径和时间是否合理。但是,同样不懂医学的你,我相信和我一样,肯定选1嘛。 肿瘤1和这个新肿瘤差了两个多月,长大了10个毫米,讲道理应该已经十分相似咯。肿瘤2多长了4个年头还不如这新肿瘤大,肯定不能选嘛。 好吧,姑且认为你和我达成了共识,anyway,我们亲手打造的kNN算法不这么觉得。 算距离嘛,我们也会。我们来看看kNN算法会发生什么。 纳尼?D 2 更近?

线性回归

房东的猫 提交于 2019-12-04 16:21:31
  说到回归一般都指线性回归,回归的目的是预测数值型的目标值。线性回归模型的优点在于结果易于理解,计算简单,缺点在于对非线性的数据拟合不好。 原理   线性回归就是对输入特征加权求和,在加上偏置项进行预测。公式如下所示: $$ widehat{h}=theta_{0}+theta_{1}x_{1}+theta_{2}x_{2}+…+theta_{n}x_{n} tag{1} $$ 其中,$widehat{h}$代表预测值,$n$是特征的个数,${x_i}$代表第i个特征值,$theta_{i}$ 代表第i个特征的权重,将上式向量化有 $$ widehat{h}=h_{theta}(X)=Xtheta tag{2} $$ 其中$theta$是模型的参数向量,X是实例的特征向量,$h_{theta}$是使用模型参数$theta$做参数的假设函数。 * 注:这里为什么写成$Xtheta$的形式,而不是$theta X$呢?在实际使用中,实例的特征是行向量,由多个实例构成输入矩阵,而权重是列向量,其具体形式如下 $$ Xtheta= begin{bmatrix} x_0^1 & x_0^2 & … &x_0^n \ x_1^1 & x_1^2 & … &x_1^n \ … & … & … &… \ x_m^1 & x_m^1 & … &x_m^1 end{bmatrix} begin

吴恩达《深度学习》第二门课(1)深度学习的实用层面

狂风中的少年 提交于 2019-12-04 13:47:18
1.1训练,验证,测试集(Train/Dev/Test sets) (1)深度学习是一个按照下图进行循环的快速迭代的过程,往往需要多次才能为应用程序找到一个称心的神经网络。 (2)在机器学习中,通常将样本分成训练集,验证集和测试集三部分,数据规模相对较小,适合传统的划分比例(如6:2:2),数据集规模比较大的,验证集和测试集要小于数据总量的20%或者10%甚至更低。 (3)交叉验证集和测试集务必来自同分布。 (4)有时候只有训练集和验证集,没有独立的测试集(将无法提供无偏性能评估),这时人们也会把验证集称为测试集。 1.2偏差,方差(Bias/Varicance) (1)以下三个图分别表示欠拟合(高偏差),适度拟合,过拟合(高方差): (2)最优误差也称为贝叶斯误差,本节中假设最有误差为零(如在图像分类中人可以辨别出所有图像的类别)。 (3)训练误差减去左右误差为偏差,结果大说明偏差大;验证集误差减去训练误差为方差,结果大说明偏差大。 (4)是存在高偏差高方差的情况的,如下图,直线导致高偏差,局部过拟合导致高方差: 1.3机器学习基础 (1)偏差和方差是两种完全不同的情况,有分别对应的处理方法,不要盲目的使用一些策略。 (2)在深度学习时代,只要正则适度,通常构建一个更大的网络便可以在不影响方差的同时减少偏差,而采用更多数据通常可以在不过多影响偏差的同时减少方差。 1.4正则化

BN和Relu

一世执手 提交于 2019-12-04 04:32:41
Batch normalization + ReLU 批归一化(BN)可以抑制梯度爆炸/消失并加快训练速度 原论文认为批归一化的原理是:通过归一化操作使网络的每层特征的分布尽可能的稳定,从而减少Internal Covariate Shift relu是目前应用最为广泛的激活函数, 由于其梯度要么是1,要么是0,可以有效抑制梯度爆炸/消失 通过BN和ReLU,目前的网络已经可以达到非常深 网络越深,提取的特征往往越抽象,越具有语义信息 。过渡抽象的特征可能并不适合相对简单的任务。 来源: https://www.cnblogs.com/yibeimingyue/p/11831360.html

03_数据的特征预处理

▼魔方 西西 提交于 2019-12-04 01:59:48
03 数据特征预处理 特征的预处理 特征的预处理 定义:通过特定的统计方法(数学方法),将数据转换成算法要求的数据。 数值型数据:标准缩放 归一化 标准化 类别性数据: one-hot编码 时间类型: 时间的切分 归一化 定义: 通过对原始数据的变化把数据映射到 [0,1] 之间 优点 :多个特征时,某一个特征对最终结果不会造成更大的影响 (同一个维度) 缺点 :容易受到极大值和极小值的影响 标准化 定义: 将原始数据变换为 均值为0 , 标准差为1 的范围内 如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。 from sklearn.preprocessing import MinMaxScaler, StandardScaler def mm(): """ 归一化预处理 :return:None """ mm = MinMaxScaler() data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]) print(data) def stand(): """ 标准化预处理 :return: None """ st = StandardScaler() data = st.fit