全连接层的缺点在于其会破坏图像的空间结构,因此人们开始使用卷积层来代替全连接层,通常采用1x1的卷积核,这种不包含全连接层的神经网络就是全卷积神经网络(FCN)。FCN最初是用于图像分割任务,之后开始在计算机视觉领域的各种任务上都得到应用。FCN的特点就在于输入和输出都是二维的,并且输入和输出具有相对应的空间结构,在这种情况下,我们可以将FCN的输出看作是一种热度图,用热度来指示检测的目标的区域。在目标所处的区域显示较高的热度,而在背景区域显示较低的热度,这也可以看成是对图像上的每一个像素点都进行了分类,这个点是否位于待检测的目标上。(摘自)
全连接层和卷积层之间不同在于: 1)卷积核中的权值每次滑动计算时只是局部连接,且可以共享参数,而全连接层神经元的权值与所有输入相连,产生的参数量远大于卷积层的。 2)全连接层使得神经网络只能输入固定尺寸的图像,而全卷积神经网络可输入任意尺寸的图像。 3)全连接层会破坏图像的空间结构,而卷积层不会破坏图像的空间结构。
代码(pytorch)
全连接层:fc = nn.Linear(512,1000)
转卷积层:
fc2conv = nn.Sequential(
nn.Dropout(0.5),
nn.Conv2d(512, 1000, kernel_size=1), # 512x1000xWxH
nn.ReLU(inplace=True),
nn.AdaptiveAvgPool2d((1, 1)) # 512x1000x1x1
)
def forward(self, input):
out = cnn(input)
out = fc2conv(out)
out = torch.flatten(out, 1) # 512x1000
return out
|