前言
卷积神经网络的核心架构中的池化层往往紧接卷积层后,这里对图像的池化是指对卷积后的图像进行池化,所以卷积图像的可视化请移步《动手实现卷积层以及卷积图像的可视化》
这里就接着卷积后的图像进行池化操作了。
What is Pool
池化操作的个重要的目的就是对卷积后得到的特征进行进一步处理(主要是降维),池化层可以起到对数据进一步 浓缩的效果,从而缓解计算时内存的压力。池化会选取-定大小区域, 将该区域内的像素值使用一一个代表元素 表示。如果使用平均值代替,称为平均值池化,如果使用最大值代替则称为最大值池化。
在Pytorch中有多种池化的类:
- 最大值池化(MaxPool)
- 最大值逆池化(MaxUnPool)
- 平均值池化(AvgPool)
- 自适应池化(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() 为例子介绍内部参数:
- kernel_size: 最大值池化窗口
- stride: 最大值池化窗口移动步长(默认:kernel_size)
- padding: 输入的每条边补充0的层数
- dilation: 一个控制窗口中元素步幅的参数
- return_indices:如果为Ture ,则会返回输出最大值的索引,这样会更加便于之后的逆运算
- ceil_model: 设置为Ture的时候会向上取整(默认向下取整)
Example
对已经过卷积的图进行的池化
最大值池化结果图:
平均值池化结果图:
Demo
紧接上文《动手实现卷积层以及卷积图像的可视化》
最大值池化:
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)