2017-10-09 14:35:14 seasermy 阅读数 7918
  • 人工智能深度学习卷积神经网络入门

    "java大数据人工智能培训学校全套教材"系列课程由1000集视频构成,基本就 是1)时下流行的java培训学校主流内部教材,2)和市面上培训学校的通 行的课程体系几乎一样。所以这套课程都能自己学下来,等于上了培训学校一次,完全可以找个java工程师的工作了。   通过学习卷积神经网络概述,为什么引入神经网络来做识别,判断,预测,训练模型,激活函数,sigmoid激活函数,导数和切线,sigmoid激活函数如何求导, 链式法则,梯度,梯度下降法与delta法则,BP(back propagation)误差逆传播神经网络,卷积到底有什么作用?如何做到特征提取,池化的名字由来, dropout,Anaconda Prompt的用法,Jupyter notebook的用法,Spyder的用法, 建立安装Tensorflow所需的Anaconda虚拟环境,如何在Anaconda虚拟环境安装Tensorflow与Keras 概念等让大家对人工智能,卷积神经网络快速入门。 课程特色:专业细致,偏案例,理论强。 课程软件使用:Anaconda,Spyder,Jupyter notebook 重要声明: 1) 如果感觉噪音大,可以选择不用耳机,加音箱或用电脑原声  2) 既然我们的名字叫人工智能深度学习卷积神经网络入门 ,这个课程的特点就在于成本最低的, 让你最快速的,最容易的入门。人工智能深度学习卷积神经网络入门 的最大的难点在于入门入不了,从而最终放弃。俗话说师傅领进门,修行在个人。只要入了门了,后面的事都好办。选课前,务必注意本章的学习目标和内容。想学更多,注意后边的课程。

    104 人正在学习 去看看 马克
训练集噪声对于深度学习的影响


总所周知,在深度学习的训练中,样本的质量和数量都是非常重要的一环。然后在实际的生产过程中,样本的数量往往可以通过一些手段得到满足,但是质量却非常依赖人工的标注,因此往往在训练中会包含一定数量的标注不正确的数据。一般认为这样的一些数据,会对于最终的结果造成负面影响,但是具体怎样影响训练和最终的模型推广效果我们来做一个小实验。

实验设置

使用工具 :MXNET

数据集:MNIST

训练集大小:60000

测试集大小:10000

分类类别数目:10 类

实验流程:

训练时,将训练集中的一定比例的样本重新赋一个标签值,标签为[0,9]中的一个随机数,来模拟训练集中的脏数据,

训练超参数:

MXNET默认:初始化学习率:0.05, 在第10个ephos时候降为0.005,20个epochs 停止迭代。优化方法SGD,使用的模型为经典的LeNet。

实验结果:

训练集上的准确率:


验证集上的准确率:


实验结果分析:

较大学习率下训练时,可以明显发现随着脏数据的增加,训练集中的准确率降低与脏数据的比例成正相关,且脏数据的比例越大训练集中的准确率波动也就越大,这些都是符合一般的预期的,即随着不靠谱的样本的增加,训练的难度加大,本身的准确率也没办法继续提高,且波动也会教导。

但是我们很惊奇的发现,在验证集上较大学习率的情况下,甚至在脏数据占比达到骇人听闻的20%的情况下,在一开始的几个epoch上,准确率都没有断崖式的下降,但是随着迭代的轮数的增加,当比例大于2% 都会出现断崖式的下降。从这个现象我们可以发现,神经网络的学习能力以及推广能力还是非常强悍的,在开始的时候学习到的都是杂乱数据中的有效特征,但是随着迭代轮数的增加,样本里面一些不正确的信息还是会添加到模型中来, 导致推广能力的下降,即过拟合了。

当学习率降低十分之一后,在训练集中,大比例脏数据的模型在训练集上的准确率都得到了明显的提高,证明当学习率下降后,模型的学习能力得到了提高,会强行学习一些并不一定正确的样本中的信息,并得到新的区分样本类别的方法,而且从图上可以发现,随着迭代轮数的增加,准确率会不断的提高,说明学习率较小的情况下,脏数据也是会被模型不断的学习到的。

当学习率较小时,验证集上面的结果要比大学习率的情况下变得稳定许多,甚至在脏数据比例高达10%的情况下依旧保持了96%的准确率,并且随着迭代轮数的增加,基本保持稳定。在此再次感慨下深度学习网络的推广能力。但是当脏数据的比例达到20% 以上的时候,我们发现随着学习到的脏数据的不断增加,模型在验证集上的能力也会随之下降,这和我们的直观感觉也是符合的。

