Pytorch中卷积使用的一些总结

  • torch.nn
  • nn.Conv2d
  • nn.maxpool2d
  • nn.Avg_pool
  • 空间金字塔池化(Spatial Pyramid Pooling)
  • 卷积神经网络——输入层、卷积层、激活函数、池化层、全连接层


torch.nn

nn.Conv2d

  nn.Conv2d 输入信号的形式为(N,Cin,H,W),N表示batch size,Cin表示channel个数,H,W分别表示特征图的高和宽。

参数说明:

stride(步长):控制cross-correlation的步长,可以设为1个int型数或者一个(int, int)型的tuple。

padding(补0):控制zero-padding的数目。

dilation(扩张):控制kernel点(卷积核点)的间距; 也被称为 "à trous"算法. 可以在此github地址查看:[Dilated convolution animations](https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md)

groups(卷积核个数):这个比较好理解,通常来说,卷积个数唯一,但是对某些情况,可以设置范围在1 —— in_channels中数目的卷积核:
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

  参数中dilation=1时采取的是5x5的空洞卷积操作,参数中dilation=2时采取的是7x7的空洞卷积操作。

  参数kernel_size,stride,padding,dilation也可以是一个int的数据,此时卷积height和width值相同;也可以是一个tuple数组,tuple的第一维度表示height的数值,tuple的第二维度表示width的数值。经常使用二维的kernel_size如(3,5),是tuple数组

参数

in_channels(int) – 输入信号的通道
out_channels(int) – 卷积产生的通道
kerner_size(int or tuple) - 卷积核的尺寸,在nlp中tuple用更多,(n,embed_size)
stride(int or tuple, optional) - 卷积步长
padding(int or tuple, optional) - 输入的每一条边补充0的层数
dilation(int or tuple, optional) – 卷积核元素之间的间距
groups(int, optional) – 从输入通道到输出通道的阻塞连接数
bias(bool, optional) - 如果bias=True,添加偏置

nn.maxpool2d

卷积操作中 pool层是比较重要的,是提取重要信息的操作,可以去掉不重要的信息,减少计算开销。

class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

  如果padding不是0,会在输入的每一边添加相应数目0 比如padding=1,则在每一边分别补0 ,其实最后的结果补出来是bias

参数:

①kernel_size(int or tuple) - max pooling的窗口大小,可以为tuple,在nlp中tuple用更多,(n,1)
②stride(int or tuple, optional) - max pooling的窗口移动的步长。默认值是kernel_size
③padding(int or tuple, optional) - 输入的每一条边补充0的层数
dilation(int or tuple, optional) – 一个控制窗口中元素步幅的参数
④return_indices - 如果等于True,会返回输出最大值的序号,对于上采样操作会有帮助
⑤ceil_mode - 如果等于True,计算输出信号大小的时候,会使用向上取整,代替默认的向下取整的操作

a = torch.randn(3,5,10)
b = nn.Maxpool2d((5,1))  # kernel = 5 步长为1
c = b(a)
c.shape
 
 
torch.size([3,1,10])

  启动kernel代表的是观察角度,如下图kernel就是2*2,stride和Conv操作中一样代表每次移动的步长。

  下图操作,在每次观察区域内取最大值作为采样数据进行降维操作,这样做的优点是可以使显性特征更明显,降维操作并没有更改输出和输出的channel_num

pytorch中有acc函数吗 pytorch中criterion_pytorch中有acc函数吗



maxpool操作


在分析resnet50网络 pytorch网络的时候

(maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)

也就是kernel为3 stride 2 padding 1 dilation =1 ceil_mode = False

从下图中可以看出他的输入

pytorch中有acc函数吗 pytorch中criterion_pytorch中有acc函数吗_02


resnet50网络

输入的图片为 1920*1080 大小
经过第一层卷积为
960x540
所以输入pool层的数据为
960x540
经过pooling层后的数据为
480x270
但是都没改变数据的通道数

等于经过pool层后 图片的大小减半了 也就是2倍的下采样

在pytorch中变成绝对值有两种:

一种是变成32位浮点数  torch.FloatTensor(b)

另一种是torch.abs(b)

nn.Avg_pool

  对于Avg_pool来说,参数和Max_pool是完全相同的,主要区别就是在kernel中取的是平均值操作。

空间金字塔池化(Spatial Pyramid Pooling)

空间金字塔池化可以把任何尺度的图像的卷积特征转化成相同维度,这不仅可以让CNN处理任意尺度的图像,还能避免cropping和warping操作,导致一些信息的丢失,具有非常重要的意义。

  一般的CNN都需要输入图像的大小是固定的,这是因为全连接层的输入需要固定输入维度,但在卷积操作是没有对图像尺度有限制,所有作者提出了空间金字塔池化,先让图像进行卷积操作,然后转化成维度相同的特征输入到全连接层,这个可以把CNN扩展到任意大小的图像

pytorch中有acc函数吗 pytorch中criterion_池化_03


  空间金字塔池化的思想来自于Spatial Pyramid Model,它一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于卷积特征,我们可以得到1X1,2X2,4X4的池化结果,由于conv5中共有256个过滤器,所以得到1个256维的特征,4个256个特征,以及16个256维的特征,然后把这21个256维特征链接起来输入全连接层,通过这种方式把不同大小的图像转化成相同维度的特征。

pytorch中有acc函数吗 pytorch中criterion_池化_04

对于不同的图像要得到相同大小的pooling结果,就需要根据图像的大小动态的计算池化窗口的大小和步长。假设conv5输出的大小为a*a,需要得到n*n大小的池化结果,可以让窗口大小sizeX为,步长为 。下图以conv5输出的大小为13*13为例。

卷积神经网络——输入层、卷积层、激活函数、池化层、全连接层