您现在的位置是:首页 >技术交流 >[PyTorch][chapter 34][池化层与采样]网站首页技术交流

[PyTorch][chapter 34][池化层与采样]

明朝百晓生 2024-06-17 10:26:08
简介[PyTorch][chapter 34][池化层与采样]

前言:

       这里主要讲解一下卷积神经网络中的池化层与采样

目录


  1. DownSample
  2. Max pooling
  3. avg pooling
  4. upsample
  5. ReLu

1: DownSample

       下采样,间隔一定行或者列进行采样,达到降维效果

     早期LeNet-5 就采样该采样方式。

 LeNet-5


 

2 Max pooling

    最大值采样

    取滑动窗口内的最大值,做采样值,达到降维效果

    AlexNet 采用该种采样方式,取窗口内最大值或平均值

 

   如最后一个窗口

  max(7,6,4,2)=7

PyTorch nn 模块提供了API ,注意输入必须是3维或者以上的张量

至少是如下格式(channel,width, height)

# -*- coding: utf-8 -*-
"""
Created on Tue May 16 15:53:25 2023

@author: chengxf2
"""

import torch
import torch.nn as nn

def run():
    
    data = torch.arange(0, 16.0).view(1,4,4)
    print("
 input:
",data)
    layer = nn.MaxPool2d(2,stride=2)
    
    pool = layer(data)
    print("
 pool 
",pool)
    
run()
    


3  avg pooling

     平均采样

     取滑动窗口内的平均值,做采样值,达到降维效果

    

 PyTorch 里面提供了采样函数 F

import torch.nn.functional as F

m = nn.AvgPool2d((2, 2), stride=(2, 2))

 


4 upsample

   上采样,对应的API 函数如下

torch.nn.functional.interpolate(input,
 size=None, 
scale_factor=None,
 mode='nearest', 
align_corners=None, 
recompute_scale_factor=None)

功能:

利用插值方法,对输入的张量数组进行上下采样操作,换句话说就是科学合理地改变数组的尺寸大小,尽量保持数据完整。

参数

input(Tensor)需要进行采样处理的数组
size(int或序列)输出空间的大小
scale_factor空间大小的乘数
mode(str)用于采样的算法。'nearest'| 'linear'| 'bilinear'| 'bicubic'| 'trilinear'| 'area'。默认:'nearest'
align_corners(bool)在几何上,我们将输入和输出的像素视为正方形而不是点。如果设置为True,则输入和输出张量按其角像素的中心点对齐,保留角像素处的值。如果设置为False,则输入和输出张量通过其角像素的角点对齐,并且插值使用边缘值填充用于边界外值,使此操作在保持不变时独立于输入大小scale_factor。
recompute_scale_facto(bool)重新计算用于插值计算的 scale_factor。当scale_factor作为参数传递时,它用于计算output_size。如果recompute_scale_factor的False或没有指定,传入的scale_factor将在插值计算中使用。否则,将根据用于插值计算的输出和输入大小计算新的scale_factor(即,如果计算的output_size显式传入,则计算将相同 )。注意当scale_factor 是浮点数,由于舍入和精度问题,重新计算的 scale_factor 可能与传入的不同。

 

import torch.nn.functional as F
import torch

a=torch.arange(12,dtype=torch.float32).reshape(1,2,2,3)
b=F.interpolate(a,size=(4,4),mode='bilinear')
# 这里的(4,4)指的是将后两个维度放缩成4*4的大小
print(a)
print(b)
print('原数组尺寸:',a.shape)
print('size采样尺寸:',b.shape)

例2:

  输入 x [1,16,7,7]   [img_number,channel, width,height]

   通过插值后只会更改为其长和宽

 


5 ReLu

   卷积神经网络基本组成部分如下,因为经过

conv2d, batchNorm,Pooling 操作后,图像像素值可能是负的。

图像的像素值不能为负的的,所以正常要加个ReLu 函数

 

     relu(x)= max(0,x)

    relu(x)=max(0,x)

 

 

参考:

F.interpolate——数组采样操作_视觉萌新、的博客-CSDN博客

课时66 池化层与采样_哔哩哔哩_bilibili

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。