池化操作的一个重要的目的就是对卷积后得到的特征进行进一步处理,池化层可以起到对数据进一步浓缩的效果,从而缓解计算时内存的压力。
在pytoch中提供很多池化的类,这里主要介绍最**大池化(MaxPool)、平均池化(AvgPool)、自适应池化(AdaptiveAvgpool)**的区别,,其他方法类似。
对于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:(整数或数组、正数)一个控制窗口中元素步幅的参数
return_indices:如果为True,则会返回输出最大值的索引,这样会更加便于后面的torch.nn.MaxUnpool2d操作
ceil_mode:如果等于True,计算输出信号的大小时候,会使用向上取整,默认向下取整。
测试图片见下图
MaxPool2d最大池化
对卷积后的结果进行最大池化
maxpool2 = nn.MaxPool2d(2,stride=2)
pool2_out = maxpool2(imconv2dout)
pool2_out_im = pool2_out.squeeze()
print('pool2_out.shape')
对原始图片2160 * 3840进行特征映射在经过窗口为22,步长为2的最大池化后,尺寸变成10781918的特征映射。将两个特征映射进行可视化
plt.figure(figsize = (12,6))
plt.subplot(1,2,1)
plt.imshow(pool2_out_im[0].data,cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(pool2_out_im[1].data,cmap=plt.cm.gray)
plt.axis("off")
plt.show()
最大池化的结果图像
完整代码见下图所示
import numpy as np
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from PIL import Image
myim = Image.open("C:\\Users\\qiang\\Desktop\\Python语言\\lol英雄联盟琴瑟仙女 水晶玫瑰 娑娜4k壁纸3840x2160_彼岸图网.jpg")
myimgray=np.array(myim.convert("L"),dtype=np.float32)
# plt.figure(figsize=(6,6))
# plt.imshow(myimgray,cmap=plt.cm.gray)
# plt.axis("off")
# plt.show()
imh, imw = myimgray.shape
myimgray_t = torch.from_numpy(myimgray.reshape((1,1,imh,imw)))
print(myimgray_t.shape)
kersize = 5
ker = torch.ones(kersize,kersize,dtype=torch.float32)*-1
print(ker)
ker[2,2] = 24
print(ker)
ker = ker.reshape((1,1,kersize,kersize))
print(ker)
conv2d = nn.Conv2d(1,2,(kersize, kersize),bias=False)
conv2d.weight.data[0] = ker
imconv2dout= conv2d(myimgray_t)
imconv2dout_im = imconv2dout.data.squeeze()
print("卷积后尺寸:",imconv2dout_im.shape)
maxpool2 = nn.MaxPool2d(2,stride=2)
pool2_out = maxpool2(imconv2dout)
pool2_out_im = pool2_out.squeeze()
print('pool2_out.shape')
plt.figure(figsize = (12,6))
plt.subplot(1,2,1)
plt.imshow(pool2_out_im[0].data,cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(pool2_out_im[1].data,cmap=plt.cm.gray)
plt.axis("off")
plt.show()
AvgPool2d平均池化
对卷积后的输出结果进行平均池化,并进行可视化操作
avgpool2 = nn.AvgPool2d(2,stride=2)
pool2_out = avgpool2(imconv2dout)
pool2_out_im = pool2_out.squeeze()
print(pool2_out.shape)
plt.figure(figsize = (12,6))
plt.subplot(1,2,1)
plt.imshow(pool2_out_im[0].data,cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(pool2_out_im[1].data,cmap=plt.cm.gray)
plt.axis("off")
plt.show()
得到的可视化图片如下所示
AdaptiveAvgPool2d自适应平均池化
AdaAvgpool2 = nn.AdaptiveAvgPool2d(output_size=(100,100))
pool2_out = AdaAvgpool2(imconv2dout)
pool2_out_im = pool2_out.squeeze()
print(pool2_out.shape)
plt.figure(figsize = (12,6))
plt.subplot(1,2,1)
plt.imshow(pool2_out_im[0].data,cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(1,2,2)
plt.imshow(pool2_out_im[1].data,cmap=plt.cm.gray)
plt.axis("off")
plt.show()
可视化图像如同所示