总结和结论:

本文讨论了在训练数据集中混有脏数据的情况下,所得模型在训练和测试样本集上的表现情况,发现

  1. 大学习率下,模型会首先学习有效样本中的特征信息,然后再学习到脏数据中的信息,并随着脏数据的增加和迭代次数的增加在验证集上,识别率出现断崖式的下降
  2. 调小学习率的情况下,模型的学习会变得稳定许多且受到脏数据的影响明显减少,也不容易出现断崖式的下降,但是随着脏数据的比例不断的扩大,模型学习到的脏数据的信息也会对于模型的推广能力造成不可忽视的影响。
  3. 因此在带有脏数据的数据集上学习,建议使用较小的学习率,同时保证验证集的准确性,当发现训练集识别率不断提高,但是在验证集上反而下降时,此时就可以怀疑时学习到了脏数据的信息,及时停止训练应该也可以得到不错的效果
  4. 最后再次感慨下深度学习变态的推广能力
2018-05-07 22:45:15 hit1524468 阅读数 1343
  • 人工智能深度学习卷积神经网络入门

    "java大数据人工智能培训学校全套教材"系列课程由1000集视频构成,基本就 是1)时下流行的java培训学校主流内部教材,2)和市面上培训学校的通 行的课程体系几乎一样。所以这套课程都能自己学下来,等于上了培训学校一次,完全可以找个java工程师的工作了。   通过学习卷积神经网络概述,为什么引入神经网络来做识别,判断,预测,训练模型,激活函数,sigmoid激活函数,导数和切线,sigmoid激活函数如何求导, 链式法则,梯度,梯度下降法与delta法则,BP(back propagation)误差逆传播神经网络,卷积到底有什么作用?如何做到特征提取,池化的名字由来, dropout,Anaconda Prompt的用法,Jupyter notebook的用法,Spyder的用法, 建立安装Tensorflow所需的Anaconda虚拟环境,如何在Anaconda虚拟环境安装Tensorflow与Keras 概念等让大家对人工智能,卷积神经网络快速入门。 课程特色:专业细致,偏案例,理论强。 课程软件使用:Anaconda,Spyder,Jupyter notebook 重要声明: 1) 如果感觉噪音大,可以选择不用耳机,加音箱或用电脑原声  2) 既然我们的名字叫人工智能深度学习卷积神经网络入门 ,这个课程的特点就在于成本最低的, 让你最快速的,最容易的入门。人工智能深度学习卷积神经网络入门 的最大的难点在于入门入不了,从而最终放弃。俗话说师傅领进门,修行在个人。只要入了门了,后面的事都好办。选课前,务必注意本章的学习目标和内容。想学更多,注意后边的课程。

    104 人正在学习 去看看 马克

1. 模型简介

为了提高自编码器的泛化性能和鲁棒性,在输入的数据中,我们加入高斯白噪声,通过深度网络进行学习,以获取“无噪声”情况下的输出数据——有一点向去除噪声,实际上,最开始通过堆叠的自动编码器实现噪声去除。

2. 模型实现

(注意:模型和AE的区别就是,输入网络的数据是加噪声的数据,代价函数却采用的是无噪声数据进行计算)

# whilt gaussian noise Auto-Encoder 
#
# Author: HSW
# Date: 2018-05-07
#

import tensorflow as tf
import numpy      as np

def axvier_init(fan_in, fan_out, constant = 1):
    ''' Initial weights '''
    low   = -constant + np.sqrt(6.0 / (fan_in + fan_out))
    high =  constant + np.sqrt(6.0 / (fan_in + fan_out))

    return tf.random_uniform((fan_in, fan_out), minval = low, maxval = high, dtype = tf.float32)


