精华内容
下载资源
问答
  • 全连接神经网络

    万次阅读 多人点赞 2019-07-22 01:46:36
    这里以包含一个隐藏层和一个输出层的两层全连接神经网络为例(严格的说输入层并不能算为一层),上图左是它的结构图。将网络中的某个节点放大,得到了上图右。与逻辑回归采用 sigmoid 函数作为激活函数不同的是,...



    1 对全连接神经网络结构的理解

    1.1 单个节点如何工作

    在这里插入图片描述
    这里以包含一个隐藏层和一个输出层的两层全连接神经网络为例(严格的说输入层并不能算为一层),上图左是它的结构图。将网络中的某个节点放大,得到了上图右。与逻辑回归采用 sigmoid 函数作为激活函数不同的是,适用于神经网络的激活函数有很多,包括但不限于 sigmoid 函数,下面会详解讲解。除了激活函数的差别外,神经网络中单个节点和逻辑回归却具有相同的结构,都是先执行一个线性运算,然后再通过激活函数做一个非线性的运算。

    神经网络往往包含很多层,一层中又包含多个节点,这里用上标[i]表示网络中的第 i 层,用下标j表示第 j 个节点。数据集包含多个样本,这里用上标(k)表示第 k 个样本。图中的 z z z 表示网络节点在执行线性运算后的结果, a a a 表示网络节点在执行激活函数(activation function)后的输出。输入层并不执行任何计算,所以它并不能算为一个层,只不过我们习惯上这样叫它。输入层也可以看作第 0 层,则输入的向量 x x x 也可以看作是第 0 层的输出,即 a [ 0 ] = x a^{[0]}=x a[0]=x。对于输入的某个样本的特征向量 x x x ,神经网络的每个节点是如何工作的呢?这里以第 1 层为例,给出了第一层节点的计算过程,如下图右。
    在这里插入图片描述

    1.2 整个网络如何工作

    通过上图我们已经知道了单个节点是如何工作的。那么对于某个样本的特征向量 x x x ,整个神经网络的节点是如何合作并最终输出 y ^ \hat{y} y^ 的呢?由图中的箭头可以知道,神经网络从输入层开始,上一层的输出作为下一层的输入,直到输出最终的结果。我们把第 i 层的所有节点的参数向量 w 转置后按顺序放进矩阵 W [ i ] W^{[i]} W[i] 中,再把第 i 层的所有节点的参数 b 按顺序组合成一个列向量 b b b,那么对于上图第 1 层的运算过程,我们用 z [ 1 ] = W [ 1 ] x + b z^{[1]} = W^{[1]}x+b z[1]=W[1]x+b a [ 1 ] = s i g m o i d ( z [ 1 ] ) a^{[1]}=sigmoid(z^{[1]}) a[1]=sigmoid(z[1]) 这两个式子便能完成上图中相同的工作。只不过我们这里把每一层所有节点的 w,b, a a a,z 分别放在了一起。通过这种向量化的方式,现在我们能更方便地计算每一层节点的输出了。对于输入的某个样本的特征向量 x x x,我们按照同样的方式计算整个神经网络的输出,如下图所示。
    在这里插入图片描述
    对于包含 m 个样本的样本集,其特征矩阵 X = { x ( 1 ) , x ( 2 ) ⋯ , x ( m ) } . X = \{x(1),x(2) ⋯ , x(m)\} . X={x(1),x(2),x(m)}. 上面是以单个样本 x x x 为单位进行运算,如果要以这种方式完成对整个样本集的预测的话,必须通过大量的 for 循环,下图左给出了通过循环对所有样本进行预测的做法。但是对于庞大的数据集和稍微复杂的网络结构来说,用 for 循环这无疑会花费大量的计算时间。为了使我们的网络模型更加高效,一般使用向量化的计算方式代替 for 循环,下图右展示了通过向量化计算对所有样本进行预测的做法。
    在这里插入图片描述

    2 激活函数

    2.1 激活函数的对比与选择

    神经网络往往包含多个层,不同层的激活函数可以不一样。下面是几种常见的激活函数。

    1)sigmoid 函数

    表达式: s i g m o i d ( z ) = 1 1 + e − z sigmoid(z) = \frac{1}{1 + e^{-z}} sigmoid(z)=1+ez1

    函数图像:
    在这里插入图片描述
    sigmoid 函数的值域为 (0,1)。从图中可以看出,当因变量 z z z 取值为 0 时,sigmoid 曲线的斜率(梯度)最大,计算出来为 0.25。当因变量 z z z 的取值越大或越小时,sidmoid 曲线的斜率(梯度)就越小。当 z z z > 5 或 z z z < -5 时,sigmoid 曲线的斜率(梯度)几乎为零。如此一来,当我们在通过梯度下降算法来更新参数的时候,如果 z z z 的取值过大,那么参数更新的速度就会变得非常缓慢。

    所以在神经网络中选择 sigmoid 函数作为激活函数并不是一个很好的选择,但有个例外就是二元分类的输出层。因为二元分类的标签 y y y 要么是 0,要么是 1,所以我们希望输出的 y ^ \hat{y} y^ 能表示当前样本属于某类别的概率,而概率又介于 0 和 1 之间,这恰好和 sigmoid 函数的值域相符。所以在做二元分类的时候,输出层的激活函数可以选择 sigmoid。

    2)tanh 函数

    表达式: t a n h ( z ) = e z − e − z e z + e − z tanh(z) = \frac{e^z-e^{-z}}{e^z+e^{-z}} tanh(z)=ez+ezezez

    函数图像:
    在这里插入图片描述
    如果选择 tanh 作为隐藏层的激活函数,效果几乎总是比 sigmoid 函数要好,因为 tanh 函数的输出介于 -1 与 1 之间,激活函数的平均值就更接近于 0,而不是 0.5,这让下一层的学习更加方便一点。

    和 sigmoid 函数类似,当因变量 z z z 取值为 0 时,tanh 曲线的斜率(梯度)最大,计算出来为 1。当因变量 z z z 的取值越大或越小时,sigmoid 曲线的斜率(梯度)就越小。所以 tanh 也会面临和 sigmiod 函数同样的问题:当 z z z 很大或很小时,tanh 曲线的斜率(梯度)几乎为零,这对于执行梯度下降算法十分不利。

    3)ReLU 函数

    表达式: R e L U ( z ) = m a x ( 0 , z ) ReLU(z) = max(0,z) ReLU(z)=max(0,z)

    函数图像:
    在这里插入图片描述
    目前在机器学习中最受欢迎的激活函数是 ReLU (Rectified Linear Unit),即修正线性单元。现在 ReLU 已经成为了隐层激活函数的默认选择。如果不确定隐层应该使用哪个激活函数,可以先尝试一下 ReLU。

    z z z > 0 时,曲线斜率为 1;当 z z z < 0 时,曲线的斜率为 0;当 z z z = 0 时,曲线不可导,斜率就失去了意义,但在实际编程的时候可以令其为 1 或 0,尽管在数学上这样不正确,但不必担心,因为出现 z z z = 0 的概率非常非常小。ReLu函数的好处在于对于大部分的 z z z,激活函数的斜率(导数)和 0 差很远。所以在隐层中使用 ReLU 激活函数,神经网络的学习速度通常会快很多。ReLU 也有一个缺点,那就是当 z z z 为负数时,ReLU 曲线的斜率为 0,不过这在实践中不会有什么问题,因为有足够多的隐层节点使 z z z 大于 0。

    4)Leaky-ReLU 函数

    表达式: R e L U ( z ) = m a x ( k z , z )     , k 通 常 为 0.01 ReLU(z) = max(kz,z) \ \ \ ,k通常为0.01 ReLU(z)=max(kz,z)   ,k0.01

    函数图像:
    在这里插入图片描述
    通过前面对 ReLU 的介绍我们知道了 ReLU 函数的缺点:当 z z z 为负数时,ReLU 曲线的导数为 0。而 Leaky-ReLU 则是另一个版本的 ReLU,当当 z z z 为负数时,Leaky-ReLU 曲线的导数不再为 0,而是有一个平缓的斜率。这通常比 ReLU 要好,不过实际中使用的频率却不怎么高。

    5)线性激活函数与线性层

    到现在为止,我们讨论的都是非线性的激活函数。那么什么时候我们可以使用线性激活函数或者线性的层呢?通常其用处不是很多,当想要处理一些关于压缩的特殊问题时,可以在隐藏层中使用,或者处理回归问题在输出层中使用。除此之外,基本上没有其他地方能用到线性激活函数或者线性的层了。

    2.2 为什么要用非线性的激活函数

    先来看一看正常情况下,使用非线性激活函数 g ( z ) g(z) g(z) 的神经网络完成正向传播的计算表达式:
    在这里插入图片描述
    现在,我们去掉激活函数 g [ 1 ] ( z [ 1 ] ) g^{[1]}(z^{[1]}) g[1](z[1]) g [ 2 ] ( z [ 2 ] ) g^{[2]}(z^{[2]}) g[2](z[2]),网络中的两个层就变成了线性层。正向传播的表达式就变成了

    z [ 1 ] = W [ 1 ] x + b [ 1 ] z^{[1]}=W^{[1]}x+b^{[1]} z[1]=W[1]x+b[1] z [ 2 ] = W [ 2 ] z [ 1 ] + b [ 2 ] z^{[2]}=W^{[2]}z^{[1]}+b^{[2]} z[2]=W[2]z[1]+b[2]

    再把两个式子合并为一个

    z [ 2 ] = W [ 2 ] ( W [ 1 ] x + b [ 1 ] ) + b [ 2 ] = ( W [ 2 ] W [ 1 ] ) x + ( W [ 2 ] b [ 1 ] + b [ 2 ] ) z^{[2]} = W^{[2]}(W^{[1]}x+b^{[1]})+b^{[2]} = (W^{[2]}W^{[1]})x+(W^{[2]}b^{[1]}+b^{[2]}) z[2]=W[2](W[1]x+b[1])+b[2]=(W[2]W[1])x+(W[2]b[1]+b[2])

    W ′ = W [ 2 ] W [ 1 ] W&#x27;=W^{[2]}W^{[1]} W=W[2]W[1] b ′ = W [ 2 ] b [ 1 ] + b [ 2 ] b&#x27;=W^{[2]}b^{[1]}+b^{[2]} b=W[2]b[1]+b[2]

    z [ 2 ] = W ′ x + b ′ z^{[2]} = W&#x27;x+b&#x27; z[2]=Wx+b

    通过上面的推倒可以看到,对于输入神经网络的线性组合 x x x,在去掉激活函数后,先经过第一个隐层的计算,然后神经网络在输出层最终输出的 z [ 2 ] z^{[2]} z[2] 还是一个线性组合。这样的话还不如把输出层的参数设置为 W ′ W&#x27; W b ′ b&#x27; b,然后直接去掉隐层。也就是说,无论有多少个线性隐层,最终的输出还是一个线性组合,还不如不要隐层,因为多个线性函数的组合还是一个线性函数。那么要是所有隐层都去掉非线性激活函数,而在输出层保留一个 sigmoid 函数呢?它的效果和没有任何隐层的逻辑回归是一样的。

    3 网络参数初始化

    3.1 随机初始化

    在逻辑回归的问题中,把权重参数初始化为零是可行的。但把神经网络的权重参数全部初始化为零,并使用梯度下降算法将无法获得预期的效果。
    在这里插入图片描述
    以上面这个简单的神经网络为例。其与隐藏层关联的权重矩阵 W [ 1 ] W^{[1]} W[1] 是一个 2 x 2 的矩阵。现在将这个矩阵的初始值都设为 0,同样我们将偏置矩阵 b [ 1 ] b^{[1]} b[1] 的值也都初始化为 0。 b [ 1 ] b^{[1]} b[1] 的初始值全为 0 不会影响最终结果,但是将权重参数矩阵 W [ 1 ] W^{[1]} W[1] 初始值都设为 0 会引起下面的问题。

    无论输入什么样的特征向量 x x x,当进行前向传播的计算时, a 1 [ 1 ] a_1^{[1]} a1[1] a 2 [ 1 ] a_2^{[1]} a2[1] 是相等的,所以他们隐层的两个节点对输出层唯一节点的影响也是相同的。当进行反向传播的计算时,也会导致代价函数对 W 1 [ 1 ] W_1^{[1]} W1[1] W 2 [ 1 ] W_2^{[1]} W2[1] 的偏导不会有差别。所以在更新参数后, W 1 [ 1 ] W_1^{[1]} W1[1] W 2 [ 1 ] W_2^{[1]} W2[1] 还是相等的。这又导致在进入下一次迭代后,依然是重蹈覆辙。

    在上面这个例子中,隐藏层中上面的节点和下面的节点是相同的,它们实现的是完全相同的功能。在机器学习中,这种情形被称为是“对称”的。当把神经网络的权重参数全部初始化为 0 后,无论运行梯度下降多长时间,所有的隐藏神经元都将依然是“对称”的。这种情况下,再多的隐层节点也是无用的,因为它们依然提供的是完全相同的功能,这并不能给我们带来任何帮助。 所以我们希望两个不同的隐藏单元能实现不同的功能 ,而进行随机初始化能够解决这个问题。

    3.2 初始值的大小

    利用python编写神经网络时,通常使用 W[i] =np.random.randn((rows,cols))*0.01 这样的方式来对所有的权重矩阵 W 进行随机初始化并乘上一个非常小的数,比如 0.01。这样操作后,就将权重参数矩阵赋予了非常小的随机初始值。对于 b 来说,b并不会由于初始值为零而产生对称问题,所以使用 b[i]=np.zeros((rows,1)) 这样的方式来对所有的偏置矩阵 b 初始化为零。

    现在权重参数矩阵 W 已经完成了随机初始化,不同的隐藏单元会承担不同的计算工作,我们也不会再遇到类似前面说的对称问题了。那么为什么会在初始化 W 的时候使用 0.01 这个常量? 为什么是 0.01 而不把它设置为 100 或 1000?当在网络中用到了 tanh 或sigmoid 激活函数时,如果 W 很大,那么 Z = W T x + b Z=W^Tx+b Z=WTx+b(的绝对值)也相应的会非常大,而此时 A = s i g m o i d ( Z ) A=sigmoid(Z) A=sigmoid(Z) A = t a n h ( Z ) A= tanh(Z) A=tanh(Z) 图像对应的部分的斜率就非常小,这意味着梯度下降会非常缓慢,所以整个学习过程也会变得尤为缓慢。而如果在神经网络中未使用任何sigmoid或者tanh激活函数,这种情况可能不明显。

    有时候会有比 0.01 更为合适的数值,当训练一个仅含一个隐藏层的神经网络时,显而易见 0.01 这个数值在类似于这样不含过多隐藏层的浅层神经网络中是非常合适的。但当你要训练一个非常非常复杂的深度神经网络时,可以通过尝试使用不同的数值并观察梯度下降的结果来确定最适合的数值。

    4 神经网络的梯度下降算法

    4.1 梯度下降大概步骤

    神经网络同样可以使用梯度下降算法来更新网络的参数 W 和 b。具体来说就是通过多次迭代,一步一步通过更新神经网络每一层节点的参数来减小神经网络输出的误差,最终误差达到最小时的参数就是我们要寻找的参数。大概步骤为:

    在循环中完成:
        1、前向传播:从第一层到输出层,逐层计算网络输出;
        2、计算代价函数;
        3、反向传播:从输出层到第一层,逐层计算各层的梯度 ∂ J ∂ W \frac{\partial{J}}{\partial{W}} WJ ∂ J ∂ b \frac{\partial{J}}{\partial{b}} bJ
        4、更新参数: W = W − ∂ J ∂ W W=W-\frac{\partial{J}}{\partial{W}} W=WWJ , b = b − ∂ J ∂ b b=b-\frac{\partial{J}}{\partial{b}} b=bbJ .

    4.2 前向传播与反向传播的计算

    假设这里有一个 L L L 层的神经网络,不同的层激活函数可以不一样,我们用 g [ i ] ( Z [ i ] ) g^{[i]}(Z^{[i]}) g[i](Z[i])表示第 i 层的激活函数。则在前向传播中,前一层的输出作为后一层的输入,一层一层的计算直至输出 A [ L ] A^{[L]} A[L],如下图所示。
    在这里插入图片描述
    假设我们现在还是做一个二分类任务,则输出层的选择 sigmoid 激活函数,即 g [ L ] ( z [ L ] ) = s i g m i o d ( z [ L ] ) g^{[L]}(z^{[L]}) = sigmiod(z^{[L]}) g[L](z[L])=sigmiod(z[L])。然后代价函数我们定义为:

    J = − 1 m ∑ i = 1 m ( y [ L ] ( i ) log ⁡ a [ L ] ( i ) + ( 1 − y [ L ] ( i ) ) log ⁡ ( 1 − a [ L ] ( i ) ) ) J = -\frac{1}{m}\sum_{i=1}^{m}(y^{[L](i)}\log{a^{[L](i)}}+(1-y^{[L](i)})\log{(1-a^{[L](i)})}) J=m1i=1m(y[L](i)loga[L](i)+(1y[L](i))log(1a[L](i)))

    则在后向传播中,我们通过链式求导法则从后向前一层一层的计算代价函数对 W W W b b b 的偏导 ∂ J ∂ W \frac{\partial{J}}{\partial{W}} WJ ∂ J ∂ b \frac{\partial{J}}{\partial{b}} bJ。下图展示了反向传播的计算过程。(注意:为了书写方便,下图用符号 d d d 表示对代价函数 J J J 某个变量的偏导。比如 d z dz dz 表示 ∂ J ∂ z \frac{\partial{J}}{\partial{z}} zJ)。
    在这里插入图片描述

    4.3 各个矩阵或向量的尺寸

    需要注意的是,向量化计算对参与运算的矩阵或向量的尺寸十分敏感。在运算时,我们需要对各个矩阵或向量的尺寸有十分清楚的了解。假如: x x x 是一个包含 n 个特征值的列向量,且样本集包含 m 个样本,网络的第 i 层有 n [ i ] n^{[i]} n[i] 个节点,则各个矩阵或向量的尺寸为:

    X X X n ∗ m n*m nm
    Y Y Y 1 ∗ m 1*m 1m
    W [ i ] W^{[i]} W[i] n [ i ] ∗ n [ i − 1 ] n^{[i]}*n^{[i-1]} n[i]n[i1]
    b [ i ] b^{[i]} b[i] n [ i ] ∗ 1 n^{[i]}*1 n[i]1
    Z [ i ] Z^{[i]} Z[i] n [ i ] ∗ m n^{[i]}*m n[i]m
    A [ i ] A^{[i]} A[i] n [ i ] ∗ m n^{[i]}*m n[i]m

    另外在反向传播中,代价函数对某个矩阵的偏导得到的梯度矩阵与这个矩阵的尺寸是一致的,即:

    d W [ i ] dW^{[i]} dW[i] W [ i ] W^{[i]} W[i] 的尺寸一致;
    d b [ i ] db^{[i]} db[i] b [ i ] b^{[i]} b[i] 的尺寸一致;
    d Z [ i ] dZ^{[i]} dZ[i] Z [ i ] Z^{[i]} Z[i] 的尺寸一致;
    d A [ i ] dA^{[i]} dA[i] A [ i ] A^{[i]} A[i] 的尺寸一致。

    展开全文
  • 全连接神经网络参数

    2018-07-31 04:50:12
    全连接神经网络参数,自用的,不要下载,下载就是坑。。。
  • 主要介绍了Python利用全连接神经网络求解MNIST问题,结合实例形式详细分析了单隐藏层神经网络与多层神经网络,以及Python全连接神经网络求解MNIST问题相关操作技巧,需要的朋友可以参考下
  • 神经网络入门ppt附IMDB影评感情倾向全连接神经网络分析案例(自编)
  • 几种主要的神经网络一、全连接神经网络二、前馈神经网络(Feedforward neural network,FNN)三、卷积神经网络(Convolutional Neural Network,CNN)四、循环神经网络(Recurrent neural network,RNN ) 一、...

    一、全连接神经网络

    顾名思义,全连接神经网络中,对n-1层和n层而言,n-1层的任意一个节点,都和第n层所有节点有连接。即第n层的每个节点在进行计算的时候,激活函数的输入是n-1层所有节点的加权,这个激活函数是非线性的。它的缺点就是权重太多了,计算量很大。
    它可作用于大多数场景。

    二、前馈神经网络(Feedforward neural network,FNN)

    前馈神经网络采用一种单向多层结构。其中每一层包含若干个神经元。在此种神经网络中,各神经元可以接收前一层神经元的信号,并产生输出到下一层。第0层叫输入层,最后一层叫输出层,其他中间层叫做隐含层(或隐藏层、隐层)。隐层可以是一层,也可以是多层。

    • 在前馈神经网络中,不同的神经元属于不同的层,每一层的神经元可以接受到前一层的神经元信号,并产生信号输出到下一层。第0层叫做输入层,最后一层叫做输出层,中间的叫做隐藏层,整个网络中无反馈,信号从输入层到输出层单向传播,可用一个有向无环图表示。在西瓜书5.2有提及。

    三、卷积神经网络(Convolutional Neural Network,CNN)

    卷积神经网络是一种具有局部连接,权重共享等特性的深层前馈神经网络。一般是由卷积层,汇聚层,全连接层交叉堆叠而成,使用反向传播算法进行训练。其有三个结构上的特征:局部连接,权重共享以及汇聚。这些特征使得卷积神经网络具有一定程度上的平移,缩放和旋转不变性。较前馈神经网络而言,其参数更少。

    卷积神经网络的输入为二维的像素整阵列,输出为这个图片的属性,当网络训练学习后,所输入的图片或许经过稍微的变换,但卷积神经网络还是可以通过识别图片局部的特征而将整个图片识别出来。

    • 数据输入层:该层要做的处理主要是对原始图像数据进行预处理,包括去均值(把输入数据各个维度都中心化为0,其目的就是把样本的中心拉回到坐标系原点上),归一化(幅度归一化到同样的范围);
      卷积计算层:相当于滤镜,将图片进行分块,对每一块进行特征处理,从而提取特征,这是最重要的一层。具体操作还未仔细学习。
      池化层:池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。通过对提取的高维特征进行降维,对于输入为图像的情况,这里最主要的作用应该就是压缩。
      全连接层:对空间排列的特征化成一维的向量。

    主要应用:计算机视觉,图像和视频分析的各种任务上,比如图像分类,人脸识别,物体识别,图像分割等,其准确率也远远超过了其他的人工神经网络。近年来,卷积神经网络也应用到自然语言处理和推荐系统等领域。

    四、循环神经网络(Recurrent neural network,RNN )

    • 循环神经网络是一类具有短期记忆能力的神经网络,在循环神经网络中,神经元不仅可以接受其他神经元的信息,还可以接受自身的信息,形成一个环路结构。在很多现实任务中,网络的输出不仅和当前的输入有关,也和过去一段时间的输出相关。

    从网络结构上,循环神经网络会记忆之前的信息,并利用之前的信息影响后面结点的输出。即:循环神经网络的隐藏层之间的结点是有连接的,**隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出。**类似于机器学习西瓜书的5.5.5介绍的Elman网络

    常用于文本填充、时间序列、语音识别等序列数据。

    展开全文
  • 全连接神经网络中,每相邻两层之间的节点都有边相连,于是会将每一层的全连接层中的节点组织成一列,这样方便显示连接结构。而对于卷积神经网络,相邻两层之间只有部分节点相连,为了展示每一层神经元的维度,一般...

    在这里大致说明以一下我在学习过程中的理解:

           卷积神经网络也是通过一层一层的节点组织起来的。和全连接神经网络一样,卷积神经网络中的每一个节点就是一个神经元。在全连接神经网络中,每相邻两层之间的节点都有边相连,于是会将每一层的全连接层中的节点组织成一列,这样方便显示连接结构。而对于卷积神经网络,相邻两层之间只有部分节点相连,为了展示每一层神经元的维度,一般会将每一层卷积层的节点组织成一个三维矩阵。

           除了结构相似,卷积神经网络的输入输出以及训练的流程和全连接神经网络也基本一致,以图像分类为列,卷积神经网络的输入层就是图像的原始图像,而输出层中的每一个节点代表了不同类别的可信度。这和全连接神经网络的输入输出是一致的。类似的,全连接神经网络的损失函数以及参数的优化过程也都适用于卷积神经网络。因此,全连接神经网络和卷积神经网络的唯一区别就是神经网络相邻两层的连接方式。

          但是,通过我后面的学习,我发现全神经网络无法很好地处理好图像数据,然而卷积神经网络却很好地客服了这个缺点,使用全连接神经网络处理图像的最大问题就是:全连接层的参数太多,对于MNIST数据,每一张图片的大小是28*28*1,其中28*28代表的是图片的大小,*1表示图像是黑白的,有一个色彩通道。假设第一层隐藏层的节点数为500个,那么一个全连接层的神经网络有28*28*500+500=392500个参数,而且有的图片会更大或者是彩色的图片,这时候参数将会更多。参数增多除了导致计算速度减慢,还很容易导致过拟合的问题。所以需要一个合理的神经网络结构来有效的减少神经网络中参数的个数。卷积神经网络就可以更好的达到这个目的。
     

    展开全文
  • 简单的全连接神经网络代码的实现,使用python
  • 卷积神经网络与全连接神经网络

    万次阅读 2018-05-02 16:00:49
    全连接神经网络中,每两层之间的节点都有边相连。 卷积神经网络也是通过一层一层的节点组织起来的,对于卷积神经网络,相邻两层之间只有部分节点相连。在卷积神经网络的前几层中,每一层的节点都被组织成一个三...

    1、定义

    全连接神经网络中,每两层之间的节点都有边相连。
    这里写图片描述
    卷积神经网络也是通过一层一层的节点组织起来的,对于卷积神经网络,相邻两层之间只有部分节点相连。在卷积神经网络的前几层中,每一层的节点都被组织成一个三维矩阵。前几层中每一个节点只和上一层中部分节点相连。

    2、卷积神经网络的结构组成

    1、输入层。输入层是整个神经网络的输入,在处理图像的卷积神经网络中,它一般代表了一张图片的像素矩阵。三维矩阵的长和宽代表了图像的大小,而三维矩阵的深度代表了图像的色彩通道(channel)。从输入层开始,卷积神经网络通过不同的神经网络结构将上一层的三维矩阵转换成下一层的三维矩阵,直至最后的全连接层。
    2、卷积层。和传统全连接层不同,卷积层中每个节点的输入只是上一层神经网络的一小块,这个小块常用的大小有3*3或者5*5.卷积层试图将神经网络中的每一小块进行更加深入的分析从而得到抽象程度更高的特征。一般来说通过卷积层处理过的节点矩阵会变得更深。
    3、池化层(Pooling)。池化层神经网络不会改变矩阵的深度,但是它可以缩小矩阵的大小。通过池化层可以进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络中参数的目的。
    4、全连接层。在经过多轮卷积层和池化层的处理之后,在卷积神经网络的最后一般会是由一到两个全连接层来给出最后的分类结果。
    5、softmax层。Softmax层主要用于解决分类问题,通过softmax层,可以得到当前样例属于不同种类的概率分布情况。
    这里写图片描述

    3、卷积层

    卷积层神经网络中最重要的部分被称为过滤器(filter)或者内核(kernel)。过滤器可以将当前层神经网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵。单位节点矩阵指的是一个长和宽都为1,但是深度不限的节点矩阵。
    过滤器所处理节点矩阵的长和宽是需要人工指定的,这个节点矩阵的尺寸也被称为过滤器的尺寸。常用的过滤器尺寸有3*3和5*5.因为过滤器处理的矩阵深度和当前层神经网络节点矩阵的深度是一致的,所以虽然节点矩阵是三维的,但是过滤器的尺寸只需要指定两个维度。过滤器中另一个需要人工指定的设置是处理得到的单位节点矩阵的深度,这个设置称为过滤器的深度。请注意,过滤器的尺寸指的是一个过滤器输入节点矩阵的大小,而深度指得是输出单位节点矩阵的深度。
    在卷积神经网络中,每一个卷积层使用的过滤器中的参数都是一样的,共享过滤器参数可以使得图像上的内容不受位置的影响。共享每一个卷积层的参数还可以巨幅减少神经网络上的参数。所以卷积层的参数个数要远远小于全连接层。而且卷积层的参数个数和图片的大小无关,它只和过滤器的尺寸、深度以及当前节点矩阵的深度有关。
    这里写图片描述

    4、池化层

    在卷积层之间往往会加上一个池化层,池化层可以非常有效的减少矩阵的尺寸(主要用于减少矩阵的长和宽,虽然也可以减少矩阵深度,但是实践中一般不会这样使用),从而有效减少最后全连接层中的参数。所以池化层可以既加快计算速度还可以防止过拟合。
    池化层过滤器中的计算不是节点的加权和,而是采用更加简单的最大值或者平均值计算。使用最大值操作的池化层被称为最大池化层,使用平均值操作的池化层被称为平均池化层。
    池化层的过滤器也需要人工设置过滤器的尺寸,需要指定长和宽。卷积层和池化层中过滤器的移动方式是相似的,唯一的区别在于卷积层使用的过滤器是横跨整个深度的,而池化层使用的过滤器只影响一个深度上的节点。所以池化层的过滤器除了在长和宽两个维度上移动之外,它还需要在深度这个维度上移动。
    这里写图片描述

    5、tensorflowAPI接口

    1、卷积层

    tf.nn.conv2d(
    input,
    filter,
    strides,
    padding,
    use_cudnn_on_gpu=True,
    data_format=’NHWC’,
    dilations=[1, 1, 1, 1],
    name=None
    )

    Args:

    • input:一个4维张量,维度顺序根据data_format进行解释
    • filter:一个四维张量的形状 [filter_height, filter_width, in_channels, out_channels]
    • strides:int, 1维张量长度4,input中每个维度的滑动窗口的步幅,尺寸顺序由data_format决定
    • padding:要使用的填充算法的类型,取值为”SAME”或者”VALID”,其中VALID表示不使用全0填充,SAME表示使用全0填充
    • use_cudnn_on_gpu:可选bool,默认为True
    • data_format:指定输入和输出数据的数据格式,取值为”NHWC”或者 “NCHW”,默认为”NHWC”。使用默认格式“NHWC”,数据按照[batch,height,width,channels]的顺序存储;“NCHW”时,数据存储顺序为:[batch,channels,height,width]

    2、池化层

    tf.nn.max_pool(
    value,
    ksize,
    strides,
    padding,
    data_format=’NHWC’,
    name=None
    )

    Args:

    • value:由data_format指定格式的4-D Tensor
    • ksize:4元素的1-D int张量,输入张量的每个维度的窗口大小。
    • strides:4元素的1-D int张量,输入张量的每个维度的滑动窗口的步幅
    • padding:’VALID’或者’SAME’,填充算法
    • data_format:’NHWC’,’NCHW’和’NCHW_VECT_C’被支持。
    • name:操作的可选名称

    3、seqGAN实例代码:

    filter_shape = [filter_size, embedding_size, 1, num_filter]
    W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
    b = tf.Variable(tf.constant(0.1, shape=[num_filter]), name="b")
    
    conv = tf.nn.conv2d(
                self.embedded_chars_expanded,   
                # [batch_size, sequence_length, embedding_size, 1]
                W,
                strides=[1, 1, 1, 1],
                padding="VALID",
                name="conv")   
    # [batch_size, sequence_length-filter_size+1, 1, num_filter]
    
    # Apply nonlinearity
    h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
    
    # Maxpooling over the outputs
    pooled = tf.nn.max_pool(
                        h,
                        ksize=[1, sequence_length - filter_size + 1, 1, 1],
                        strides=[1, 1, 1, 1],
                        padding='VALID',
                        name="pool")  # [batch_size, 1, 1, num_filter]
    展开全文
  • 全连接神经网络中,每相邻两层之间的节点都有边相连,于是会将每一层的全连接层中的节点组织成一列,这样方便显示连接结构。而对于卷积神经网络,相邻两层之间只有部分节点相连。 卷积神经网络的优点 用全连接神经...
  • 深度学习1---最简单的全连接神经网络

    万次阅读 多人点赞 2018-02-14 02:36:04
     最简单的全连接神经网络如下图所示(这张图极其重要,本文所有的推导都参照的这张图,如果有兴趣看推导,建议保存下来跟推导一起看):  它的前向传播计算过程非常简单,这里先讲一下: 前向传播   Y1=f...
  • 全连接神经网络FCN到LSTM

    千次阅读 2019-09-25 20:46:37
    本文主要介绍了深度学习的发展:从感知机、Fisher判别分析,到全连接神经网络、BP神经网络、CNN、RNN、SLTM等等
  • 本文将描述如何用Python实现多层全连接神经网络。本系列第一篇和第二篇都是以一个神经元为基本单位用Python实现功能并对前向计算和误差反向传播做实验分析。但是在实际的使用中,单个神经元是无法作为“深度神经网络...
  • 单隐层全连接神经网络原理

    千次阅读 2019-11-06 19:16:32
    单隐层全连接神经网络原理 本文主要介绍全连接网络的前向传播和后向传播过程的详细推导,没有用到矩阵求导的相关知识,只用了最基本的线性代数和微积分理论,同时最好先了解下python的广播机制。 csdn上的公式编辑器...
  • 全连接神经网络matlab实现

    千次阅读 2017-03-13 20:27:34
    闲来无事就用matlab实现了单层全连接神经网络,并对双螺旋样本进行了二分类。分类目标任务主要是对如下图所示的样本数据进行二分类。由于样本分布呈螺旋形(不是线性可分问题),所以神经网络的权重模型选取可以为非...
  • 全连接神经网络(DNN)

    千次阅读 2018-11-18 20:22:00
    全连接神经网络(DNN)是最朴素的神经网络,它的网络参数最多,计算量最大。 网络结构  DNN的结构不固定,一般神经网络包括输入层、隐藏层和输出层,一个DNN结构只有一个输入层,一个输出层,输入层和输出层之间的...
  • 全连接神经网络的二分类问题

    千次阅读 2020-04-25 15:50:03
    全连接神经网络在分类、回归预测问题上表现出极强的生命力。相比于传统的机器学习算法,神经网路的学习能力大大推动了人工智能往更智能更高效方向发展。人工神经网络(Artificial Neural Networks,简写为ANNs)也...
  • 什么是全连接神经网络

    千次阅读 2017-02-11 11:59:00
    什么是全连接神经网络
  • 深度学习二:使用TensorFlow搭建简单的全连接神经网络 学习《TensorFlow实战Google深度学习框架》一书 在前一篇博客中,学习了使用python搭建简单的全连接神经网络 深度学习一:搭建简单的全连接神经网络 这里...
  • 机器学习第三次小作业,要求实现全连接神经网络,RBF神经网络和CNN分类器,做了三天,终于把这些都弄得差不多明白了,利用Python和TensorFlow把这些实现一下,代码放这里做个记录(怕以后丢了忘了)。在这个过程中...
  • 使用tensorflow建立全连接神经网络实现手写数字识别 windows下安装任意版本的python和tensorflow均可运行 内含详细的代码环境修改说明 包括mnist数据集
  • FC全连接神经网络的理论教程参考 http://blog.csdn.net/luanpeng825485697/article/details/79009223 加载样本数据集 首先我们要有手写体的数据集文件 t10k-images.idx3-ubyte t10k-labels.idx1-ubyte train-...
  • 本文将介绍全连接神经网络(FCNet)的结构和训练方法,全连接神经网络是一种典型的前馈网络。感知机解决不了非线性分类问题,但是多层神经元叠加在一起理论上可以拟合任意的非线性连续函数映射。 全连接网络 全连接...
  • 全连接神经网络(fully connected neural network),顾名思义,就是相邻两层之间任意两个节点之间都有连接。全连接神经网络是最为普通的一种模型(比如和CNN相比),由于是全连接,所以会有更多的权重值和连接,因此...
  • 用TensorFlow搭建一个全连接神经网络

    千次阅读 2018-03-11 19:57:02
    用TensorFlow搭建一个全连接神经网络说明 本例子利用TensorFlow搭建一个全连接神经网络,实现对MNIST手写数字的识别。 先上代码from tensorflow.examples.tutorials.mnist import input_data import tensorflow as ...
  • MLP(多层感知器神经网络)即多层全连接神经网络模型。 from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential from keras.layers import Dense,Dropout,...
  • tensorflow是一个很好的深度学习框架,本文是作者在初学tensorflow2.0过程中学习的一个全连接神经网络程序,值得学习,故记录之。
  • 下面介绍下深度学习的基础——全连接神经网络(Full Connected Network)。1. 神经单元 神经元是一种感知器,神经网络由许多感知器组成,组成神经网络的几种主要单元包括简单感知器、线性感知器和sigmoid感知器等,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,115
精华内容 33,246
关键字:

全连接神经网络