首页 > 其他分享 >Pytorch----池化层(平均值池化、最大值池化、自适应最大值池化)--入门级小实例(逐行注释)---学习笔记

Pytorch----池化层(平均值池化、最大值池化、自适应最大值池化)--入门级小实例(逐行注释)---学习笔记

时间:2022-10-28 11:31:16浏览次数:72  
标签:plt 最大值 池化层 池化 pool image 逐行 out


文章目录

还是用上次的小实例 ,这次加入三种池化层做练习。

关于池化层的基础概念可以看这里。

我之前以为池化层也叫下采样,但这样说并不严格,只是大家都这么说,我刚知道,其实采样层包含池化层。某种卷积层也叫采样层。

最大值池化层

选择每个小区域的最大值作为特征放到结果矩阵,像下面这样。

Pytorch----池化层(平均值池化、最大值池化、自适应最大值池化)--入门级小实例(逐行注释)---学习笔记_pytorch

maxpool = nn.MaxPool2d(2,stride=2) # 定义池化层
pool_out = maxpool(image_out) # 图像数据放进去做池化操作

平均值池化层

就是从这个区域中算出平均值加入结果集。
像下面这样。

Pytorch----池化层(平均值池化、最大值池化、自适应最大值池化)--入门级小实例(逐行注释)---学习笔记_卷积_02

average_pool = nn.AvgPool2d(2,stride=2)
pool_out = average_pool(image_out)

自适应平均值池化层

自适应池化Adaptive Pooling与标准的Max/AvgPooling区别在于,自适应池化Adaptive Pooling会根据输入的参数来控制输出output_size,而标准的Max/AvgPooling是通过kernel_size,stride与padding来计算output_size。

adaverage_pool = nn.AdaptiveAvgPool2d(output_size=(100,100)) # 输出大小的尺寸指定为100*100
pool_out = adaverage_pool(image_out)

代码实现

沿用上一次的代码 直接加入池化层.

## 池化层加入
from copy import deepcopy
from PIL import Image
import torch
import matplotlib.pyplot as plt
import numpy as np
from torch import nn

image = Image.open('../data/cat.png')
image = image.convert("L")
image_np = np.array(image)

h, w = image_np.shape
image_tensor = torch.from_numpy(image_np.reshape(1, 1, h, w)).float()

kersize = 5

ker = torch.ones(kersize, kersize, dtype=torch.float32) * -1
temp = deepcopy(ker)

ker[2,2] = 24
conv2d = torch.nn.Conv2d(1, 2, (kersize, kersize), bias=False)
ker = ker.reshape((1, 1, kersize, kersize))
conv2d.weight.data[0] = ker
conv2d.weight.data[1] = temp


image_out = conv2d(image_tensor)

# 添加池化层----最大值池化
# maxpool = nn.MaxPool2d(2,stride=2)
# pool_out = maxpool(image_out)

# 添加池化层---平均值池化
# average_pool = nn.AvgPool2d(2,stride=2)
# pool_out = average_pool(image_out)

# 添加池化层---自适应平均池化层
adaverage_pool = nn.AdaptiveAvgPool2d(output_size=(100,100)) # 输出大小的尺寸指定为100*100
pool_out = adaverage_pool(image_out)

# print(image_out.data)
# print("=" * 20)
# print(image_out.detach().numpy().shape) # 仅仅将tensor数据转为numpy数据
x = torch.linspace(-6,6,100) # -6到6分成了一百份 返回张量类型
print(type(x))

print(x)
# print(pool_out.shape)
pool_out_min = pool_out.squeeze()
# print(pool_out_min.shape)
image_out = image_out.squeeze()


# 画图之前看一下数据维度,在压缩之前是四维张量 torch.Size([1, 2, 357, 357])
# 压缩之后是三维张量 torch.Size([2, 357, 357]) 这里有两个 (357*357) 一个是普通卷积 一个是边缘提取
# 给到最后plt画图的时候需要numpy类型数据。 所以直接[0] 和[1] 提取出来。