class NoiseAutoEncoder(object):

    def __init__(self, AutoEncoder_Shape = (128, 256, 128), transfer_function = tf.nn.softplus, optimizer = tf.train.AdamOptimizer(), sigma = 0.1):
        ''' Constructor Funcion '''
        self.sigma             = sigma 
        self.LayerCnt          = len(AutoEncoder_Shape)
        self.AutoEncoder_Shape = AutoEncoder_Shape
        self.transfer          = transfer_function        
        self.weights           = self.init_weights()
        self.layers            = self.init_layers()
        self.total_loss        = self.init_loss()
        self.optimizer         = optimizer.minimize(self.total_loss)
        init                   = tf.global_variables_initializer()
        self.sess              = tf.Session()
        self.sess.run(init) 
        


    def init_weights(self):
        ''' AutoEncoder Weights ''' 
        all_weights = dict()
        for iter in range(self.LayerCnt - 1):
            weightName              = "weight" + str(iter + 1)
            biasName                = "bias"   + str(iter + 1)
            if iter == self.LayerCnt - 2: 
                all_weights[weightName] = tf.Variable(axvier_init(self.AutoEncoder_Shape[iter], self.AutoEncoder_Shape[iter + 1]))
                all_weights[biasName]   = tf.Variable(tf.zeros([self.AutoEncoder_Shape[iter + 1]]))
            else:
                all_weights[weightName] = tf.Variable(tf.zeros([self.AutoEncoder_Shape[iter], self.AutoEncoder_Shape[iter + 1]]))
                all_weights[biasName]   = tf.Variable(tf.zeros([self.AutoEncoder_Shape[iter + 1]]))

        return all_weights

    def init_layers(self):
        ''' AutoEncoder: Input Layer + Hidden Layer + Output Layer ''' 
        all_layers = dict()
        all_layers['inputs'] = tf.placeholder(tf.float32, [None, self.AutoEncoder_Shape[0]])
        # gaussian noise layers 
        all_layers['noise_inputs'] = all_layers['inputs'] + self.sigma * tf.random_normal((self.AutoEncoder_Shape[0], ), mean = 0, stddev=1.0, dtype=tf.float32)
        
        for iter in range(self.LayerCnt - 1):
            if iter == 0:
                # inputs noise Layer => 1th Hidden Layer
                preLayerName          = 'noise_inputs'
                layerName             = 'hidden' + str(iter + 1)
                weightName            = 'weight' + str(iter + 1)
                biasName              = 'bias'   + str(iter + 1) 
                all_layers[layerName] = self.transfer(tf.add(tf.matmul(all_layers[preLayerName], self.weights[weightName]), self.weights[biasName]))
            elif iter == self.LayerCnt - 2:
                # Last Hidden Layer => outputs Layer
                preLayerName          = 'hidden' + str(iter) 
                layerName             = 'outputs'
                weightName            = 'weight' + str(iter + 1)
                biasName              = 'bias'   + str(iter + 1)
                all_layers[layerName] = tf.add(tf.matmul(all_layers[preLayerName], self.weights[weightName]), self.weights[biasName])
            else:
                # pre-Hidden Layer => cur-Hidden Layer
                preLayerName          = 'hidden' + str(iter)
                layerName             = 'hidden' + str(iter + 1)
                weightNmae            = 'weight' + str(iter + 1)
                biasName              = 'bias'   + str(iter + 1)
                all_layers[layerName] = self.transfer(tf.add(tf.matmul(all_layers[preLayerName], self.weights[weightName]), self.weights[biasName]))

        return all_layers 
                
                
    def init_loss(self):
        ''' AutoEncoder Loss '''
        return 0.5 * tf.reduce_sum(tf.pow(tf.subtract(self.layers['outputs'], self.layers['inputs']), 2))

    def partial_fit(self, inputs):
        ''' For train '''
        cost, opt = self.sess.run((self.total_loss, self.optimizer), feed_dict={self.layers['inputs']: inputs})

        return cost

    def calc_total_cost(self, inputs):
        ''' For evalution '''
        
        return self.sess.run(self.total_loss, feed_dict={self.inputs: inputs})

      

    def transform(self, inputs, layerNum):
        ''' inputs => Encode Feature '''
        hiddenName = 'hidden' + str(layerNum)
        
        return self.sess.run(self.layers[hiddenName], feed_dict={self.layers['inputs']: inputs})

    def generate(self, hidden = None, layerNum = 1):
        ''' Encode Feature => outputs '''
        hiddenName = 'hidden' + str(layerNum)

        return self.sess.run(self.layers['outputs'], feed_dict={self.layers[hiddenName]: hidden})

    def reconstruct(self, inputs):
        ''' inputs => outputs '''

        return self.sess.run(self.layers['outputs'], feed_dict={self.layers['inputs']: inputs})

    def getWeigths(self, layerNum):
        ''' weight of layerNum-th layer '''
        weightName = 'weight' + str(layerNum)
        
        return self.sess.run(self.weights[weightName])

    def getBiases(self, layerNum):
        ''' bias of layerNum-th layer '''
        biasName = 'bias' + str(layerNum)

        return self.sess.run(self.weights[biasName]) 
        
    
