• 学习bn算法


    好处:

    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[1] #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倍,

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

  • 相关阅读:
    [LeetCode] 336. Palindrome Pairs
    [LeetCode] 214. Shortest Palindrome
    [LeetCode] 844. Backspace String Compare
    [LeetCode] 5. Longest Palindromic Substring
    [LeetCode] 269. Alien Dictionary
    [LeetCode] 200. Number of Islands
    [LeetCode] 72. Edit Distance
    [LeetCode] 460. LFU Cache
    [LeetCode] 1229. Meeting Scheduler
    [LeetCode] 22. Generate Parentheses
  • 原文地址:https://www.cnblogs.com/zhangbo2008/p/8455217.html
Copyright © 2020-2023  润新知