全连接层一般由两个部分组成:线性部分和非线性部分,类似下图:
这是一个整体的全连接网络,其实从input layer到hidden layer1已经是一个完整的全连接层的转换过程,下面来看看细节。
- 线性部分:
对于输入层向量,其输出是hidden layer1设置为
,那么实际上它要转变为一个m维的向量,所以可以认为input layer需要乘上一个
的矩阵
,再加上一个偏置
即
给出个例子:

实际上要获得hidden layer1,还要把z进行一个变换,这是从数学原理来看的,但是我们只是知道它进行了一个这样的运算,却不知道其作用是什么,那再看一个例子:
对于入门的MNIST,其输入是一个28*28的二值图,输出为0-9其中一个数字,如下图所示:
这个应该是1,但是我们怎么判断出来呢,这些像素点对于机器来说只是二维矩阵,怎么把它和最终的取值联系起来?显然它们应该存在一定的关系,那我们把它展开形成一个28*28=784的一维向量作为输入,假设我们只有一层的话,那output layer为10个单元,运算如图所示:

对于每个像素点,我们给出一组权重,进行运算来获取最终的值,实际上我们也知道权重初始的时候是随机的,后续权重会通过反向传播自己学习,这个意义就是,我们从多个角度对输入的数据进行了分析和总结,这个的矩阵,一共十行,代表为每个取值的运算结果,每行有794个元素,代表对输入每个像素点的考量。
- 非线性部分
一般称之为激活函数,因为线性变化再怎么转变还是线性的,而很多情况并不是简单的一个线性的对应关系,那么它就很难拟合真是的场景,所以引入了非线性变化,例如sigmod函数等。结果线性变换得到的结果结果激活函数
即为hidden layer1的值,即:
然后hidden layer1又作为input 输入到下一层。
- 总结
实际上,在现在的网络架构中,一般都是前面是CNN,最后是几层全连接层,一个感兴趣的点是怎么从CNN转换到全连接层,另一个是为什么使用FCN,下面我思考一下。- CNN->FCN
现在假设CNN的最后输出是一个20*10*10的图像,全连接层的第一层为100个单元,是怎么做到从20*10*10到1*100呢,实际上,是由20*100个10*10的卷积核经过线性变换得到的,对于20个10*10的图像,我们也使用20个10*10的卷积核和它们相乘,这样我们得到了20*1*1的结果,把显然厚度为20,那么把20个1*1相加,即得到了一个单元的值,这样的运算做100次,即有1*100个单元。 - 全连接层的目的
传统的网络输出一般是分类,也就是几个类别的概率或者是是一个数表示那个类别,经过CNN后提取的已经是高度提纯的特征了,那么全连接层可以使用这些特征来进行分类或者回归,不过由于全连接层的参数太多了,目前的最新趋势是全局平均化。
- CNN->FCN
网友评论