当前位置:   article > 正文

PyTorch的卷积和池化

PyTorch的卷积和池化

16969bd261584bfcbe198e40a98f2b99.gif

659c8d58a66d4d5182544fee21524d4d.png

卷积计算 

324eb12d248140bbbec2c8dbcfce7026.png

  1. input 表示输入的图像
  2. filter 表示卷积核, 也叫做滤波器
  3. input 经过 filter 的得到输出为最右侧的图像,该图叫做特征图

 0f7eb9b0578449789ab666dd7e434070.png

卷积的计算是将卷积核放入左上角,在局部区域间做点积,然后将卷积核在Input上面依次从左向右,从上到下平移。左上角的点积操作:32b4754544024e34810dd427327bcce9.png

得到最终的特征图为:

53af8fff45454bd4a4c6354fc58e20cd.png

f78ebb15eafe471c9e370e4e14f962ca.png

Padding 

通过上面的卷积计算过程,我们发现最终的特征图比原始图像小很多,如果想要保持经过卷积后的图像大小不变, 可以在原图周围添加 padding 来实现

c73b68f955dc49a090018b0a4aa3df8e.png

Stride 

按照步长为1来移动卷积核,得到上面的特征图,如果按照步长为2的话,特征图就变成了2*2的特征图了。 

6f1f18db0ebc4632afae26970df4ffd7.png

多通道卷积计算

实际中的图像都是多个通道组成的,即多个Input图前后贴在一起。

697b2416b6ef4295aa757774c1a36929.png

  1. 当输入有多个通道(Channel), 例如 RGB 三个通道, 此时要求卷积核需要拥有相同的通道数数。
  2. 每个卷积核通道与对应的输入图像的各个通道进行卷积。
  3. 将每个通道的卷积结果按位相加得到最终的特征图。

多卷积核卷积计算 

上面我们只使用一个卷积核进行特征提取,实际对图像进行特征提取时,我们需要使用多个卷积核进行特征提取; 这个多个卷积核可以理解为从不同到的视角、不同的角度对图像特征进行提取。

2cbe55c459024499b9f1d77d320bc9cc.png

特征图大小 

输出特征图的大小与三个参数有关:

  1. size: 卷积核/过滤器大小,一般会选择为奇数,比如有 1*1, 3*3, 5*5*
  2. Padding: 零填充的方式
  3. Stride: 步长

计算方法:

  1. 输入图像大小: W x W
  2. 卷积核大小: F x F
  3. Stride: S
  4. Padding: P
  5. 输出图像大小: N x N

 d429570e755b4d5bb5470ff40ed04ee2.png

  1. 例如,(5 - 3 + 2) / 1 + 1 = 5, 即得到的特征图大小为: 5 x 5

60d3a31c753040038d25392fb2ae91b9.png

PyTorch 对卷积层的使用 

  1. import torch
  2. import torch.nn as nn
  3. import matplotlib.pyplot as plt
  4. # 显示图像
  5. def show(img):
  6. # 输入形状: (Height, Width, Channel)
  7. plt.imshow(img)
  8. plt.axis('off')
  9. plt.show()
  10. # 单个多通道卷积核
  11. def test01():
  12. # 读取图像, 形状: (1024, 720, 3)
  13. img = plt.imread('QQ.png')
  14. show(img)
  15. # 构建卷积层
  16. conv = nn.Conv2d(in_channels=3, out_channels=1, kernel_size=3, stride=1, padding=1)
  17. # 输入形状: (Channel, Height, Width)
  18. img = torch.tensor(img).permute(2, 0, 1)
  19. new_img = conv(img)
  20. new_img = new_img.permute(1, 2, 0)
  21. show(new_img.detach().numpy())
  22. if __name__ == '__main__':
  23. test01()

输出的单卷积特征图:

c76839aae4644219a5aebbdbf544aa73.png

0a760d86999143dab70b20dfe556dfd9.png

多卷积特征图: 

test01 函数使用一个多通道卷积核进行特征提取,test02 函数使用 3 个多通道卷积核进行特征提取: 

  1. def test02():
  2. # 读取图像, 形状:
  3. img = plt.imread('QQ.png')
  4. conv = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, stride=1, padding=1)
  5. # 输入形状: (Channel, Height, Width)
  6. img = torch.tensor(img).permute(2, 0, 1)
  7. new_img = conv(img)
  8. new_img = new_img.permute(1, 2, 0)
  9. # 打印三个特征图
  10. show(new_img[:, :, 0].detach().numpy())
  11. show(new_img[:, :, 1].detach().numpy())
  12. show(new_img[:, :, 2].detach().numpy())

 

这些就是卷积层的使用,下一节我们去了解池化层~ 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/562728
推荐阅读
相关标签
  

闽ICP备14008679号