深度神经网络 订阅
深度神经网络是机器学习(ML, Machine Learning)领域中一种技术。 展开全文
深度神经网络是机器学习(ML, Machine Learning)领域中一种技术。
信息
外文名
Deep Neural Network
中文名
深度神经网络
深度神经网络特点
多层的好处是可以用较少的参数表示复杂的函数。在监督学习中,以前的多层神经网络的问题是容易陷入局部极值点。如果训练样本足够充分覆盖未来的样本,那么学到的多层权重可以很好的用来预测新的测试样本。但是很多任务难以得到足够多的标记样本,在这种情况下,简单的模型,比如线性回归或者决策树往往能得到比多层神经网络更好的结果(更好的泛化性,更差的训练误差)。非监督学习中,以往没有有效的方法构造多层网络。多层神经网络的顶层是底层特征的高级表示,比如底层是像素点,上一层的结点可能表示横线,三角; 而顶层可能有一个结点表示人脸。一个成功的算法应该能让生成的顶层特征最大化的代表底层的样例。如果对所有层同时训练,时间复杂度会太高; 如果每次训练一层,偏差就会逐层传递。这会面临跟上面监督学习中相反的问题,会严重欠拟合。2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优使原始表示x向上生成的高级表示r和该高级表示r向下生成的x'尽可能一致。方法是1,首先逐层构建单层神经元,这样每次都是训练一个单层网络。2,当所有层训练完后,hinton使用wake-sleep算法进行调优。将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于”认知“,向下的权重用于”生成“。然后使用Wake-Sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep算法分为醒(wake)和睡(sleep)两个部分。2.1,wake阶段,认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。也就是“如果现实跟我想像的不一样,改变我的权重使得我想像的东西就是这样的“。2.2,sleep阶段,生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念“。由于自动编码器(auto-encoder,即上面说的神经网络。广义上的自动编码器指所有的从低级表示得到高级表示,并能从高级表示生成低级表示的近似的结构,狭义上指的是其中的一种,谷歌的人脸识别用的)有联想功能,也就是缺失部分输入也能得到正确的编码,所以上面说的算法也可以用于有监督学习,训练时y做为顶层网络输入的补充,应用时顶层网络生成y'。
收起全文
精华内容
下载资源
问答
  • 再不入坑就晚了,深度神经网络概念大整理,最简单的神经网络是什么样子?

    目录

    1.神经网络训练过程

    2、基础概念

    3、数据预处理手段

    4、数据处理库

    5、训练集、测试集,测试集

    5、损失函数

    6、优化器

    7、激活函数

    8、hello world

    9、总结


    推荐阅读  点击标题可跳转

    1、再不入坑就晚了,从零学pytorch,一步一步环境搭建

    今天是第一篇文章,希望自己能坚持,加油。

    深度神经网络就是用一组函数去逼近原函数,训练的过程就是寻找参数的过程。

    1.神经网络训练过程

    神经网络的训练过程如下:

    • 收集数据,整理数据

    • 实现神经网络用于拟合目标函数

    • 做一个真实值和目标函数值直接估计误差的损失函数,一般选择既定的损失函数

    • 用损失函数值前向输入值求导,

    • 再根据导数的反方向去更新网络参数(x),目的是让损失函数值最终为0.,最终生成模型

      图片

    各层概念解释

    • 输入层:就是参数输入

    • 输出层:就是最后的输出

    • 隐藏层(隐含层):除去其他两层之外的层都可以叫隐藏层

     模型是什么:

    • 模型包含两部分,一部分是神经网络的结构,一部分是各个参数,最后训练的成果就是这个

    2、基础概念

    1、数学知识

    1.1导数

    导数在大学的时候还是学过的,虽然概念很简单,但是过了这么多年几乎也都忘了,连数学符号都不记得了,在复习之后才理解:就是表示数据变化的快慢,是变化率的概念,比如重力加速度,表示你自由落体之后每秒速度的增量。

    数学公式是:

    图片

    不重要,看不看的懂都行,因为在后面的学习中也不会让你手动求导,框架里都有现成的函数

    1.2 梯度

    梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)

    梯度:是一个矢量,其方向上的方向导数最大,其大小正好是此最大方向导数。

    图片

    2、前向传播和反向传播

    前向传播就是前向调用,正常的函数调用链而已,没什么特别的,破概念搞得神神秘秘的

    比如

    def a(input):
        return y
    
    def b(input):
        return y2
    # 前向传播
    def forward(input):
        y = a(input)
        y2 = b(y)

    反向传播

    图片

    反向传播就是根据误差和学习率,将参数权重进行调整,具体的算法下次会专门写一篇文章进行解析。

    3、数据预处理手段

    3.1 归一化(normalization)

    将数据放缩到0~1区间,利用公式(x-min)/(max-min)

    3.2 标准化(Standardization)

       数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。将数据转化为标准的正态分布,均值为0,方差为1

    3.3 正则化

    正则化的主要作用是防止过拟合,对模型添加正则化项可以限制模型的复杂度,使得模型在复杂度和性能达到平衡。

    3.4 独热码编码 (one hot)

    one hot编码是将类别变量转换为机器学习算法易于使用的一种形式的过程。one-hot通常用于特征的转换

    比如:一周七天,第三天可以编码为 [0,0,1,0,0,00]

    注:我把英语都补在了后面,并不是为了装逼,只是为了下次看到这个单词的时候知道这个单词在表示什么。

    4、数据处理库

    numpy ,pandas, matplotlib 这三个是数据分析常用的库,也是深度学习中常用的三个库

    4.1 numpy

    numpy 是优化版的python的列表,提高了运行效率,也提供了很多便利的函数,一般在使用的时候表示矩阵

    numpy中的一个重要概念叫shape ,也就是表示维度

    图片

    注:numpy 的api 我也使用不熟练,相信会在以后的学习过程中熟练的,使用的时候查一查,不用担心。

    4.2 pandas

    Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据).

    [Series] 是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。

    DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

    注:pandas 可以当做Excel使用,里面的api 我也使用不熟练,不用担心,可以扫下核心概念就好

    4.3 matplotlib

    Matplotlib  是画图用的,可以用来在学习的过程中对数据进行可视化,我还没有学习这个库,只会照猫画虎,所以放轻松,只是告诉你有这么个东西,不一定现在就要掌握

    5、训练集、测试集,测试集

    训练集:用来训练模型的数据,用来学习的

    验证集:用来验证模型的数据,主要是看下模型的训练情况

    测试集: 训练完成之后,验证模型的数据

    一般数据的比例为6:2:2

    一个形象的比喻:

    训练集----学生的课本;学生 根据课本里的内容来掌握知识。
    
    验证集----作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。
    
    测试集----考试,考的题是平常都没有见过,考察学生举一反三的能力。

    5、损失函数

    损失函数用来评价模型的预测值真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样.

    图片

    注:f(x) 表示预测值,Y 表示真实值,

    这些只是常用的损失函数,实现不同而已,在后面的开发理解各个函数就行了,API caller 不用理解具体的实现,就像你知道快速排序的算法原理,但是没必要自己去实现,现成的实现拿来用不香吗?

    6、优化器

    优化器就是在深度学习反向传播过程中,指引损失函数(目标函数)的各个参数往正确的方向更新合适的大小,使得更新后的各个参数让损失函数(目标函数)值不断逼近全局最小。

    常见的几种优化器

    图片

    7、激活函数

    激活函数就是对输入进行过滤,可以理解为一个过滤器

    图片

    常见的非线性激活函数通常可以分为两类,一种是输入单个变量输出单个变量,如sigmoid函数,Relu函数;还有一种是输入多个变量输出多个变量,如Softmax函数,Maxout函数。

    • 对于二分类问题,在输出层可以选择 sigmoid 函数。

    • 对于多分类问题,在输出层可以选择 softmax 函数。

    • 由于梯度消失问题,尽量sigmoid函数和tanh的使用。

    • tanh函数由于以0为中心,通常性能会比sigmoid函数好。

    • ReLU函数是一个通用的函数,一般在隐藏层都可以考虑使用。

    • 有时候要适当对现有的激活函数稍作修改,以及考虑使用新发现的激活函数。

    8、hello world

    说了很多概念,搞个demo 看看,下面是一个最简单的线性回归的模型。

    环境的安装在文章的开头。

    import torch as t
    import torch.nn as nn
    import torch.optim as optim
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 学习率,也就是每次参数的移动的大小
    lr = 0.01
    # 训练数据集的次数
    num_epochs = 100
    # 输入参数的个数
    in_size = 1
    #输出参数的个数
    out_size = 1
    # x 数据集
    x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],
                        [9.779], [6.182], [7.59], [2.167], [7.042],
                        [10.791], [5.313], [7.997], [3.1]], dtype=np.float32)
    # y 对应的真实值
    y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],
                        [3.366], [2.596], [2.53], [1.221], [2.827],
                        [3.465], [1.65], [2.904], [1.3]], dtype=np.float32)
    # 线性回归网络
    class LinerRegression(nn.Module):
        def __init__(self, in_size, out_size):
            super(LinerRegression, self).__init__()
            self.fc1 = nn.Linear(in_size, out_size)
    
        def forward(self, x):
            y_hat = self.fc1(x)
            return y_hat
    
    
    model = LinerRegression(in_size, out_size)
    # 损失函数
    lossFunc = nn.MSELoss()
    # 优化器
    optimizer = optim.SGD(model.parameters(), lr=lr)
    # 对数据集训练的循环次数
    for epoch in range(num_epochs):
        x = t.from_numpy(x_train)
        y = t.from_numpy(y_train)
        y_hat = model(x)
        loss = lossFunc(y_hat, y)
        # 导数归零
        optimizer.zero_grad()
        # 反向传播,也就是修正参数,将参数往正确的方向修改
        loss.backward()
        optimizer.step()
        print("[{}/{}] loss:{:.4f}".format(epoch+1, num_epochs, loss))
    
    # 画图看下最终的模型拟合的怎么样
    y_pred = model(t.from_numpy(x_train)).detach().numpy()
    plt.plot(x_train, y_train, 'ro', label='Original Data')
    plt.plot(x_train, y_pred, 'b-', label='Fitted Line')
    plt.legend()
    plt.show()

    上面是最简单的一个线性回归的神经网络,没有隐藏层,没有激活函数。

    运行很快,因为参数很少,运行的最终结果可以看下,最终达到了我们的结果,你可以试着调整一些参数

    图片

    9、总结

    今天写了很多的概念,不需要全部掌握,先混个脸熟,先有个全局观,慢慢的认识即可,里面的公式很多,不需要看懂,be easy.

    展开全文
  • 深度神经网络

    万次阅读 2011-09-10 19:41:11
    前2天看到新闻说,用微软用深度神经网络大幅度提高了语言识别的正确率 http://research.microsoft.com/en-us/news/features/speechrecognition-082911.aspx 于是对深度学习有了兴趣,由于没看过微软的文章,所

    前2天看到新闻说,用微软用深度神经网络大幅度提高了语言识别的正确率

    http://research.microsoft.com/en-us/news/features/speechrecognition-082911.aspx

    于是对深度学习有了兴趣,由于没看过微软的文章,所以还不知道是不是用的类似技术。

    这位大哥对deep learning 有研究。http://fantasticinblur.iteye.com/blog/1131640

    这个网站似乎很好http://deeplearning.net/。还没仔细看。

    大师的网址hinton :http://www.cs.toronto.edu/~hinton/

    其中有个tutorial ,还带代码,可惜代码是python的。试了下,没这么快能熟练使用python。

    这个tuturial主要讲了以下几个方面

    1.logistic regression --逻辑回归也是一种线性回归,是一种归一化的线性回归。归一化的方法是sigmoid函数,即s型函数。既然是线性回归,就是建立一个输入和输出的线性方程。输入是n维的,就是一个n元的一次方程,也就有了n+1个参数,+1是因为还有个偏置值。输出是(0,1)之间的数。根据标定样本,确定最符合的参数值,就可以用这个n元一次方程来直接计算测试样本的输出值f。如果是用做分类,则要稍微修改下。比如用做2类分类,可以确定f>0.5则为第1类,否则为第2类。问题是如何修改这些参数使得结果对所有测试样本都成立(或者说尽可能多的样本成立)。这里有损失函数的概念。在说下去就复杂了。差不多可以构建一个单层多元神经网络了。这里有两个函数,一个是softmax,一个是argmax,以前没看到过这种表述,

    softmax是柔性化最大值,是一种归一操作,使得输出在(0,1)之间。举例来说a=3,b=6,c=9. max=9,softmax=9/(3+6+9)=0.5,argmax其实是取得max时的arg,argmax=c。

     

    参考链接:logistic regression http://hi.baidu.com/hehehehello/blog/item/0b59cd803bf15ece9023d96e.html

    2.multilayer perceptron--单层自然是不够用的。所以有必要要多层神经网络,个人觉得bp简直太神了,以至于我现在都觉得ai就是神经网络的架构+bp的问题。bp解决了反馈的传播问题。

    3.deep convolutional networks--卷积网络我是熟悉的。这里讲深层卷积网络,给的例子是lenet5的。还真不知道也就算深层的了。lenet的共享权值很好用,结合感受野,就一定程度上有了特征提取的能力。我一直在想,如果卷积可以是各种形状的,是不是会更强大。

    下面的内容,不是很熟悉。虽然以前看过hopfield 网络,但也没理解的很透彻。重新从hopfield开始看起。The Hopfield Model,这个pdf还不错,对hopfield从浅到深讲的很明白,也讲了hopfield的一些著名应用。不知道是哪本书的章节。

    sgn函数,step函数

    The symmetry of the weight matrix and a zero diagonal are thus necessary
    conditions for the convergence of an asynchronous totally connected network
    to a stable state. These conditions are also sufficient, as we show later.

    突然想到hopfield网络的连接结构和mlp的不同。人的大脑皮层有很多层,hopfield模拟的是一种层内的结构,mlp则是层间的。hopfield适合做模式记忆,而mlp则有抽象的意味。接下去看BM和RBM。
    简单的说BM是结合模拟退火算法的Hopfield网络。另外BM中有可见层,隐藏层。不过BM的应用范围似乎和Hopfield有点不一样。而RBM是对BM的结构做了一定的限制的BM。
    A restricted Boltzmann machine (Smolensky, 1986) consists of a layer of visible units and a layer of hidden units with no visible-visible or hidden-hidden connections.

     具体可以看http://www.scholarpedia.org/article/Boltzmann_machine,,不过hinton1985年的那个文章更详细。BM学习算法中如何求<sisj>model(pij)还不是很清楚。有时间结合代码再看看。the learning signal is very noisy because it is the difference of two sampled expectations按这句话得提示,结合其他文字,似乎是说pij是在一个温度T恒=1的

    过程中去求,。。。还是不明白。。where <.>data is an expected value in the data distribution and<.>model  is an expected value when the Boltzmann machine is sampling state vectors from its equilibrium distribution at a temperature of 1.

    下面要看的是contrastive divergence,Gibbs sampleing,sigmoid belief networks。

    4.auto encoders

    5.stacked denoising auto encoder

    6.restricted boltzmann machine:

    7.Deep belief networks

     

     

     

     

     

     

    展开全文
  • 深度神经网络总结

    万次阅读 多人点赞 2019-01-09 17:52:24
    深度神经网络(Deep Neural Networks,DNN)可以理解为有很多隐藏层的神经网络,又被称为深度前馈网络(DFN),多层感知机(Multi-Layer perceptron,MLP)。 1 前向传播算法 1.1 从感知机到神经网络 感知机的模型...

    深度神经网络(Deep Neural Networks,DNN)可以理解为有很多隐藏层的神经网络,又被称为深度前馈网络(DFN),多层感知机(Multi-Layer perceptron,MLP)。

    1 前向传播算法

    1.1 从感知机到神经网络

    感知机的模型是一个有若干输入和一个输出的模型,如下图:

    输出和输入之间学习到一个线性关系,得到中间输出结果:

    接着是一个神经元激活函数,得到输出结果1或者-1。:

    这个模型只能用于二元分类,且无法学习比较复杂的非线性模型,因此在工业界无法使用。

    而神经网络则在感知机的模型上做了扩展,总结下主要有三点:

    • 1)加入了多层隐藏层,增强模型的表达能力。
    • 2)输出层神经元可以不止一个,可以有多个输出,这样模型可以灵活的应用于分类,回归,降维和聚类等。下图输出层有4个神经元。

    • 3) 对激活函数做扩展。感知机的激活函数是sign(z),虽然简单但是处理能力有限,因此神经网络中一般使用:Sigmoid,tanx, ReLU,softplus,softmax等加入非线性因素,提高模型的表达能力。

    1.2 DNN的基本结构

    按不同层的位置划分,DNN内部的神经网络层可以分为:输入层,隐藏层和输出层,一般第一层是输入层,最后一层是输出层,而中间的层数都是隐藏层。层与层之间是全连接的,即第i层的任意一个神经元一定与第i+1层的任意一个神经元相连。

    虽然DNN看起来很复杂,但是从小的局部模型来说,还是和感知机一样,即一个线性关系加上一个激活函数σ(z)。

    由于DNN层数多,参数较多,线性关系系数w和偏倚b的定义需要一定的规则。线性关系系数w的定义:第二层的第4个神经元到第三层的第2个神经元的线性系数定义为。上标3代表线性系数w所在的层数,而下标对应的是输出的第三层索引2和输入的第二层索引4。你也许会问,为什么不是w342, 呢?这主要是为了便于模型用于矩阵表示运算,如果是w342而每次进行矩阵运算是wTx+b,需要进行转置。将输出的索引放在前面的话,则线性运算不用转置,即直接为wx+b。注意,输入层是没有w参数,偏倚参数b。

     偏倚b的定义:第二层的第三个神经元对应的偏倚定义为。其中,上标2代表所在的层数,下标3代表偏倚所在的神经元的索引。

    1.3 DNN前向传播算法数学原理

    假设选择的激活函数是σ(z),隐藏层和输出层的输出值为a。

    1.4 DNN前向传播算法

    DNN的前向传播算法是利用若干个权重系数矩阵W,偏倚向量b来和输入值向量x进行一系列线性运算和激活运算,从输入层开始,利用上一层的输出计算下一层的输出,一层层的向后计算,一直到运算到输出层,得到输出结果为值。

    2 DNN反向传播算法

    使用前向传播计算训练样本的输出,使用损失函数,来度量训练样本计算出的输出和真实的训练样本标签之间的损失。DNN的反向传播算法(Back Propagation,BP)通过对损失函数用梯度下降法进行迭代优化求极小值,找到合适的隐藏层和输出层对应的线性系数矩阵W,偏倚向量b,让所有的训练样本输入计算出的输出尽可能的等于或接近样本标签。

    2.1 DNN反向传播算法的基本思路

    使用均方差来度量损失进行推导。即对于每个样本,期望最小化下式:

    2.2 DNN反向传播算法过程

    梯度下降法有批量(Batch),小批量(mini-Batch),随机三个变种,为了简化描述,这里以最基本的批量梯度下降法为例来描述反向传播算法。实际上在业界使用最多的是mini-Batch的梯度下降法。不过区别仅仅在于迭代时训练样本的选择而已。

    3 损失函数和激活函数

    3.1 均方差损失函数+Sigmoid激活函数的问题

    Sigmoid激活函数的表达式和图像:

    对于Sigmoid,当z的取值越来越大(或z的取值越来越小时),函数曲线变得越来越平缓,导数σ′(z)也越来越小。仅仅在z取值为0附近时,导数σ′(z)的取值较大。在使用均方差+Sigmoid的反向传播算法中,每一层向前递推都要乘以σ′(z),得到梯度变化值。Sigmoid的这个曲线意味着在大多数时候,梯度变化值很小,导致W,b更新到极值的速度较慢,算法收敛速度较慢。

    2. 使用交叉熵损失函数+Sigmoid激活函数改进DNN算法收敛速度

    每个样本的交叉熵损失函数的形式:

    另外,表示预测值与实际值的误差,当误差越大时,梯度就越大,参数w和b的调整就越快,训练的速度也就越快。通常情况下,如果使用了sigmoid激活函数,交叉熵损失函数肯定比均方差损失函数好用。综上:如果输出神经元是线性的,那么二次代价函数就是一种合适的选择,如果输出神经元是S型函数(sigmoid,tanh),那么比较适合用交叉熵代价函数。

    3. 使用对数似然损失函数和softmax激活函数进行DNN分类输出

    对数似然函数与softmax的组合和交叉熵与sigmoid函数的组合相似,对数似然代价函数在二分类时可以化简为交叉熵代价函数的形式。

    将DNN用于分类问题,在输出层用softmax激活函数非常常见。DNN分类模型要求是输出层神经元输出的值在0到1之间,同时所有输出值之和为1。普通DNN是无法满足这个要求。对现有的全连接DNN稍作改良,将输出层的激活函数从Sigmoid之类的函数转变为上式的softmax激活函数,即可用于解决分类问题。在现有的DNN模型中,将输出层第i个神经元的激活函数定义为如下形式:

    softmax激活函数在前向传播算法时的使用:假设输出层为三个神经元,而未激活的输出为3,1和-3,求出各自的指数表达式为:20,2.7和0.05,归一化因子即为22.75,则三个类别的概率输出分布为0.88,0.12和0。

    4. 梯度爆炸,梯度消失与ReLU激活函数

    在反向传播算法中,由于使用了是矩阵求导的链式法则,有一大串连乘,如果连乘的数字在每层都是小于1的,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层都是大于1的,则梯度越往前乘越大,导致梯度爆炸。对于梯度爆炸,则一般可以通过调整DNN模型中的初始化参数得以解决。

    反向传播算法中δ的计算:

    甚至接近于0,导致梯度几乎消失,进而导致前面隐藏层的W,b参数随着迭代的进行几乎没有大的改变,收敛速度较慢。

    一个可能部分解决梯度消失问题的办法是使用ReLU(Rectified Linear Unit)激活函数:σ(z)=max(0,z),ReLU在卷积神经网络CNN中得到了广泛的应用。

    5. DNN损失函数和激活函数小结

    1)如果使用sigmoid激活函数,则交叉熵损失函数一般肯定比均方差损失函数好。2)如果是DNN用于分类,则一般在输出层使用softmax激活函数和对数似然损失函数。3)ReLU激活函数对梯度消失问题有一定程度的解决,尤其是在CNN模型中。

    DNN常用的激活函数:

    • 1)sigmoid:
    • 2)ReLU:σ(z)=max(0,z)
    • 3) tanh:sigmoid的变种,输出区间为[-1,1]表达式为:

    tanh激活函数和sigmoid激活函数的关系为:

    • 4) softplus:sigmoid函数的原函数,表达式为:

    它的导数就是sigmoid函数。softplus的函数图像和ReLU有些类似。它出现的比ReLU早,可以视为ReLU的鼻祖。

    • 5)PReLU:ReLU的变种,特点是如果未激活值小于0,不是简单粗暴的直接变为0,而是进行一定幅度的缩小。

    正则化

    1. DNN的L1&L2正则化

    L1正则化和L2正则化原理类似,重点讲述DNN的L2正则化。DNN的L2正则化通常只针对与线性系数矩阵W,而不针对偏倚系数b。

    假如每个样本的损失函数是均方差损失函数,则所有的m个样本的损失函数为:

    则加上了L2正则化后的损失函数是:

    其中,λ即正则化超参数,实际使用时需要调参。而w为所有权重矩阵W的所有列向量。

    如果使用上式的损失函数,进行反向传播算法时,流程和没有正则化的反向传播算法完全一样,区别仅仅在于进行梯度下降法时,W的更新公式。反向传播算法中,W的梯度下降更新公式为:

    加入L2正则化以后,迭代更新公式变成:

    注意到上式中的梯度计算中我忽略了,因为α是常数,而除以m也是常数,所以等同于用了新常数α来代替。类似的L2正则化方法可以用于交叉熵损失函数或者其他的DNN损失函数。

    2. DNN通过集成学习的思路正则化

    除了常见的L1&L2正则化,DNN可以用Bagging的思路来正则化。常用的机器学习Bagging算法中,随机森林是最流行的。它通过随机采样构建若干个相互独立的弱决策树学习器,最后采用加权平均法或者投票法决定集成的输出。在DNN中同样可以使用Bagging的思路。不过和随机森林不同的是,这里不是若干个决策树,而是若干个DNN的网络。

    首先对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集训练DNN。即采用前向传播算法和反向传播算法得到N个DNN模型的W,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。

    不过用集成学习Bagging的方法有一个问题,就是DNN模型本来就比较复杂,参数很多。现在又变成了N个DNN模型,这样参数又增加了N倍,从而导致训练这样的网络要花更加多的时间和空间。因此一般N的个数不能太多,比如5-10个就可以了。

    3. DNN通过dropout 正则化

    Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。在对训练集中的一批数据进行训练时,随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合一批训练数据。如下图,去掉了一半的隐藏层神经元:

    然后用这个去掉隐藏层的神经元的网络来进行一轮迭代,更新所有的W,b。

    dropout并不意味着这些神经元永远的消失了。在下一批数据迭代前,会把DNN模型恢复成最初的全连接模型,然后再用随机的方法去掉部分隐藏层的神经元,接着去迭代更新W,b。当然,这次用随机的方法去掉部分隐藏层后的残缺DNN网络和上次的残缺DNN网络并不相同。

    总结下dropout的方法: 每轮梯度下降迭代时,它需要将训练数据分成若干批,然后分批进行迭代,每批数据迭代时,需要将原始的DNN模型随机去掉部分隐藏层的神经元,用残缺的DNN模型来迭代更新W,b。每批数据迭代更新完毕后,要将残缺的DNN模型恢复成原始的DNN模型。

    dropout和Bagging的正则化思路不同,dropout模型中的W,b是共享的,所有的残缺DNN迭代时,更新的是同一组W,b;而Bagging正则化时每个DNN模型有自己独有的一套W,b参数,相互之间是独立的。相同点是:每次使用基于原始数据集得到的分批的数据集来训练模型。

    使用基于dropout的正则化比基于bagging的正则化简单,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。

    4. DNN通过增强数据集正则化

    增强模型泛化能力最好的办法是有更多的训练数据,但是在实际应用中,更多的训练数据往往很难得到。有时候我们不得不去自己想办法无中生有,来增加训练数据集,进而得到让模型泛化能力更强的目的。


    从感知机到神经网络

    感知机是二分类的线性模型,假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据集正负样本点正确分开的超平面使误分类的样本点到超平面的距离之和最小。这个模型只能用于二元分类,且无法学习比较复杂的非线性模型,因此在工业界无法使用。

    将单个神经元的激活函数设为sign可以得到感知机;激活函数设为sigmoid,即可得到二分类的LR;将激活函数设为softmax可以得到多分类的LR,但需要注意的是:它们需要优化的损失函数并不相同,所以LR和感知机的不同体现在两点:激活函数和损失函数。

    神经网络在感知机的模型上做了扩展,主要有三点:

    1. 加入了多层隐藏层,特征的“等级”随着网络深度的加深而变高,增强了模型的表达能力。
    2. 输出层神经元可以有多个输出,模型可以灵活的应用于分类,回归,降维和聚类等。
    3. 对激活函数做扩展。感知机的激活函数是sign(z),虽然简单但是处理能力有限,因此神经网络中一般使用:Sigmoid,Softmax,tanx, ReLU,softplus等激活函数,加入非线性因素,提高模型的表达能力。

    深度神经网络(Deep Neural Networks,DNN)的基本结构

    DNN可以分为:输入层,隐藏层和输出层,一般第一层是输入层,最后一层是输出层,而中间的层数都是隐藏层。层与层之间是全连接的,即第i层的任意一个神经元一定与第i+1层的任意一个神经元相连。

    DNN前向传播算法

    从输入层开始,利用输入向量x,若干个权重系数矩阵W和偏置向量b,进行一系列线性运算和激活运算,利用上一层的输出计算下一层的输出,一层层的向后计算,一直到运算到输出层得到输出结果

    DNN反向传播算法(Back Propagation,BP)

    反向传播算法的学习过程由正向传播和反向传播组成。在正向传播过程中,输入信息通过输入层,经隐藏层逐层处理并传向输出层。如果在输出层得不到期望的输出值,则取输出结果与样本标签误差的平方和作为目标函数,转入反向传播,通过对损失函数用梯度下降法进行迭代优化求极小值,找到合适的输出层和隐藏层对应的线性系数矩阵W,偏置向量b,网络的学习在权值修改过程中完成,误差达到所期望值时,网络学习结束。

    DNN激活函数

    为什么引入非线性激活函数

    不用激活函数时,每一层输出都是上层输出的线性函数, 无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,引入激活函数相当于加入非线性因素,可以有效避免多层网络等效于单层线性函数,提高模型表达力,使模型更有区分度。激活函数通常有如下一些性质:非线性(提高模型表达力),可微性(方便求梯度),单调性(损失函数为凸函数)

    DNN常用的激活函数

    梯度消失与梯度爆炸

    在反向传播算法中,由于使用了矩阵求导的链式法则,后层的梯度以连乘方式叠加到前层,当神经网络中的激活函数为S型激活函数时,由于其饱和特性,在输入达到一定值的情况下,输出就不会发生明显变化,其导数逐渐趋近于0。使用梯度进行参数更新时,如果连乘的数字在每层都是小于1的,则梯度越往前乘越小,误差梯度反传到前层时几乎会衰减为0,因此无法对前层的参数进行有效的更新学习,这就会导致梯度消失,而如果连乘的数字在每层都是大于1的,则梯度越往前乘越大,导致梯度爆炸。梯度消失会导致隐层的W,b参数随着迭代的进行几乎没有大的改变,甚至不会收敛,因此无法通过加深网络层次来改善神经网络的预测效果。梯度爆炸会导致网络权重的大幅更新,引起网络不稳定,在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值。

    ReLU系列相对于Sigmoid和Tanh激活函数的优点是什么?它的缺点以及如何改进?

    优点

    1. 从计算的角度上,Sigmoid和Tanh激活函数均需要计算指数,复杂度高,而ReLU只需要一个阈值即可得到激活值。
    2. 深层网络中,S型激活函数反向传播时容易出现梯度消失现象,ReLU的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活边界。
    3. ReLU的单侧抑制会使一部分神经元的输出为 0,提供了网络的稀疏表达能力,并且减少了参数的相互依存关系,可以缓解过拟合。

    缺点
    使用Relu激活函数在训练过程中Relu会导致神经元不可逆死亡。因为函数会导致负梯度在经过该ReLU单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际训练中,如果学习率(Learning Rate)设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。                              

    缺点的改进

    为解决练过程中会导致神经元死亡的问题,人们设计了ReLU的变种LReLU( Leaky ReLU),其形式表示为:

    LReLU与ReLU的区别在于:当z<=0时,其值不为0,而是一个斜率为a的线性函数,一般a为一个很小的正常数,这样既实现了单侧抑制,又保留了部分负梯度信息以致不完全丢失。但a值的选择增加了问题难度,需要较强的先验知识或多次重复训练以确定合适的参数值。

    DNN损失函数

    常用的损失函数有:平方误差损失函数,交叉熵损失函数,对数似然损失函数

    对数似然损失是对预测概率的似然估计,其最小化的本质是利用样本中的已知分布,求解导致这种分布的最佳模型参数,使这种分布出现概率最大。它衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。其标准形式为:

    对数似然损失函数在二分类时可以化简为交叉熵损失函数。交叉熵表示两个概率分布之间的距离,交叉熵越大,两个概率分布距离越远,概率分布越相异;交叉熵越小,两个概率分布距离越近,概率分布越相似,通过交叉熵可以判断哪个预测结果与标准答案更接近。

    交叉熵损失函数的计算公式为:

    对数损失在多分类问题中的计算公式为:

    平方误差损失函数和交叉熵损失函数分别适合什么场景?

    一般来说,平方误差损失函数更适合输出为连续,并且最后一层不含Sigmoid或Softmax激活函数的神经网络;如果是使用Sigmoid或Softmax激活函数进行二分类或多分类的神经网络,使用交叉熵损失或对数似然损失会有更快的收敛速度。

    推导平方误差损失函数相对于输出层的导数:其中最后一项σ′(z)为激活函数的导数。反向传播算法中,每一层向前递推都要乘以σ′(z),得到梯度变化值,当激活函数为S型函数时,如果z 的绝对值较大,函数会趋于饱和,即σ′(z)的绝对值非常小,导致W,b更新到极值的速度较慢,算法收敛速度较慢。当使用交叉熵损失函数时,相对于输出层的导数为:(也可以认为是残差),此时的导数是线性的,因此不会存在学习速度过慢的问题,而且其表示预测值与实际值的误差,误差越大时,梯度越大,参数w和b的调整就越快,训练的速度也就越快

    将输出层的激活函数从Sigmoid之类的函数转变为Softmax激活函数可以使输出层神经元输出的值在0到1之间,同时所有输出值之和为1,可用于解决多分类问题。

    DNN激活函数和损失函数小结:

    1. 如果神经元的输出是线性的,平方损失函数是一种合适的选择,如果输出神经元是S型激活函数,则交叉熵损失函数会有更快的收敛速度。
    2. softmax激活函数与对数似然损失的组合和sigmoid函数与交叉熵的组合相似,所以一般使用sigmoid激活函数与交叉熵进行二分类输出;使用softmax激活函数与对数似然损失进行DNN多分类输出。

    正则化(L1&L2,Bagging,Dropout,数据扩充)

    1. DNN的L1&L2正则化

    假如每个样本的损失函数是均方差损失函数,则加上了L2正则化后的损失函数是(L1正则化类似):

    其中,λ即正则化超参数,实际使用时需要调参。

    2. DNN通过Bagging正则化

    首先对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集训练DNN。即采用前向传播算法和反向传播算法得到N个DNN模型的W,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。

    需要注意的是:DNN模型本来就比较复杂,参数很多。N个DNN模型集成,参数增加了N倍,导致训练网络要花更加多的时间和空间。N的取值一般为:5-10个。

    3. DNN通过Dropout 正则化

    Dropout(随机失活)是指在深度网络的训练中,将训练数据分成若干批,使用一批数据进行梯度下降迭代时,以一定的概率随机地 “临时丢弃”一部分神经元节点,然后用这个去掉隐藏层神经元的网络来拟合一批训练数据,并更新所有的权重和偏置(W,b)。在下一批数据迭代前,会把DNN模型恢复成最初的全连接模型,然后再用随机去掉部分隐藏层的神经元,迭代更新权重和偏置。

    由于其随机丢弃部分神经元的机制,每次dropout都相当于训练了原始网络的子网络,它们共享部分权值,并且具有相同的网络层数,而模型整体的参数数目不变,这就大大简化了运算,而且这个过程会减弱神经元之间的依赖关系,减少过拟合,增强模型的泛化能力。(避免神经元相互连接,参数过多,将结果记住)

    Bagging集成算法是多个模型的同时训练与测试评估,当网络与参数规模庞大时,需要消耗大量的运算时间与空间。Dropout在小批量数据集上进行操作,最后的结果相当于很多子网络的组合,这可以看做是bagging集成的近似,如果每次训练的子网络之间有一定的独立性,最后融合会降低模型的方差,增强模型的泛化能力。

    Dropout和Bagging的正则化的异同

    • 不同点:dropout模型中的W,b是一套共享的,所有的残缺DNN迭代时,更新的是同一组W,b;而Bagging正则化时每个DNN模型有自己独有的一套W,b参数,相互之间是独立的。
    • 相同点:二者都是使用基于原始数据集分批得到的数据集来训练模型。

    Dropout和 L1,L2的正则化的异同

    二者的目的都是用来减少 overfitting(过拟合)。但 L1,L2正则化是针对损失函数进行优化,Dropout是改变神经网络本身的结构。

    4. DNN通过扩充数据集正则化

    减少模型过拟合,增强模型泛化能力最好的办法是有更多的训练数据。如:计算机视觉中可以使用图像数据增强技术。

    深度学习输入数据归一化的原因(使数据处于同一数量级,具有相同的数据分布)

    1. 神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;
    2. 数据归一化可以在反向传播的过程中,加快网络中每一层权重参数的收敛速度。如果每批训练数据的分布各不相同,那么网络就要在每次迭代都去学习适应不同的数据分布,这样将会大大降低网络的训练速度

    什么样的数据集不适合用深度学习?

    1. 数据集太小,深度学习容易产生过拟合。
    2. 数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变
    展开全文
  • 深度神经网络模型剪枝

    千次阅读 2020-04-20 23:43:13
    深度神经网络模型剪枝 神经网络剪枝 Neural Network Pruning

    深度神经网络模型剪枝

    神经网络剪枝 Neural Network Pruning

    下面是我对剪枝的一点点理解,如有理解不到位,请大家指正

    ▶剪枝只是将模型中权重比较小,对输出影响不大的神经元参数置0,并且实验证明在大多数情况下,权重较小的神经元置0后对模型的最终输出确实影响不大,当然,这也跟剪枝比例和模型规模有关系

    ▶剪枝并没有减少模型的参数量,间接减少计算量:剪枝只是在置0,但参数仍然以0存在,从底层方面对于一个与0相乘的数,直接输出0不会做过多计算,数据结构中也有这个理论:当 ‘与运算’ 前的表达式结果为False时,该表达式直接为False,不再计算 ‘与运算’ 后的表达式。

    ▶在一些特殊情况下,权重小的神经元并不一定对输出影响小,因此还有很多其他的剪枝方式

    ▶对网络中的每一层按比例剪枝,而不是对整个网络剪


    拿MNIST跑了下,剪掉部分对模型性能的影响

    网络:
    self.linear1 = MaskLinear(28*28, 512)
    self.bn1 = nn.BatchNorm1d(512)
    self.linear2 = MaskLinear(512, 256)
    self.bn2 = nn.BatchNorm1d(256)
    self.linear3 = MaskLinear(256, 10)
    self.act = nn.LeakyReLU()
    self.softmax = nn.Softmax(dim=1)
    训练了8个epoch

    剪枝前:
    Test acc: 97.91324%
    剪枝 60% 后:
    Test acc: 97.20395%
    剪枝前后正确率差异: 0.7092927631578902 %


    剪枝 50% 后:
    Test acc: 97.61513%
    剪枝前后正确率差异: 0.2981085526315752 %


    剪枝 40% 后:
    Test acc: 97.91324%
    剪枝前后正确率差异: 0.0 %


    剪枝 30% 后:
    Test acc: 97.87212%
    剪枝前后正确率差异: 0.04111842105263008 %


    剪枝 20% 后:
    Test acc: 97.87212%
    剪枝前后正确率差异: 0.04111842105263008 %


    剪枝 10% 后:
    Test acc: 97.93380%
    剪枝前后正确率差异: 0.02055921052631504 %

    下面是对权重小的神经元进行剪枝的代码栗子,感兴趣的可以跑一跑

    定义了一个2层的全连接,第一层输入为1, 输出为5, 第二层输入为5,输出为1,然后剪掉40%

    先看一些结果
    在这里插入图片描述


    代码:

    import torch
    from torch import nn
    import numpy as np
    
    
    class MaskLinear(nn.Linear):                    # 重写nn.Linear 为 MaskLinear
        def __init__(self, in_features, out_features, bias=True):
            super(MaskLinear, self).__init__(in_features, out_features, bias)
            self.mask = None
    
        def set_mask(self, mask):                   # 根据掩码剪掉权重
            self.mask = mask.detach().requires_grad_(False)
            self.weight.data = self.weight.data * self.mask.data
            self.mask = None
    
        def get_mask(self):                         # 获取掩码
            # print(self.mask_flag)
            return self.mask
    
        def forward(self, x):
            return nn.functional.linear(x, self.weight, self.bias)
    
    
    class MLP(nn.Module):
        def __init__(self):
            super(MLP, self).__init__()
            self.linear1 = MaskLinear(1, 5)
            self.linear2 = MaskLinear(5, 1)
    
        def forward(self, x):
            x = x.view((x.shape[0], -1))
            l1 = self.linear1(x)
            l2 = self.linear2(l1)
            return l2
    
        def set_masks(self, masks):
            self.linear1.set_mask(masks[0])
            self.linear2.set_mask(masks[1])
    
    
    def weight_prune(model, pruning_perc):          # 根据比例perc计算掩码
        threshold_list = []
        for param in model.parameters():
            if len(param.data.size()) != 1:
                weight = param.cpu().data.abs().numpy().flatten()
                threshold = np.percentile(weight, pruning_perc)
                threshold_list.append(threshold)
        masks = []
        idx = 0
        for param in model.parameters():
            if len(param.data.size()) != 1:
                pruning_inds = param.data.abs() > threshold_list[idx]
                masks.append(pruning_inds.float())
                idx += 1
        return masks
    
    
    def train(model, data, target, epoch):
        model.train()
        opt = torch.optim.Adam(model.parameters())
        for ep in range(epoch):
            opt.zero_grad()
            out = model(data)
            loss = torch.mean((out - target) ** 2)
            loss.backward()
            opt.step()
            print('epoch: {1:2d} Train out: {0:2.4f}'.format(out.item(), ep+1))
        return model
    
    
    def main():
        model = MLP()
        data = torch.tensor([3.0])
        model = train(model, data, data, 100)
        torch.save(model, 'net.pth')
        for name, param in model.named_parameters():
            print('{0:15s}: {1}'.format(name, param.data))
        print('\n############-▲▲剪枝前▲▲-------▼▼剪枝40%后▼▼-##########\n')
        mask = weight_prune(model, 40)          # 获取掩码,剪掉40%
        model.set_masks(mask)                   # 剪枝
        for name, param in model.named_parameters():
            print('{0:15s}: {1}'.format(name, param.data))
    
    
    if __name__ == '__main__':
        main()
    
    
    展开全文
  • 深度神经网络进行图像超分辨

    万次阅读 2020-08-04 08:58:59
    深度神经网络进行图像超分辨
  • 从自联想神经网络到深度神经网络

    千次阅读 2013-12-17 12:18:36
    从自联想神经网络到深度神经网络 深度神经网路已经在语音识别,图像识别等领域取得前所未有的成功。本人在多年之前也曾接触过神经网络。本系列文章主要记录自己对深度神经网络的一些学习心得。 ...
  • OpenCV4 深度神经网络(DNN)实战教程

    千人学习 2019-11-09 14:56:07
    理解卷积神经网络基本原理,熟练掌握OpenCV深度神经网络模块API开发技术,学会加载模型,解析模型输出结果;学会如何把正常的tensorflow对象检测模型转化为OpenCV可以接受的模型,实时人脸检测与识别案例。学会使用...
  •     本文提出了一个多任务深度神经网络(MT-DNN),用于跨多个自然语言理解(NLU)任务学习表示。MT-DNN不仅利用了大量的跨任务数据,而且还受益于正则化效应,从而产生更通用的表示,以帮助适应新的任务和领域。MT-...
  • 多层感知机(MLP)和深度神经网络(DNN)是一样的模型,只是叫法不同。 深度神经网络,卷积神经网络(CNN)都属于深度前馈神经网络(DFNN)。 一、连接方式 连接方式分为两种 全连接,MLP采用,当前层的单元与上一...
  • 深度学习之(DNN)深度神经网络

    万次阅读 2016-05-03 21:42:32
    (DNN)深度神经网络   简介 DNN是指深度神经网络。与RNN循环神经网络、CNN卷积神经网络的区别就是DNN特指全连接的神经元结构,并不包含卷积单元或是时间上的关联。   神经网络简史 神经网络技术起源于上...
  • 深度神经网络换脸DeepFakes

    千次阅读 2018-04-04 09:46:46
    通过谷歌的TensorFlow,应用深度神经网络技术可以自动换脸。原理就是自动识别人脸与表情,抽取面部,贴到吻合的目标上。原理不复杂,但是效果很好。目前国外已经有开源代码https://github.com/deepfakes/faceswap ...
  • 通过前面深度神经网络之前向传播算法和深度神经网络之反向传播算法的学习,我们能够了解到损失函数是用来评估模型的预测值与真实值之间的差异程度。另外损失函数也是神经网络中优化的目标函数,神经网络训练或者优化...
  • 神经网络(Artificial Neural Networks)和深度神经网络(Deep Neural Networks)1. 2. 循环神经网络(Recurrent Neural Networks)和递归神经网络(Recursive Neural Networks)1.3. 卷积网络(Convolut...
  • 卷积神经网络和深度神经网络的区别是什么?

    万次阅读 多人点赞 2019-11-28 11:29:25
    DNN是指深度神经网络,它是一个很广的概念,某种意义上CNN、RNN、GAN等都属于其范畴之内。DNN与CNN(卷积神经网络)的区别是DNN特指全连接的神经元结构,并不包含卷积单元或是时间上的关联。DNN是指包含多个隐层的...
  • 深度神经网络算法分析

    千次阅读 2019-07-25 18:45:45
    深度神经网络算法分析 人工智能的分类 弱人工智能:特定任务与人类智力或者效率持平 通用人工智能:具有人类智力水平,解决通用问题 超人工智能:超过人类智力水平,可以在创造力上超过常人 机器学习的类型...
  • 神经网络 之 DNN(深度神经网络) 介绍

    千次阅读 2017-09-07 15:14:00
    CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络) CNN 专门解决图像问题的,可用把它看作特征提取层,放在输入层上,最后用MLP 做分类。 RNN 专门解决时间序列问题的,用来提取时间序列信息,放在特征...
  • 基于并行遗传算法优化的深度神经网络模型 深度神经网络的问题是训练速度慢,容易梯度消失,剃度消失问题的存在,使得深度神经网络的训练变得极度困难,人们提出的cnn rnn lstm这些模型,就是为了减少节点的数目,...
  • 深度神经网络综述(一)

    千次阅读 2018-12-18 16:01:12
    深度神经网络综述(一) 参考文献:Deep Learning on Graphs: A Survey 简介 在图结构数据上使用深度学习的限制: 图的不规则性 与图像,音频或文本数据不同,图是一种不规则的数据结构。因此,对于神经网络...
  • 深度神经网络可视化工具

    千次阅读 2017-08-31 14:56:04
    TensorBoard:TensorFlow集成可视化工具GitHub官方项目:...TensorBoard 涉及到的运算,通常是在训练庞大的深度神经网络中出现的复杂而又难以理解的运算。为了更方便 TensorFlow 程序的理解、调试与优化,Googl
  • 刚接触深度学习时,我们经常会看到神经网络、深度神经网络、卷积神经网络这些词。初看可能一头雾水,没关系,下面我们就来了解一下这些词背后的意义吧。 图1 神经元的结构 神经元(Neuron): 从生物上来说...
  • 吴恩达神经网络与深度学习——深度神经网络

    千次阅读 多人点赞 2018-11-02 23:03:07
    吴恩达神经网络深度学习——浅层神经网络深层神经网络 深层神经网络
  • XILINX深度神经网络学习库

    千次阅读 2018-04-09 21:48:18
    XILINX深度神经网络学习库,正式release啦! 现在以CHaiDNN 的名字在GitHub上开源!导读:CHaiDNN是XILINX为Ultrascale MPSoCs的加速提供的深度神经网络库文件。它是被设计用来最大化16位整型数据计算效率的。CHaiDNN...
  • 在实际应用中,所谓的深度神经网络DNN,往往融合了多种已知的结构,包括convolution layer 或是 LSTM 单元。其实,如果我们顺着神经网络技术发展的脉络,就很容易弄清这几种网络结构发明的初衷,和他们之间本质的...
  • 深度神经网络(DNN)模型

    千次阅读 2019-11-15 16:06:15
    深度神经网络(Deep Neural Networks, 以下简称DNN)是深度学习的基础 DNN网络结构 DNN内部的神经网络层可以分为三类,输入层,隐藏层和输出层,如下图示例,一般来说第一层是输入层,最后一层是输出层,而中间的层...
  • 基于深度神经网络的植物病虫害识别代码运行

    千次阅读 热门讨论 2020-08-11 15:50:36
    最近在学习利用深度神经网络识别病虫害的有关知识,在读了几篇论文后,决定找个代码跑一跑。 代码链接:https://www.kaggle.com/emmarex/plant-disease-detection-using-keras 1.数据集:PlantVillage 该数据集含15...
  • 使用python实现深度神经网络 1

    万次阅读 多人点赞 2017-06-11 12:32:16
    深度学习并没有你想象的那么难,本课程将会一边讲解深度学习中的基本理论,一边通过动手使用python实现一个简单的深度神经网络去验证这些理论,让你从原理上真正入门深度学习。 本次实验将会带大家学习深度学习中...
  • 深度神经网络DNN

    千次阅读 2019-02-28 01:14:11
    深度网络DNN的概念,是基于浅层网路——多层感知机MLP(或称人工神经网络ANN)的基础上发展而来。关于MLP或ANN的知识,此处不作赘述,网上有很多资料可以参考。 DNN是一个很广的概念,大名鼎鼎的CNN、RNN、GAN等都...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 250,460
精华内容 100,184
关键字:

深度神经网络