if __name__ == "__main__":

    noiseAutoEncoder = NoiseAutoEncoder();

    print(noiseAutoEncoder.layers)
    print(noiseAutoEncoder.weights['weight1'])
    print(noiseAutoEncoder.weights['bias1'])
    print(autoEncoder.weights['weight2'])
    print(autoEncoder.weights['bias2'])

3. 模型测试


2017-09-11 09:29:34 antkillerfarm 阅读数 884
  • 人工智能深度学习卷积神经网络入门

    "java大数据人工智能培训学校全套教材"系列课程由1000集视频构成,基本就 是1)时下流行的java培训学校主流内部教材,2)和市面上培训学校的通 行的课程体系几乎一样。所以这套课程都能自己学下来,等于上了培训学校一次,完全可以找个java工程师的工作了。   通过学习卷积神经网络概述,为什么引入神经网络来做识别,判断,预测,训练模型,激活函数,sigmoid激活函数,导数和切线,sigmoid激活函数如何求导, 链式法则,梯度,梯度下降法与delta法则,BP(back propagation)误差逆传播神经网络,卷积到底有什么作用?如何做到特征提取,池化的名字由来, dropout,Anaconda Prompt的用法,Jupyter notebook的用法,Spyder的用法, 建立安装Tensorflow所需的Anaconda虚拟环境,如何在Anaconda虚拟环境安装Tensorflow与Keras 概念等让大家对人工智能,卷积神经网络快速入门。 课程特色:专业细致,偏案例,理论强。 课程软件使用:Anaconda,Spyder,Jupyter notebook 重要声明: 1) 如果感觉噪音大,可以选择不用耳机,加音箱或用电脑原声  2) 既然我们的名字叫人工智能深度学习卷积神经网络入门 ,这个课程的特点就在于成本最低的, 让你最快速的,最容易的入门。人工智能深度学习卷积神经网络入门 的最大的难点在于入门入不了,从而最终放弃。俗话说师傅领进门,修行在个人。只要入了门了,后面的事都好办。选课前,务必注意本章的学习目标和内容。想学更多,注意后边的课程。

    104 人正在学习 去看看 马克

https://antkillerfarm.github.io/

GAN(续)

基本原理

上面的解释虽然通俗,却并未涉及算法的实现。要实现上述原理,至少要解决三个问题:

1.什么是伪造者。

2.什么是鉴别者。

3.如何对抗。

以下文章的组织顺序,主要参考下文:

http://kexue.fm/archives/4439/

互怼的艺术:从零直达WGAN-GP

老规矩,摘要+点评。

伪造者

伪造者在这里实际上是一种Generative算法。伪造的内容是:将随机噪声映射为我们所希望的正样本

随机噪声我们一般定义为均匀分布,于是上面的问题可以转化为:如何将均匀分布X映射为正样本分布Y

首先,我们思考一个简单的问题:如何将U[0,1]映射为N(0,1)

理论上的做法是:将XU[0,1]经过函数Y=f(X)映射之后,就有YN(0,1)了。设ρ(x)U[0,1]是概率密度函数,那么[x,x+dx][y,y+dy]这两个区间的概率应该相等,而根据概率密度定义,ρ(x)不是概率,ρ(x)dx才是概率,因此有:

ρ(x)dx=12πexp(y22)dy

即:

x0ρ(t)dt=y12πexp(t22)dt=Φ(y)

其中,Φ(y)是标准正态分布的累积分布函数,所以

y=Φ1(x0ρ(t)dt)

注意到累积分布函数是无法用初等函数显式表示出来的,更不用说它的逆函数了。说白了,Y=f(X)的f的确是存在的,但很复杂,以上解只是一个记号,该算的还是要用计算机算。

正态分布是常见的、相对简单的分布,但这个映射已经这么复杂了。如果换了任意分布,甚至概率密度函数都不能显式写出来,那么复杂度可想而知~

考虑到我们总可以用一个神经网络来拟合任意函数。这里不妨用一个带有多个参数的神经网络G(X,θ)去拟合f?只要把参数$$\theta$训练好,就可以认为$Y=G(X,\theta)$了。这里的G是Generator*的意思。

正样本分布

如上所述,一般的正样本分布是很难给出概率密度函数的。然而,我们可以换个角度思考问题。

