好处:

1.归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;

2.另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。

原因:

我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal  Covariate Shift”。Paper所提出的算法,就是要解决在训练过程中,中间层数据分布发生改变的情况,于是就有了Batch  Normalization,这个牛逼算法的诞生。

首先学习一下白化这个预处理方法:

举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性;更正式的说,我们希望通过白化过程使得学习算法的输入具有如下性质:(i)特征之间相关性较低;(ii)所有特征具有相同的方差。

1.首先复习pca的本质:

本质就是1.先算n个特征数据集的协方差矩阵.2.然后找协方差矩阵从大到小最大的k个方向,k<n.3.把数据在这k个分量上做投影,就得到了更小维度的数据,也尽量保持了数据.

其实这些方向也就是矩阵的奇异值对应的奇异向量.也就是主方向.

2.第一种白化pca白化:1.先做pca  2.把得到的数据再让各个主方向的方差都是1即可.

def zca_whitening(inputs):
sigma = np.dot(inputs, inputs.T)/inputs.shape[] #inputs是经过归一化处理的,所以这边就相当于计算协方差矩阵
U,S,V = np.linalg.svd(sigma) #奇异分解
epsilon = 0.1 #白化的时候,防止除数为0
ZCAMatrix = np.dot(np.dot(U, np.diag(1.0/np.sqrt(np.diag(S) + epsilon))), U.T) #计算zca白化矩阵
return np.dot(ZCAMatrix, inputs) #白化变换

别人的代码.我感觉这写的根本不对啊.我试了input是2*3的矩阵输出一个1*3的矩阵.这尼玛sample_size都给我变了.搞毛.我再查查.感觉第一步sigma就不用求.

inputs就是一个大矩阵.

比如我做的汽车问题inputs=2万*30         sample_size*feature_size,这上面代码不对,根本跑不了.我已经需改好,放到博客里面了.

下面跳过白化.继续讨论bn算法.

随机梯度下降就是用batch的bp算法.虽然看了很多次,也会很多次,但是老忘记这个名字对应的含义,总感觉这个名字起的操蛋.为什么不用小批量bp算法来起名字!

这就是bn算法的核心了,加入一个放射变换,用这变化来归一化这一层的数据.

思路也不难,1.这个bn层,先做归一化,然后你归一化之后会破坏这个数据的分布,导致学习效果很差.

2.做一个放射变换把归一化之后的东西再放射一下来恢复这个数据进入这个bn层的输入状态.这样通过归一化和放射变化就组合出了bn层.

import numpy as np
X=np.array([[1,2,3],[2,3,4]])
gamma=1
beta=0
epsilon=0.01
m = np.mean(X, axis=-1, keepdims=True)#计算均值
std = np.std(X, axis=-1, keepdims=True)#计算标准差
X_normed = (X - m) / (std + epsilon)#归一化
out = gamma * X_normed + beta#重构变换
print (out)
print (np.std(out))
print (np.mean(out))

效果还行.听说效果能提高10倍,

行了,去汽车里面试试去了

学习bn算法的更多相关文章

  1. 转——深度学习之BN算法(Batch Normailization)

    Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce 一.背景意义 ...

  2. BN算法

    批量归一化(BN: Batch Normalization) 1 BN训练 1)随机梯度下降法(SGD)对于训练深度网络简单高效,但是它有个毛病,就是需要我们人为的去选择参数,比如学习率.参数初始化. ...

  3. [置顶] 小白学习KM算法详细总结--附上模板题hdu2255

    KM算法是基于匈牙利算法求最大或最小权值的完备匹配 关于KM不知道看了多久,每次都不能完全理解,今天花了很久的时间做个总结,归纳以及结合别人的总结给出自己的理解,希望自己以后来看能一目了然,也希望对刚 ...

  4. 学习cordic算法所得(流水线结构、Verilog标准)

    最近学习cordic算法,并利用FPGA实现,在整个学习过程中,对cordic算法原理.FPGA中流水线设计.Verilog标准有了更加深刻的理解. 首先,cordic算法的基本思想是通过一系列固定的 ...

  5. 学习排序算法(一):单文档方法 Pointwise

    学习排序算法(一):单文档方法 Pointwise 1. 基本思想 这样的方法主要是将搜索结果的文档变为特征向量,然后将排序问题转化成了机器学习中的常规的分类问题,并且是个多类分类问题. 2. 方法流 ...

  6. 从 SGD 到 Adam —— 深度学习优化算法概览(一) 重点

    https://zhuanlan.zhihu.com/p/32626442 骆梁宸 paper插画师:poster设计师:oral slides制作人 445 人赞同了该文章 楔子 前些日在写计算数学 ...

  7. 吴裕雄 python 机器学习——集成学习AdaBoost算法回归模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...

  8. 吴裕雄 python 机器学习——集成学习AdaBoost算法分类模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...

  9. TF之BN:BN算法对多层中的每层神经网络加快学习QuadraticFunction_InputData+Histogram+BN的Error_curve

    # 23 Batch Normalization import numpy as np import tensorflow as tf import matplotlib.pyplot as plt ...

随机推荐

  1. c#面向对象基础4

    一.namespace 命名空间 作用:解决不同类重名的问题  我们可以认为类是属于命名空间的 当我们需要再一个类中与另一个类建立关系时,通过命名空间来区别不同的类.所以需要我们这样做:导入命名空间 ...

  2. sbt的安装测试

    1.下载 wget https://github.com/sbt/sbt/releases/download/v0.13.15/sbt-0.13.15.tgz 2.安装 tar -zxvf sbt-0 ...

  3. Ubuntu jdk 8 与 6 切换 (安装与配置)

    Switch To Oracle JDK8 Switch To Oracle JDK8 1.1 Switch Oracle JDK in the Unbuntu 14.04 Step1 : Downl ...

  4. UI5-文档-3-Hello World!

    通过本教程,您将了解如何在单个HTML页面上通过几个步骤创建一个简单的第一个应用程序. 我们创建了一个带有两个页面和导航按钮的应用程序来在页面之间导航. 预览 Simple "Hello W ...

  5. Java多线程之使用ATM与柜台对同一账户取钱

    钱数要设置成静态的变量,两种取钱方式操作的是同一个银行账户! 废话不多说,直接上代码.注释写的都很详细!!! package com.thread.multi2; public class Bank ...

  6. spring coud feign

    1. 依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>sprin ...

  7. 关于U3D场景烘焙的一个想法

    U3D进行场景烘焙时,发现阴影无法选择烘焙质量,其实想一下也合理,毕竟是烘焙,是将光照与阴影信息保存到lightmap中,因此阴影的质量取决于光照贴图的精度, 就算光照贴图再大,也远不可能达到实时光照 ...

  8. 管道限流利器pv

    pv 是什么 可不是 page view,是pipe viewer,管道偷窥器的缩写.这个东西的源站点在google code上,需要的话可以访问pv 的官网 . 这个东西的官方手册页(man pv或 ...

  9. Haskell语言学习笔记(47)Arrow(2)

    Function, Monad, Arrow f :: Int -> (Int, Int) f = \x -> let y = 2 * x z1 = y + 3 z2 = y - 5 in ...

  10. "\\s+"的使用

    详解 "\\s+" 正则表达式中\s匹配任何空白字符,包括空格.制表符.换页符等等, 等价于[ \f\n\r\t\v] \f -> 匹配一个换页 \n -> 匹配一个换 ...