全连接层

全连接层

参考文章

全连接层详解-CSDN博客

全连接层定义

全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。在实际使用中,全连接层可由卷积操作实现:

上图中我们可以看到,左侧的每一个点在右侧都有连接,这就是全连接层。

怎么理解全连接层

假设你是一只小蚂蚁,你的任务是找小面包。你的视野还比较窄,只能看到很小一片区域。当你找到一片小面包之后,你不知道你找到的是不是全部的小面包,所以你们全部的蚂蚁开了个会,把所有的小面包都拿出来分享了。全连接层就是这个蚂蚁大会~

进一步理解

全连接层就是,忽略检测目标所在的位置,仅仅是知道这张图里边有这个目标就行

全连接层的作用

通过特征提取,实现分类

我们现在的任务是去区别一图片是不是猫

image-20240929105159638

假设这个神经网络模型已经训练完了,全连接层已经知道

image-20240929105230164

当我们得到以上特征,我就可以判断这个东东是猫了。

因为全连接层的作用主要就是实现分类(Classification)

image-20240929105325055

红色的神经元表示这个特征被找到了(激活了)

同一层的其他神经元,要么猫的特征不明显,要么没找到

当我们把这些找到的特征组合在一起,发现最符合要求的是猫

ok,我认为这是猫了

这细节特征又是怎么来的?

就是从前面的卷积层,下采样层来的

全连接层的注意层面

全连接层参数特多(可占整个网络参数80%左右)

那么全连接层对模型影响参数就是三个:

  1. 全接解层的总层数(长度)
  2. 单个全连接层的神经元数(宽度)
  3. 激活函数

首先我们要明白激活函数的作用是:增加模型的非线性表达能力

image-20240929110610955

torch代码小结

以下设置了三个全连接层,大家留意每一层的filter

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
def __init__(self):
#nn.Module子类的函数必须在构建函数中执行父类的构造函数
#下式等价于nn.Module.__init__(self)
super(Net, self).__init__()
#卷积层“1”表示输入图片为单通道,“6”表示输出通道数,‘5’表示卷积核为5*5
self.conv1 = nn.Conv2d(1, 6, 5)
#卷积层
self.conv2 = nn.Conv2d(6, 16, 5)
#全连接层,y=Wx+b
self.fc1 = nn.Linear(16*5*5, 120)
#参考第三节,这里第一层的核大小是前一层卷积层的输出和核大小16*5*5,一共120层
self.fc2 = nn.Linear(120, 84)
#接下来每一层的核大小为1*1
self.fc3 = nn.Linear(84, 10)

def forward(self, x):
#卷积--激活--池化
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
#reshape ,'-1'表示自适应
x = x.view(x.size()[0], -1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3
return x

net = Net()
print(net)

self.fc1 = nn.Linear(1655, 120)
#参考第三节,这里第一层的核大小是前一层卷积层的输出和核大小1655,一共120层
self.fc2 = nn.Linear(120, 84)
#接下来每一层的核大小为1*1
self.fc3 = nn.Linear(84, 10)

Net(
(conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
(fc1): Linear(in_features=400, out_features=120, bias=True)
(fc2): Linear(in_features=120, out_features=84, bias=True)
(fc3): Linear(in_features=84, out_features=10, bias=True)
)