假设有一批服从某个指定分布的数据Z=(z1,z2,,zN),根据概率论的相关定义,我们至少可以使用离散采样的方法,根据Z中的样本分布,来近似求出Z的指定分布。下文如无特殊指出,均以Z中的样本分布来代替Z的指定分布,简称Z的分布

那么接着就有另一个问题:如何评估G(X,θ)生成的样本的分布和Z的分布之间的差异呢?

KL散度

比较两个分布的差异的最常用指标是KL散度。其定义参见《机器学习(八)》。

JS散度

因为KL散度不是对称的,有时候将它对称化,即得到JS散度(Jensen–Shannon divergence):

JS(p1(x),p2(x))=12KL(p1(x)p2(x))+12KL(p2(x)p1(x))

注:Claude Elwood Shannon,1916~2001,美国数学家,信息论之父。密歇根大学双学士+MIT博士。先后供职于贝尔实验室和MIT。

KL散度和JS散度,也是Ian Goodfellow在原始GAN论文中,给出的评价指标。

虽然KL散度和JS散度,在这里起着距离的作用,但它们不是距离,它们不满足距离的三角不等式,因此只能叫“散度”。

神经距离

假设我们可以将实数域分成若干个不相交的区间I1,I2,,IK,那么就可以估算一下给定分布Z的概率分布:

pz(Ii)=1Nj=1N#(zjIi)

其中#(zjIi)表示如果zjIi,那么取值为1,否则为0。

接着我们生成M个均匀随机数x1,x2,,xM(这里不一定要M=N,还是那句话,我们比较的是分布,不是样本本身,因此多一个少一个样本,对分布的估算也差不了多少。),根据Y=G(X,θ)计算对应的y1,y2,,yM,然后根据公式可以计算:

py(Ii)=1Mj=1M(yjIi)

现在有了pz(Ii)py(Ii),那么我们就可以算它们的差距了,比如可以选择JS距离

Loss=JS(py(Ii),pz(Ii))

假如我们只研究单变量概率分布之间的变换,那上述过程完全够了。然而,很多真正有意义的事情都是多元的,比如在MNIST上做实验,想要将随机噪声变换成手写数字图像。要注意MNIST的图像是28*28=784像素的,假如每个像素都是随机的,那么这就是一个784元的概率分布。按照我们前面分区间来计算KL距离或者JS距离,哪怕每个像素只分两个区间,那么就有278410236个区间,这是何其巨大的计算量!

为此,我们用神经网络L定义距离:

L({yi}Mi=1,{zi}Ni=1,Θ)

其中,Θ为神经网络的参数。

对于特定的任务来说,{zi}Ni=1是给定的,并非变量,因此上式可简写成:

L({yi}Mi=1,Θ)

通常,我们采用如下的L实现:

L=1Mi=1MD(yi,Θ)

上式可以简单的理解为:分布之间的距离,等于单个样本的距离的平均

这里的神经网络D(Y,Θ),实际上就是GAN的另一个主角——鉴别者。这里的D是Discriminator的意思。

如何对抗

因为D(Y,Θ)的均值,也就是L,是度量两个分布的差异程度,这就意味着,L要能够将两个分布区分开来,即L越大越好;但是我们最终的目的,是希望通过均匀分布而生成我们指定的分布,所以G(X,θ)则希望两个分布越来越接近,即L越小越好。

形式化的描述就是:

argminGmaxDV(G,D)

具体的做法是:

Step1

随机初始化G(X,θ),固定它,然后生成一批Y,这时候我们要训练D(Y,Θ),既然L代表的是“与指定样本Z的差异”,那么,如果将指定样本Z代入L,结果应该是越小越好,而将Y代入L,结果应该是越大越好,所以

Θ=Θ=argminΘL=argminΘ1Ni=1ND(zi,Θ)argmaxΘL=argmaxΘ1Mi=1MD(yi,Θ)

然而有两个目标并不容易平衡,所以干脆都取同样的样本数B(一个batch),然后一起训练就好:

Θ==argminΘL1argminΘ1Bi=1B[D(zi,Θ)D(yi,Θ)]

Step2

G(X,θ)希望它生成的样本越接近真实样本越好,因此这时候把Θ固定,只训练θ让L越来越小:

θ==argminθL2argminθ1Bi=1B[D(G(xi,θ),Θ)]

