卷积神经网络理论基础
当卷积函数中padding='same'时,会动态调整p值,确保o=w,即保证输入与输出一致。例如:输入是28*28*1,输出也为28*28*1。在步长(stride)为1时,输出的大小为(4-3+1)×(4-3+1)实例:7*7的input,3*3的kernel,无填充,步长为1,则。7*7的input,3*3的kernel,无填充,步长为2,则。也即output的size为5×5。,也即out
一 卷积输出层shape
4×4的输入矩阵 I 和3×3的卷积核 K :
在步长(stride)为1时,输出的大小为(4-3+1)×(4-3+1)
计算公式:
输入图片矩阵 I 大小:w×w
卷积核K:k×k
步长S:s
填充大小(padding):p
输出图片大小为:o×o
步长为2,卷积核为3×3,p=0的卷积情况如下:
当卷积函数中padding='same'时,会动态调整p值,确保o=w,即保证输入与输出一致。例如:输入是28*28*1,输出也为28*28*1
步长为1,卷积核为3×3,padding='same'时的卷积情况如下:
实例:7*7的input,3*3的kernel,无填充,步长为1,则
也即output的size为5×5
7*7的input,3*3的kernel,无填充,步长为2,则
,也即output的size为3*3
二 卷积层运算量的计算
对于第一个卷积过程的计算量计算过程如下:
首先,我们需要计算卷积层的参数量,对于一个卷积核大小为k×k,输入特征图大小为h×w×
,输出特征图大小为
的卷积层,其参数量为:
其中最后的
是bias的数量
对于本题,输入特征图大小为100×100×128,输出特征图大小为100×100×256,卷积核大小为5×5,且填充为2,步长为1,输出通道数为256。因此,每个卷积层的参数层为:
参数量ok了,那么FLOPs其实也是很简单的,遵循如下公式:
因此,经过具有256个输出的5×5卷积层之后,输出数据为100×100×256的计算量是约为8.192×
FLOPs
对于第二个卷积过程涉及的计算量计算过程如下:
首先考虑1×1卷积层的计算量。套用上面的公式,输入特征图大小为100×100×128,输出通道为32,因此经过1×1卷积层厚,输出大小为100×100×32,由于bias太小可以忽略不计,这里计算量为:
接下来考虑5×5卷积层的计算量,经过1×1卷积层厚,输出特征图大小为100×100×32,输入通道数为32,输出通道数为256,卷积核大小为5×5,填充为2,步长为1,bias可忽略,计算量为:
最后相加可以得出:
三 池化层理论
1.基本概念
在图像处理中,由于图像中存在较多冗余信息,可用某一区域子块的统计信息(如最大值或均值等)来刻画该区域中所有像素点呈现的空间分布模式,以替代区域子块中所有像素点取值,这就是卷积神经网络中池化(pooling)操作。
池化层可对提取到的特征信息进行降维,实现下采样,同时保留了特征图中主要信息,一方面使特征图变小,简化网络计算复杂度;另一方面进行特征压缩,提取主要特征,增加平移不变性,减少过拟合风险。但其实池化更多程度上是一种计算性能的一个妥协,强硬地压缩特征的同时也损失了一部分信息。
池化的几种常见方法包括:平均池化 与 最大池化。其中平均池化和最大池化如 图1 所示
● 平均池化: 计算区域子块所包含所有像素点的均值,将均值作为平均池化结果。如 图1(a),这里使用大小为
的池化窗口,每次移动的步长为2,对池化窗口覆盖区域内的像素取平均值,得到相应的输出特征图的像素值。池化窗口的大小也称为池化大小,用
表示。在卷积神经网络中用的比较多的是窗口大小为
,步长为2的池化。
● 最大池化: 从输入特征图的某个区域子块中选择值最大的像素点作为最大池化结果。如 图1(b),对池化窗口覆盖区域内的像素取最大值,得到输出特征图的像素值。当池化窗口在图片上滑动时,会得到整张输出特征图。
2.特点
当输入数据做出少量平移时,经过池化后的大多数输出还能保持不变,因此,池化对微小的位置变化具有鲁棒性。例如 图2 中,输入矩阵向右平移一个像素值,使用最大池化后,结果与平移前依旧能保持不变
由于池化之后特征图会变小,如果后面连接的是全连接层,能有效的减小神经元的个数,节省存储空间并提高计算效率
四 池化层计算
⭐torch.nn.MaxPool2d()详解
函数原型:
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
关键参数说明:
- kernel_size:最大的窗口大小
- stride:窗口的步幅,默认值为
kernel_size
- padding:填充值,默认为0
- dilation:控制窗口中元素步幅的参数,默认为1
池化层计算公式:
Input:(N, C, Hin, Win) or (C, Hin, Win)
Output:(N, C, Hout, Wout) or (C, Hout, Wout)
案例1:
import torch
import torch.nn as nn
m = nn.MaxPool2d(2)
input_x = torch.randn(3, 32, 32)
print("输入数据input_x.shape:",input_x.shape)
output = m(input_x)
print("输出数据output.shape:",output.shape)
输入数据input_x.shape: torch.Size([3, 32, 32])
输出数据output.shape: torch.Size([3, 16, 16])
📏推导分析:
输入的数据格式是:[3, 32, 32]即 [C*Hin*Win]
其中Hin=32,padding=0,dilation=1,kernel_size=2,stride=2,代入上面的公式可得Hout=16
同理,Wout=16,C保持不变,故而output.shape为 [3, 16, 16]。
案例2:
m = nn.MaxPool2d(3)
input_x = torch.randn(3, 32, 32)
print("输入数据input_x.shape:",input_x.shape)
output = m(input_x)
print("输出数据output.shape:",output.shape)
输入数据input_x.shape: torch.Size([3, 32, 32])
输出数据output.shape: torch.Size([3, 10, 10])
📏推导分析:
输入的数据格式是:[3, 32, 32]即 [C*Hin*Win]其中Hin=32,padding=0,dilation=1,kernel_size=3,stride=3,代入上面的公式可得Hout=10
同理,Wout=10,C保持不变,故而output.shape为 [3, 10, 10]。
更多推荐
所有评论(0)