#结果对比 一组是普通卷积和卷积+池化 另一组是边缘检测和边缘检测+池化
plt.figure(figsize=(18,18),frameon=True)
plt.subplot(2,2,1) # 你显示出来的图如何规划, 规划为2行2列 从左到右,从上到下,编号
plt.imshow(pool_out_min[1].detach(), cmap=plt.cm.gray) # 数据有梯度 使用detach方法提取
plt.axis('off')

plt.subplot(2,2,2) # 加入池化层的普通卷积操作
plt.imshow(image_out[1].detach(), cmap=plt.cm.gray)
plt.axis('off')


plt.subplot(2,2,3) # 边缘检测
plt.imshow(pool_out_min[0].detach(), cmap=plt.cm.gray)
plt.axis('off')

plt.subplot(2,2,4) # 加入池化层的边缘检测
plt.imshow(image_out[0].detach(), cmap=plt.cm.gray)
plt.axis('off')

plt.show()

最大值池化,

四个图对比 分别是:

普通卷积+池化 --------------- 普通卷积

边缘检测+池化 --------------- 边缘检测

Pytorch----池化层(平均值池化、最大值池化、自适应最大值池化)--入门级小实例(逐行注释)---学习笔记_python_03


平均值池化

Pytorch----池化层(平均值池化、最大值池化、自适应最大值池化)--入门级小实例(逐行注释)---学习笔记_2d_04

自适应平均值池化

Pytorch----池化层(平均值池化、最大值池化、自适应最大值池化)--入门级小实例(逐行注释)---学习笔记_卷积_05


标签:plt,最大值,池化层,池化,pool,image,逐行,out
From: https://blog.51cto.com/u_15849381/5803929

相关文章

  • keras SegNet使用池化索引(pooling indices)
    keras中不能直接使用池化索引。最近学习到SegNet(网上许多错的,没有用池化索引),其中下采样上采样用到此部分。此处用到自定义层。完整测试代码如下。"""@author:LiShiHang@so......
  • 倒序排序求次数平方和最大值
    题目描述有一种有趣的字符串价值计算方式:统计字符串中每种字符出现的次数,然后求所有字符次数的平方和作为字符串的价值例如:字符串"abacaba",里面包括4个'a',2个'b',1个......
  • O(n)求三个数乘积的最大值
    题目描述给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)输入描述:输入共2行,第一行包括一个整数n,表示数组长度......
  • 代码随想录训练营第十三天| 239. 滑动窗口最大值 ,347.前 K 个高频元素
    今天是第十三天,是队列相关,难度不小 239.滑动窗口最大值classSolution{publicint[]maxSlidingWindow(int[]nums,intk){intn=nums.l......
  • open中的readline()如何逐行读取啊?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【༺ཉི།།与歌同行ཉྀ༻】问了一个Python文件读取的问题,提问截图如下:二、实现过程这里【瑜亮老师】给了一......
  • 最大值
    1#include<stdio.h>intmain(){inta=0;intb=0;intc=0;scanf("%d",&a);scanf("%d",&b);scanf("%d",&c);if(a>b){if(a>c){printf("%d\n",a);......
  • ① 定义一个大小为10 的整形数组a; ② 从键盘输入10 个整数,放置到数组a 中; ③ 输出数组
    publicstaticvoidmain(String[]args){ Scannerinput=newScanner(System.in); int[]a=newint[10];//定义一个数组 //给数组的10个元素赋值 for(inti=0;i......
  • 输入10个整数,输出最大值、最小值和平均值。
    要求:10个数需要从键盘输入,平均值保留两位小数。​程序代码#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>floatMax(floatx,floaty){     if(x>y)   ......
  • 分割数组的最大值问题
    分割数组的最大值问题作者:Grey原文地址:博客园:分割数组的最大值问题CSDN:分割数组的最大值问题题目说明给定一个非负整数数组nums和一个整数m,你需要将这个数组分成......
  • 练习27 求最大值
    练习27要求:从键盘输入两个数,求出其最大值(要求使用函数完成求最大值,并在主函数中调用该函数)程序示例如下://从键盘输入两个数,求出其最大值(要求使用函数完成求最大值,并在主函数......