2018-09-30 21:38:24 liutianheng654 阅读数 454
  • 人工智能深度学习卷积神经网络入门

    "java大数据人工智能培训学校全套教材"系列课程由1000集视频构成,基本就 是1)时下流行的java培训学校主流内部教材,2)和市面上培训学校的通 行的课程体系几乎一样。所以这套课程都能自己学下来,等于上了培训学校一次,完全可以找个java工程师的工作了。   通过学习卷积神经网络概述,为什么引入神经网络来做识别,判断,预测,训练模型,激活函数,sigmoid激活函数,导数和切线,sigmoid激活函数如何求导, 链式法则,梯度,梯度下降法与delta法则,BP(back propagation)误差逆传播神经网络,卷积到底有什么作用?如何做到特征提取,池化的名字由来, dropout,Anaconda Prompt的用法,Jupyter notebook的用法,Spyder的用法, 建立安装Tensorflow所需的Anaconda虚拟环境,如何在Anaconda虚拟环境安装Tensorflow与Keras 概念等让大家对人工智能,卷积神经网络快速入门。 课程特色:专业细致,偏案例,理论强。 课程软件使用:Anaconda,Spyder,Jupyter notebook 重要声明: 1) 如果感觉噪音大,可以选择不用耳机,加音箱或用电脑原声  2) 既然我们的名字叫人工智能深度学习卷积神经网络入门 ,这个课程的特点就在于成本最低的, 让你最快速的,最容易的入门。人工智能深度学习卷积神经网络入门 的最大的难点在于入门入不了,从而最终放弃。俗话说师傅领进门,修行在个人。只要入了门了,后面的事都好办。选课前,务必注意本章的学习目标和内容。想学更多,注意后边的课程。

    104 人正在学习 去看看 马克

正则化:减少测试误差的策略统称,可能会增加训练误差。

参数范数惩罚

在目标函数后面添加一项参数惩罚项\mho (\theta ),参数越多越复杂,则惩罚越大。

根据对参数的惩罚方式不一样,分为以下几种:

L^{2}正则化:

\mho (\theta ) = \frac{1}{2}\left \| w \right \|_{2}^{2},也被称为岭(Ridge)回归。

书上是上述公式,但是不知道右下角那个2什么意思,好像有问题呀。但实际意义就是权值向量各元素平方和再求平方根。用于防止过拟合。

主要用于权重衰减。原理即通过添加正则项,缩放权重w的分量。

L^{1}正则:

\mho (\theta ) = \left \| x \right \|,也称lasso回归,各权值向量各绝对值之和。用于特征选择产生稀疏模型。

原理不再时缩放w,而是添加一项和w同向的常数,最终使一些不重要的参数推为0。

作为约束的范数惩罚

显式约束和重投影技术。

类似第四章的方式,加上一个约束条件后,转换为求对等问题的方式。

书中说这种方式还不错,但是好像没见人用过呀。。

正则化和欠约束问题

 

数据集增强

增加泛化能力的一个很好的方法就是增大训练的数据量,但是数据量不足的情况下只能通过造假数据了。

数据集增强就是在原有的数据集下进行一些小变换来生成新的数据集。主要应用在图形上的一些变换吧,如旋转平移裁剪。

还有语音识别中加入少量噪声的方式。

噪声鲁棒性

不仅可以对输入增加噪声,还可以对权重增加噪声,让模型正则化;给输出增加噪声,含义就是不相信输出一定时真的,存在一定的错误率,从而让模型正则化更强。

半监督学习

就是充分利用数据吧,没有具体介绍。自己上网查阅资料补上后面。

多任务学习

不同的学习任务共享部分通用的参数。主要意思就是迁移学习吧感觉。

提前终止

early stopping。

在训练的适合同时判断随着是否验证集上效果更好,同时记录当时的训练轮数。因为随着训练的轮数增加,一般验证集的效果时一个U型的,我们期望通过earlystopping取到最优点轮数。取到最优点轮数k后,有两种训练方式:

  • 将验证集加入训练集,参数恢复随机,重新训练k次
  • 保留当前参数,将验证集加入后继续训练,当效果达到原有k轮时停止。

其原理类似L2正则。为什么类似L2原理太复杂,回头再看

参数绑定和参数共享

对参数添加对应关系的约束,如参数a等于参数b,就是参数绑定

强制某些参数一样,就是参数共享。最常见的就是cnn,显著降低参数数量,在不需要增加训练数据的情况下提高网络大小。

稀疏表示

