神经网络中全连接层
发布日期:2021-06-29 21:37:09 浏览次数:2 分类:技术文章

本文共 2448 字,大约阅读时间需要 8 分钟。

1、全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。对于卷积神经网络CNN来说,全连接层之前的作用是提取特征,全连接层的作用是分类。

在这里插入图片描述
在这里插入图片描述
从上图,可以看出:

红色的神经元表示这个特征被找到了(激活了),同一层的其他神经元,要么猫的特征不明显,要么没找到。

当我们把这些找到的特征组合在一起,发现最符合要求的是猫,则认为这是猫了!
2、 全连接层为什么大部分是两层 ?
线性部分:主要做线性转换,输入用X表示,输出用Z表示
非线性部分:那当然是做非线性变换了,输入用线性部分的输出Z表示,输出用X表示。

只用一层fully connected layer 有时候没法解决非线性问题,而如果有两层或以上fully connected layer就可以很好地解决非线性问题了。一般全连接两层包含线性层和非线性层,那么为什么需要非线性层呢?

线性部分
线性部分的运算方法基本上就是线性加权求和的感觉,如果对于一个输入向量 x = [ x 0 , x 1 , . . . x n ] T x=[x_0,x_1,...x_n]^T x=[x0,x1,...xn]T,线性部分的输出向量是 z = [ z 0 , z 1 , . . . z m ] T z=[z_0,z_1,...z_m]^T z=[z0,z1,...zm]T,那么线性部分的参数就可以想象一个m*n的矩阵W,再加上一个偏置项 b = [ b 0 , x 1 , . . . b m ] T b=[b_0,x_1,...b_m]^T b=[b0,x1,...bm]T,于是有:
W ∗ x + b = z \pmb{W*x + b = z} Wx+b=zWx+b=zWx+b=z
线性部分做了什么事情呢?简单来说就是对输入数据做不同角度的分析,得出该角度下对整体输入数据的判断。

这么说有点抽象,举一个实际点的例子,就拿CNN的入门case——MNIST举例。MNIST的例子在此不多说了,它是一个手写数字的识别项目,输入是一张28 * 28的二值图,输出是0-9这是个数字,这里假设我们采用完全全连接的模型,那么我们的输入就是28 * 28=784个像素点。数据显示到屏幕上大概是这个样子:

在这里插入图片描述
对于我们来说,这个像素点都太过于抽象了,我们无法判断这些像素点的取值和最终识别的关系:

他们是正相关还是负相关?

很显然,像素点之间是存在相关关系的,这个关系具体是什么我们后面再说,但存在关系这件事是板上钉钉的。所以只给每一个像素点一个权重是解决不了问题的,我们需要多组权重。

我们可以

1)在第一组权重中给第一个像素一个正数,第二个也是正数,

2)在第二组权重中给第一个像素负数,而第二个还是正数……

这样,我们相当于从多个角度对输入数据进行分析汇总,得到了多个输出结果,也就是对数据的多种评价。

非线性部分

非线性部分有一些“套路”函数,这里只说下其中的一个经典函数——sigmoid。它的函数形式如下所示:
f ( x ) = 1 ( 1 + e − x ) f(x)=\frac{1}{(1+e^{-x})} f(x)=(1+ex)1
图像如下所示:
在这里插入图片描述
这个函数的输入正是我们上一步线性部分的输出z,此时z取值范围在 ( − ∞ , ∞ ) (-\infty,\infty) (,),经过了这个函数就变成了 ( 0 , 1 ) (0,1) (0,1)

那非线性部分为什么要做这个函数转换呢?以我的粗浅理解,其中的一个作用就是作数据的归一化。不管前面的线性部分做了怎样的工作,到了非线性这里,所有的数值将被限制在一个范围内,这样后面的网络层如果要基于前面层的数据继续计算,这个数值就相对可控了。不然如果每一层的数值大小都不一样,有的范围在 ( 0 , 1 ) (0,1) (01),有的在 ( 0 , 10000 ) (0,10000) (0,10000),做优化的时候优化步长的设定就会有麻烦。

另外一个作用,就是打破之前的线性映射关系。如果全连接层没有非线性部分,只有线性部分,我们在模型中叠加多层神经网络是没有意义的,我们假设有一个2层全连接神经网络,其中没有非线性层,那么:

对于第一层有: W 0 ∗ x 0 + b 0 = z 1 \boldsymbol{W^0*x^0+b^0 = z^1} W0x0+b0=z1
对于第二层有: W 1 ∗ x 1 + b 1 = z 2 \boldsymbol{W^1*x^1+b^1 = z^2} W1x1+b1=z2
两式合并,有
W 1 ∗ ( W 0 ∗ x 0 + b 0 ) + b 1 = z 2 \boldsymbol{W^1*(W^0*x^0+b^0)+ b^1 = z^2} W1(W0x0+b0)+b1=z2
W 1 ∗ W 0 ∗ x 0 + ( W 1 ∗ b 0 + b 1 ) = z 2 \boldsymbol{W^1*W^0*x^0+(W^1*b^0+b^1) = z^2} W1W0x0+(W1b0+b1)=z2
所以我们只要令 W 0 ′ = W 1 ∗ W 0 , b 0 ′ = W 1 ∗ b 0 + b 1 \boldsymbol{W^{0^{'}}=W^1*W^0 , b^{0^{'}}=W^1*b^0+b^1} W0=W1W0,b0=W1b0+b1,就可以用一层神经网络表示之前的两层神经网络了。所以非线性层的加入,使得多层神经网络的存在有了意义。
另外还有一个比较有名的非线性函数,叫做双曲正切函数。它的函数形式如下所示:
在这里插入图片描述
在这里插入图片描述
这个长得很复杂的函数的范围是 ( − 1 , 1 ) (-1,1) (1,1)。可以看出,它的函数范围和前面的sigmoid不同,它是有正有负的,而sigmoid是全为正的。
参考链接:
1、
2、

转载地址:https://dh-butterfly.blog.csdn.net/article/details/108407349 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:MYSQL性能优化(索引优化)
下一篇:Spring系列 官方文档(中文翻译)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月18日 10时07分56秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章