动手实现池化层以及池化图像的可视化

752 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

前言

卷积神经网络的核心架构中的池化层往往紧接卷积层后,这里对图像的池化是指对卷积后的图像进行池化,所以卷积图像的可视化请移步《动手实现卷积层以及卷积图像的可视化》(juejin.cn/post/708858… ,这里就接着卷积后的图像进行池化操作了。

What is Pool

  池化操作的个重要的目的就是对卷积后得到的特征进行进一步处理(主要是降维),池化层可以起到对数据进一步 浓缩的效果,从而缓解计算时内存的压力。池化会选取-定大小区域, 将该区域内的像素值使用一一个代表元素 表示。如果使用平均值代替,称为平均值池化,如果使用最大值代替则称为最大值池化。

  在Pytorch中有多种池化的类:

  1. 最大值池化(MaxPool)
  2. 最大值逆池化(MaxUnPool)
  3. 平均值池化(AvgPool)
  4. 自适应池化(AdaptiveMaxPool、AdaptiveAvgPool)

How to use Conv

功能
toech.nn.MaxPool1d()对输入进行1D最大值池化
toech.nn.MaxPool2d()对输入进行2D最大值池化
toech.nn.MaxPool3d()对输入进行3D最大值池化
功能
toech.nn.MaxUnPool1d()对输入进行1D最大值池化逆运算
toech.nn.MaxUnPool2d()对输入进行2D最大值池化逆运算
toech.nn.MaxUnPool3d()对输入进行3D最大值池化逆运算
功能
toech.nn.AvgPool1d()对输入进行1D平均值池化
toech.nn.AvgPool2d()对输入进行2D平均值池化
toech.nn.AvgPool3d()对输入进行3D平均值池化
功能
toech.nn.AdaptiveMaxPool1d()对输入进行1D自适应最大值池化
toech.nn.AdaptiveMaxPool2d()对输入进行2D自适应最大值池化
toech.nn.AdaptiveMaxPool3d()对输入进行3D自适应最大值池化

toech.nn.MaxPool2d() 为例子介绍内部参数:

  1. kernel_size: 最大值池化窗口
  2. stride: 最大值池化窗口移动步长(默认:kernel_size)
  3. padding: 输入的每条边补充0的层数
  4. dilation: 一个控制窗口中元素步幅的参数
  5. return_indices:如果为Ture ,则会返回输出最大值的索引,这样会更加便于之后的逆运算
  6. ceil_model: 设置为Ture的时候会向上取整(默认向下取整)

Example

对已经过卷积的图进行的池化
最大值池化结果图: image.png image.png 平均值池化结果图: image.png image.png

Demo

紧接上文《动手实现卷积层以及卷积图像的可视化》(juejin.cn/post/708858… 继续
最大值池化:

maxpool2 = nn.MaxPool2d(2, stride=2)
pool2_out = maxpool2(image_conv2d_out)
pool2_out_img = pool2_out.data.squeeze()
pool2_out_image = numpy.array(pool2_out_img, dtype=np.float32)
print(pool2_out.shape)
cv2.imshow("pool2_out", pool2_out_image[1])
cv2.waitKey(0)

平均值池化:

avgpool2 = nn.AvgPool2d(2, stride=2)
pool2_out = avgpool2(image_conv2d_out)
pool2_out_img = pool2_out.data.squeeze()
pool2_out_image = numpy.array(pool2_out_img, dtype=np.float32)
print(pool2_out.shape)
cv2.imshow("pool2_out", pool2_out_image[1])
cv2.waitKey(0)