相对于L1对特征值和模型参数的直接稀疏,稀疏表示惩罚神经网络中的激活单元,间接惩罚模型参数。具体方式也没看懂。。

Bagging和其他集成方法

主要有bagging,boosting,ensemble三种

bagging:

有放回的抽取训练样本。导致产生不同的训练样本,而后通过不同的训练样本,训练产生不同的结果,而后多个结果综合得到最终结果的方式。可以将多个弱分类器产生强分类器,如随机森林。

boosting:

在同样的训练机上多次训练,每次可以采用不同的算法,每次运算时,样本根据上次运算的结果,赋予不同的权重,错分的赋予更高的权重,而后进行训练,最终将多个结果综合,代表性的有xgboost,gbdt

blending:

用不相交的数据集训练,最后取平均。

stacking:

将样本分为不相交的部分,通过一部分训练得到若干学习器,在另一部分测试所得学习器。将预测结果作为输入,真实结果作为输出,训练更高级学习器。不是很理解,找个具体的算法研究后面。

Dropout

训练时随机让网络中的部分节点失活,防止过拟合。最终使用的时候全部正常。原理类似bagging

貌似这个方式和batch normalize不能同时使用。

对抗训练

在有对抗扰动的训练集样本上训练网络。

因为神经网络主要是基于线性模块构建的,多个输入的线性函数,输出容易非常迅速的改变,如每个参数增加x,则总共增加w*x之多,所以局部敏感。容易被欺骗。

感觉目前主要的应用就是生成对抗网络(GAN),后面会专门写相关介绍,还是很厉害的网络。

切面距离、正切传播和流形正切分类器

流形学习中用到,参照前面那章,后面具体讲解。

2017-02-23 09:10:15 sinat_25059791 阅读数 3833
  • 人工智能深度学习卷积神经网络入门

    "java大数据人工智能培训学校全套教材"系列课程由1000集视频构成,基本就 是1)时下流行的java培训学校主流内部教材,2)和市面上培训学校的通 行的课程体系几乎一样。所以这套课程都能自己学下来,等于上了培训学校一次,完全可以找个java工程师的工作了。   通过学习卷积神经网络概述,为什么引入神经网络来做识别,判断,预测,训练模型,激活函数,sigmoid激活函数,导数和切线,sigmoid激活函数如何求导, 链式法则,梯度,梯度下降法与delta法则,BP(back propagation)误差逆传播神经网络,卷积到底有什么作用?如何做到特征提取,池化的名字由来, dropout,Anaconda Prompt的用法,Jupyter notebook的用法,Spyder的用法, 建立安装Tensorflow所需的Anaconda虚拟环境,如何在Anaconda虚拟环境安装Tensorflow与Keras 概念等让大家对人工智能,卷积神经网络快速入门。 课程特色:专业细致,偏案例,理论强。 课程软件使用:Anaconda,Spyder,Jupyter notebook 重要声明: 1) 如果感觉噪音大,可以选择不用耳机,加音箱或用电脑原声  2) 既然我们的名字叫人工智能深度学习卷积神经网络入门 ,这个课程的特点就在于成本最低的, 让你最快速的,最容易的入门。人工智能深度学习卷积神经网络入门 的最大的难点在于入门入不了,从而最终放弃。俗话说师傅领进门,修行在个人。只要入了门了,后面的事都好办。选课前,务必注意本章的学习目标和内容。想学更多,注意后边的课程。

    104 人正在学习 去看看 马克

02-深度学习中的Data Augmentation方法


在深度学习中,为了避免出现过拟合(Overfitting),通常我们需要输入充足的数据量。当数据量不够大时候,常常采用以下几种方法:

  1. Data Augmentation:通过平移、 翻转、加噪声等方法从已有数据中创造出一批“新”的数据,人工增加训练集的大小。

  2. Regularization:数据量比较小会导致模型过拟合, 使得训练误差很小而测试误差特别大. 通过在Loss Function 后面加上正则项可以抑制过拟合的产生。缺点是引入了一个需要手动调整的hyper-parameter。

  3. Dropout:这也是一种正则化手段,不过跟以上不同的是它通过随机将部分神经元的输出置零来实现。详见 http://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf

  4. Unsupervised Pre-training:用Auto-Encoder或者RBM的卷积形式一层一层地做无监督预训练, 最后加上分类层做有监督的Fine-Tuning。参考 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.207.1102&rep=rep1&type=pdf

  5. Transfer Learning:在某些情况下,训练集的收集可能非常困难或代价高昂。因此,有必要创造出某种高性能学习机(learner),使得它们能够基于从其他领域易于获得的数据上进行训练,并能够在对另一领域的数据进行预测时表现优异。这种方法,就是所谓的迁移学习(transfer learning)。

