Torch.nn模块学习-池化

网友投稿 730 2022-11-28

Torch.nn模块学习-池化

Torch.nn模块学习-池化

池化对数据启到了浓缩的效果,通过池化可以减少数据量,降低内存压力。简单地理解,池化操作就是通过池化的kernel选取一定的区域,通过某种计算将这个区域的一系列数值转化为一个数值,需要注意的是,对于池化操作来说,池化的步长一般是卷积核的大小。

Pytorch中提供了多种池化的类,最大池化、平均池化、最大自适应池化等操作,下面以二维数据的处理为例,列出常用的池化操作。

对应的类

功能

.MaxPool2d()

针对输入信号上应用2d最大值池化

.MaxUnPool2d()

2d最大值池化的逆操作

.AvgPool2d()

输入信号上应用2d平均池化

.AdaptiveMaxPool2d()

2d自适应最大值池化(输出信号的大小自行指定)

.AdaptiveAvgPool2d()

2d自适应最大值池化(输出信号的大小自行指定)

以torch.nn.MaxPool2d为例进行说明:

torch.nn.MaxPool2d(kernel_size, stride=None,dilation=1,return_indices=False,ceil_mode=False)

参数的使用说明:

kernel_size: 最大池化的窗口大小stride: 最大池化窗口移动的大小,默认值为kernel_sizepadding: 输入信号中每一边补充0的层数dilation: 控制窗口中元素步幅的参数return_indices: 如果为True,则会返回输出最大值的索引,方便之后执行逆操作ceil_mode: True为向上取整,默认是向下取整

输入: (N,C-in, H-in, W-in)

输出:(N,C-out,H-out,W-out)

import torchimport torch.nn as nnimport matplotlib.pyplot as pltfrom PIL import Imageimport numpy as np# 读取图片转化为灰度图,并转化为numpy数组img = Image.open("imgs/lufei.jpg")img_gray = np.array(img.convert("L"), dtype=np.float32)# plt.figure(figsize=(6, 6))# plt.imshow(img_gray, cmap=plt.cm.gray)# plt.axis("off")# plt.show()# 将数组转化为张量imh, imw = img_gray.shapeimg_tensor = torch.from_numpy(img_gray.reshape(1, 1, imh, imw))# 使用5*5的随机数构成的卷积核进行卷积操作# 这里的卷积核是个比较神奇的卷积核,中间的数值比较大,两边的数值比较小kernel_size = 5kernel = torch.ones(kernel_size, kernel_size, dtype=torch.float32) * -1kernel[2, 2] = 24kernel = kernel.reshape((1, 1, kernel_size, kernel_size))# 进行卷积操作conv2d = nn.Conv2d(1, 2, (kernel_size, kernel_size), bias=False)conv2d.weight.data[0] = kernelimgconv2dout = conv2d(img_tensor)# 进行维度的压缩,这样图像才能展示出来imgconv2dout_img = imgconv2dout.data.squeeze()print("卷积之后的尺寸为:{}".format(imgconv2dout_img.shape))# 对卷积之后的张量进行最大池化,也就是锐化的操作maxpool2d = nn.MaxPool2d(2, stride=2)pool2_out = maxpool2d(imgconv2dout)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()# 对卷积之后的张量进行平均g池化,也就是锐化的操作avgpool2d = nn.AvgPool2d(2, stride=2)pool2_out = avgpool2d(imgconv2dout)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()# 对卷积之后的张量进行平均g池化,也就是锐化的操作adaavgpool2d = nn.AdaptiveAvgPool2d(output_size=(100, 100))pool2_out = adaavgpool2d(imgconv2dout)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()

最大池化的结果:

平均池化的结果:

自适应池化的结果,图片变模糊了,尺寸变小了

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:安装PaddlePaddle和Paddlehub
下一篇:Ubuntu20.04远程连接
相关文章

 发表评论

暂时没有评论,来抢沙发吧~