问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

一文弄清池化层(pooling)的作用

创作时间:
作者:
@小白创作中心

一文弄清池化层(pooling)的作用

引用
CSDN
1.
https://blog.csdn.net/festaw/article/details/136683513

池化层是什么?

池化层的本质是一个下采样过程。在数据经过卷积操作后,维度会越来越高,虽然特征图的变化不大,但参数量却迅速增加,这会导致模型训练困难并容易产生过拟合现象。因此,将池化层置于连续的卷积层之间,可以压缩数据量和参数,减少过拟合的风险。池化层通过聚合统计一个像素点及其周围像素点的信息,来缩减特征图的尺寸,从而减少最终全连接层中的参数数量,加快模型的计算速度。常见的池化层类型包括最大池化、均值池化和空间金字塔池化等。如图所示,最大池化操作选择某个像素点相邻区域内的最大值,而均值池化操作则计算相邻区域内的平均值。

池化的作用

池化操作后的结果相比其输入缩小了。池化层的引入是仿照人的视觉系统对视觉输入对象进行降维和抽象。在卷积神经网络过去的工作中,研究者普遍认为池化层有如下三个功效:

  1. 特征不变性:池化操作使模型更加关注是否存在某些特征,而不是特征的具体位置。这种不变性包括平移不变性、旋转不变性和尺度不变性。例如,对于平移不变性,输入为(1, 5, 3)时,最大池化会取5;如果将输入右移一位得到(0, 1, 5),输出的结果仍将为5。对于尺度变换,如果原先的神经元在最大池化操作后输出5,那么经过尺度变换后,最大池化操作在该神经元上很大概率的输出仍是5。

  2. 特征降维(下采样):池化相当于在空间范围内做了维度约减,从而使模型可以抽取更加广范围的特征。同时减小了下一层的输入大小,进而减少计算量和参数个数。

  3. 在一定程度上防止过拟合,更方便优化

  • 实现非线性(类似ReLU)。
  • 扩大感受野。

示例代码

import numpy as np

# 定义池化层类
class PoolingLayer:
    def __init__(self, pool_size=(2, 2), stride=2, mode='max'):
        self.pool_height, self.pool_width = pool_size
        self.stride = stride
        self.mode = mode

    def forward(self, input):
        batch_size, input_height, input_width, num_channels = input.shape
        output_height = (input_height - self.pool_height) // self.stride + 1
        output_width = (input_width - self.pool_width) // self.stride + 1
        pooled_output = np.zeros((batch_size, output_height, output_width, num_channels))

        for b in range(batch_size):
            for c in range(num_channels):
                for i in range(output_height):
                    for j in range(output_width):
                        if self.mode == 'max':
                            pooled_output[b, i, j, c] = np.max(input[b, i*self.stride:i*self.stride+self.pool_height, 
                                                                    j*self.stride:j*self.stride+self.pool_width, c])
                        elif self.mode == 'average':
                            pooled_output[b, i, j, c] = np.mean(input[b, i*self.stride:i*self.stride+self.pool_height, 
                                                                      j*self.stride:j*self.stride+self.pool_width, c])
        return pooled_output

# 测试池化层
if __name__ == "__main__":
    # 创建输入特征图
    input_feature_map = np.random.rand(1, 4, 4, 3)  # 输入特征图大小为4x4,通道数为3,一个样本
    # 创建池化层对象
    pooling_layer = PoolingLayer(pool_size=(2, 2), stride=2, mode='max')
    # 进行前向传播
    pooled_output = pooling_layer.forward(input_feature_map)
    # 输出池化后的特征图
    print("池化后的特征图:")
    print(pooled_output)
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号