python实现池化操作

关于卷积部分:python实现卷积操作


1.池化

池化操作的一个重要目的就是对卷积后得到的特征进行进一步处理, 起到对数据进一步浓缩的效果, 从而缓解计算时内存的压力. 池化会选取一定大小区域, 将该区域内的像素值使用一个代表元素表示. 如果使用平均值代替, 称为平均值池化, 如果使用最大值代替则称为最大值池化.
最大值池化如下图所示,
在这里插入图片描述
图片数据经过池化后, 特征维度会减小, 训练参数减少, 泛化能力加强,进而防止过拟合. 其中特征维数的减少并不会让之前的特征丢失.
相关参数:

  • 输入大小 B × H × W × C B \times H\times W \times C B×H×W×C
  • 池化窗口 N × N N \times N N×N
  • 步长 S S S
    (通常, 我们将步长大小设置为与池化窗口同样大小的参数, 保证滑动区域不会重叠)

池化并不会改变输出通道数, 所以池化后的大小为
B × ⌊ H − N S + 1 ⌋ × ⌊ W − N S + 1 ⌋ × C B \times \lfloor \frac{H - N}{S}+1 \rfloor \times \lfloor \frac{W - N}{S}+1 \rfloor \times C B×SHN+1×SWN+1×C

2. 代码实现

import numpy as np
import math


class Pool2d():
    def __init__(self, inputShape, poolingSize, stride=2, type=""):
        self.height = inputShape[1]
        self.width = inputShape[2]
        # self.pool = np.zeros([self.batchSize, poolingSize, poolingSize, inputShape[-1]])
        self.stride = stride
        self.type = type
        self.batchSize = inputShape[0]
        self.size = poolingSize

        # The shape of the output
        self.output = np.zeros([self.batchSize, math.floor((self.height - self.size)/ self.stride + 1),
                             math.floor((self.width - self.size)/ self.stride + 1), inputShape[-1]])

    def forward(self, x):
        polOut = np.zeros(self.output.shape)
        for i in range(self.batchSize):
            img_i = x[i]
            polImage_i = self.im2pol(img_i, self.size, self.stride)
            polOut[i] = np.reshape(polImage_i, self.output[0].shape)

        return polOut

    def im2pol(self, image, size, stride):
        imagePol = []
        for i in range(image.shape[-1]):
            tempList = []
            for j in range(0, image.shape[0]- size +1, stride):
                for k in range(0, image.shape[1], stride):
                    # Two kinds of pooling
                    if self.type == "max":
                        pol = image[j:j + size, k:k + size, i].max()
                    elif self.type == "mean":
                        pol = image[j:j + size, k:k + size, i].mean()
                    tempList.append(pol)
            tempArray = np.array(tempList).reshape([self.output.shape[1], self.output.shape[2]])
            imagePol.append(tempArray)

        imagePol = np.array(imagePol)
        imagePol = np.swapaxes(imagePol, 0, 2)  # Exchange dimension from (c, h, w) to (h, w, c)
        return imagePol


inputData = np.random.random((1, 4, 4, 3))
print("inputShape: ", inputData.shape)
size = 2
print("pooling size: ", size)
pool2d =Pool2d(inputShape=inputData.shape, poolingSize=size, type="max")
outputData = pool2d.forward(inputData)
print("outputShape: ", outputData.shape)  # (1, 2, 2, 3)


与卷积操作类似, 池化操作同样是池化窗口在滑动;
但需要注意的是, 它并没有使用零填充.


参考资料:
https://blog.csdn.net/qq_41661809/article/details/96500250
https://blog.csdn.net/qq_28266311/article/details/94555082

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么要学习这门课程】深度学习框架如TensorFlow和Pytorch掩盖了深度学习底层实现方法,那能否能用Python代码从零实现来学习深度学习原理呢?本课程就为大家提供了这个可能,有助于深刻理解深度学习原理。左手原理、右手代码,双管齐下!本课程详细讲解深度学习原理并进行Python代码实现深度学习网络。课程内容涵盖感知机、多层感知机、卷积神经网络、循环神经网络,并使用Python 3及Numpy、Matplotlib从零实现上述神经网络。本课程还讲述了神经网络的训练方法与实践技巧,且开展了代码实践演示。课程对于核心内容讲解深入细致,如基于计算图理解反向传播算法,并用数学公式推导反向传播算法;另外还讲述了卷积加速方法im2col。【课程收获】本课程力求使学员通过深度学习原理、算法公式及Python代码的对照学习,摆脱框架而掌握深度学习底层实现原理与方法。本课程将给学员分享深度学习Python实现代码。课程代码通过Jupyter Notebook演示,可在Windows、ubuntu等系统上运行,且不需GPU支持。【优惠说明】 课程正在优惠中!  备注:购课后可加入白勇老师课程学习交流QQ群:957519975【相关课程】学习本课程的前提是会使用Python语言以及Numpy和Matplotlib库。相关课程链接如下:《Python编程的术与道:Python语言入门》https://edu.csdn.net/course/detail/27845《玩转Numpy计算库》https://edu.csdn.net/lecturer/board/28656《玩转Matplotlib数据绘图库》https://edu.csdn.net/lecturer/board/28720【课程内容导图及特色】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值