k这一篇文章将在最基础的卷积神经网络的机构上做一些优化使其效率更高。
首先我们说明一下CNN和FNN比的优势
参数量:CNN是权值共享,参数较少(w)
通道:全连接是NV结构(压缩降维),卷积的channel会逐渐增多(把失去的数据补充回来,在c上体现)
一、 填充(padding)
前面可以发现,输入图像与卷积核进行卷积后的结果中损失了部分值,输入图像的边缘被“修剪”掉了(边缘处只检测了部分像素点,丢失了图片边界处的众多信息)。这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外。这个结果我们是不能接受的,有时我们还希望输入和输出的大小应该保持一致。为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“0”来进行填充的,如下图所示:
通过填充的方法,当卷积核扫描输入数据时,它能延伸到边缘以外的伪像素,从而使输出和输入size相同。
常用的两种padding:
(1)valid padding:不进行任何处理,只使用原始图像,不允许卷积核超出原始图像边界
(2)same padding:进行填充,允许卷积核超出原始图像边界,并使得卷积后结果的大小与原来的一致
代码实现:
import torch
import torch.nn as nn
#不使用填充
no_padding_layer = nn.Conv2d(1, 1, 3, 1, padding=0, bias=False)
x = torch.randn(1, 1, 5, 5)#输入为NCHW
y = no_padding_layer(x)
print(y.shape)#1,1,3,3
#使用填充
padding_layer = nn.Conv2d(1, 1, 3, 1, padding=1, bias=False)
y1= padding_layer(x)
print(y1.shape)#1,1,5,5
</