池化层:最大池化MaxPool、平均池化AvgPool、自适应池化AdaptiveMaxPool区别--基于pytorch框架

8 篇文章 4 订阅
4 篇文章 0 订阅


池化操作的一个重要的目的就是对卷积后得到的特征进行进一步处理,池化层可以起到对数据进一步浓缩的效果,从而缓解计算时内存的压力。
在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()

可视化图像如同所示
在这里插入图片描述

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值