数据增强变换(Data Augmentation Transformation)

数字图像处理中图像几何变换方法:

  • 旋转 | 反射变换(Rotation/reflection): 随机旋转图像一定角度; 改变图像内容的朝向;
  • 翻转变换(flip): 沿着水平或者垂直方向翻转图像;
  • 缩放变换(zoom): 按照一定的比例放大或者缩小图像;
  • 平移变换(shift): 在图像平面上对图像以一定方式进行平移;可以采用随机或人为定义的方式指定平移范围和平移步长, 沿水平或竖直方向进行平移. 改变图像内容的位置;
  • 尺度变换(scale): 对图像按照指定的尺度因子, 进行放大或缩小; 或者参照SIFT特征提取思想, 利用指定的尺度因子对图像滤波构造尺度空间. 改变图像内容的大小或模糊程度;
  • 对比度变换(contrast): 在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变. 对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间), 增加光照变化;
  • 噪声扰动(noise): 对图像的每个像素RGB进行随机扰动, 常用的噪声模式是椒盐噪声和高斯噪声;
  • 颜色变换(color): 在训练集像素值的RGB颜色空间进行PCA。

不同的任务背景下, 我们可以通过图像的几何变换, 使用以下一种或多种组合数据增强变换来增加输入数据的量。 几何变换不改变像素值, 而是改变像素所在的位置。 通过Data Augmentation方法扩张了数据集的范围, 作为输入时, 以期待网络学习到更多的图像不变性特征。

Keras中的图像几何变换方法

Keras中ImageDataGenerator 实现了大多数上文中提到的图像几何变换方法。如下:

keras.preprocessing.image.ImageDataGenerator(featurewise_center=False,
    samplewise_center=False,
    featurewise_std_normalization=False,
    samplewise_std_normalization=False,
    zca_whitening=False,
    rotation_range=0.,
    width_shift_range=0.,
    height_shift_range=0.,
    shear_range=0.,
    zoom_range=0.,
    channel_shift_range=0.,
    fill_mode='nearest',
    cval=0.,
    horizontal_flip=False,
    vertical_flip=False,
    rescale=None,
    dim_ordering=K.image_dim_ordering())
参数说明:
  • featurewise_center: Boolean. Set input mean to 0 over the dataset, feature-wise.
  • featurewise_std_normalization: Boolean. Divide inputs by std of the dataset, feature-wise.
  • zca_whitening: Boolean. Apply ZCA whitening.
  • samplewise_std_normalization: Boolean. Divide each input by its std.
  • width_shift_range: Float (fraction of total width). Range for random horizontal shifts.
  • rotation_range: Int. Degree range for random rotations.
  • height_shift_range: Float (fraction of total height). Range for random vertical shifts.
  • shear_range: Float. Shear Intensity (Shear angle in counter-clockwise direction as radians)
  • zoom_range: Float or [lower, upper]. Range for random zoom. If a float, [lower, upper] = [1-zoom_range, 1+zoom_range].
  • channel_shift_range: Float. Range for random channel shifts.
  • fill_mode: One of {“constant”, “nearest”, “reflect” or “wrap”}. Points outside the boundaries of the input are filled according to the given mode.
  • cval: Float or Int. Value used for points outside the boundaries when fill_mode = “constant”.
  • horizontal_flip: Boolean. Randomly flip inputs horizontally.
  • vertical_flip: Boolean. Randomly flip inputs vertically.
  • rescale: rescaling factor. Defaults to None. If None or 0, no rescaling is applied, otherwise we multiply the data by the value provided (before applying any other transformation).
  • dim_ordering: One of {“th”, “tf”}. “tf” mode means that the images should have shape (samples, height, width, channels), “th” mode means that the images should have shape (samples, channels, height, width). It defaults to the image_dim_ordering value found in your Keras config file at ~/.keras/keras.json. If you never set it, then it will be “tf”.
其它方法
  • Label shuffle: 类别不平衡数据的增广,参见海康威视ILSVRC2016的report

更多文章欢迎关注微信公众号:大数据学苑(Bigdata-Eden)
这里写图片描述

深度学习常见问题

阅读数 293

没有更多推荐了,返回首页