Pytorch----池化层(平均值池化、最大值池化、自适应最大值池化)--入门级小实例(逐行注释)---学习笔记
文章目录最大值池化层平均值池化层自适应平均值池化层代码实现还是用上次的小实例 这次加入三种池化层做练习。关于池化层的基础概念可以看这里。我之前以为池化层也叫下采样但这样说并不严格只是大家都这么说我刚知道其实采样层包含池化层。某种卷积层也叫采样层。最大值池化层选择每个小区域的最大值作为特征放到结果矩阵像下面这样。maxpoolnn.MaxPool2d(2,stride2)# 定义池化层pool_outmaxpool(image_out)# 图像数据放进去做池化操作平均值池化层就是从这个区域中算出平均值加入结果集。像下面这样。average_poolnn.AvgPool2d(2,stride2)pool_outaverage_pool(image_out)自适应平均值池化层自适应池化Adaptive Pooling与标准的Max/AvgPooling区别在于自适应池化Adaptive Pooling会根据输入的参数来控制输出output_size而标准的Max/AvgPooling是通过kernel_sizestride与padding来计算output_size。adaverage_poolnn.AdaptiveAvgPool2d(output_size(100,100))# 输出大小的尺寸指定为100*100pool_outadaverage_pool(image_out)代码实现沿用上一次的代码 直接加入池化层.## 池化层加入fromcopyimportdeepcopyfromPILimportImageimporttorchimportmatplotlib.pyplotaspltimportnumpyasnpfromtorchimportnn imageImage.open(../data/cat.png)imageimage.convert(L)image_npnp.array(image)h,wimage_np.shape image_tensortorch.from_numpy(image_np.reshape(1,1,h,w)).float()kersize5kertorch.ones(kersize,kersize,dtypetorch.float32)*-1tempdeepcopy(ker)ker[2,2]24conv2dtorch.nn.Conv2d(1,2,(kersize,kersize),biasFalse)kerker.reshape((1,1,kersize,kersize))conv2d.weight.data[0]ker conv2d.weight.data[1]temp image_outconv2d(image_tensor)# 添加池化层----最大值池化# maxpool nn.MaxPool2d(2,stride2)# pool_out maxpool(image_out)# 添加池化层---平均值池化# average_pool nn.AvgPool2d(2,stride2)# pool_out average_pool(image_out)# 添加池化层---自适应平均池化层adaverage_poolnn.AdaptiveAvgPool2d(output_size(100,100))# 输出大小的尺寸指定为100*100pool_outadaverage_pool(image_out)# print(image_out.data)# print( * 20)# print(image_out.detach().numpy().shape) # 仅仅将tensor数据转为numpy数据xtorch.linspace(-6,6,100)# -6到6分成了一百份 返回张量类型print(type(x))print(x)# print(pool_out.shape)pool_out_minpool_out.squeeze()# print(pool_out_min.shape)image_outimage_out.squeeze()# 画图之前看一下数据维度在压缩之前是四维张量 torch.Size([1, 2, 357, 357])# 压缩之后是三维张量 torch.Size([2, 357, 357]) 这里有两个 (357*357) 一个是普通卷积 一个是边缘提取# 给到最后plt画图的时候需要numpy类型数据。 所以直接[0] 和[1] 提取出来。#结果对比 一组是普通卷积和卷积池化 另一组是边缘检测和边缘检测池化plt.figure(figsize(18,18),frameonTrue)plt.subplot(2,2,1)# 你显示出来的图如何规划 规划为2行2列 从左到右从上到下编号plt.imshow(pool_out_min[1].detach(),cmapplt.cm.gray)# 数据有梯度 使用detach方法提取plt.axis(off)plt.subplot(2,2,2)# 加入池化层的普通卷积操作plt.imshow(image_out[1].detach(),cmapplt.cm.gray)plt.axis(off)plt.subplot(2,2,3)# 边缘检测plt.imshow(pool_out_min[0].detach(),cmapplt.cm.gray)plt.axis(off)plt.subplot(2,2,4)# 加入池化层的边缘检测plt.imshow(image_out[0].detach(),cmapplt.cm.gray)plt.axis(off)plt.show()最大值池化,四个图对比 分别是普通卷积池化 --------------- 普通卷积边缘检测池化 --------------- 边缘检测平均值池化自适应平均值池化
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2411519.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!