理解CNN卷积层与池化层计算

本文深入讲解了卷积神经网络(CNN)的基本原理和技术细节,包括卷积层与池化层的计算过程,不同参数设置对输出的影响,以及小卷积核与大卷积核之间的替换方法。

概述

深度学习中CNN网络是核心,对CNN网络来说卷积层与池化层的计算至关重要,不同的步长、填充方式、卷积核大小、池化层策略等都会对最终输出模型与参数、计算复杂度产生重要影响,本文将从卷积层与池化层计算这些相关参数出发,演示一下不同步长、填充方式、卷积核大小计算结果差异。

一:卷积层

卷积神经网络(CNN)第一次提出是在1997年,杨乐春(LeNet)大神的一篇关于数字OCR识别的论文,在2012年的ImageNet竞赛中CNN网络成功击败其它非DNN模型算法,从此获得学术界的关注与工业界的兴趣。毫无疑问学习深度学习必须要学习CNN网络,学习CNN就必须明白卷积层,池化层等这些基础各层,以及它们的参数意义,从本质上来说,图像卷积都是离散卷积,图像数据一般都是多维度数据(至少两维),离散卷积本质上是线性变换、具有稀疏与参数重用特征即相同参数可以应用输入图像的不同小分块,假设有3x3离散卷积核如下:
理解CNN卷积层与池化层计算

假设有

  • 5x5的图像输入块
  • 步长为1(strides=1)
  • 填充方式为VALID(Padding=VALID)
  • 卷积核大小filter size=3x3

则它们的计算过程与输出如下

理解CNN卷积层与池化层计算

假设这个时候我们修改步长为2、填充方式为SAME,卷积核大小不变(strides=2 Padding=SAME filter size=3x3),则计算过程与输出变为如下:

理解CNN卷积层与池化层计算

最终输出得到的结果我们可以称为featuremap,CNN的深度多数时候是指featuremap的个数,对多维度的输入图像计算多个卷积核,得到多个featuremap输出叠加,显示如下:
理解CNN卷积层与池化层计算

上述输入为5x5x2,使用卷积核3x3,输出3x3x3,填充方式为VALID,计算如果填充方式改为SAME则输出为5x5x3。可以看出填充方式对输出结果的影响。

二:小卷积核VS大卷积核

在AlexNet中有有11x11的卷积核与5x5的卷积核,但是在VGG网络中因为层数增加,卷积核都变成3x3与1x1的大小啦,这样的好处是可以减少训练时候的计算量,有利于降低总的参数数目。关于如何把大卷积核替换为小卷积核,本质上有两种方法。

1.将二维卷积差分为两个连续一维卷积

二维卷积都可以拆分为两个一维的卷积,这个是有数学依据的,所以11x11的卷积可以转换为1x11与11x1两个连续的卷积核计算,总的运算次数:

  • 11x11 = 121次
  • 1x11+ 11x1 = 22次
2.将大二维卷积用多个连续小二维卷积替代

可见把大的二维卷积核在计算环节改成两个连续的小卷积核可以极大降低计算次数、减少计算复杂度。同样大的二维卷积核还可以通过几个小的二维卷积核替代得到。比如:5x5的卷积,我们可以通过两个连续的3x3的卷积替代,比较计算次数

  • 5x5= 25次
  • 3x3+ 3x3=18次

三:池化层

在CNN网络中卷积池之后会跟上一个池化层,池化层的作用是提取局部均值与最大值,根据计算出来的值不一样就分为均值池化层与最大值池化层,一般常见的多为最大值池化层。池化的时候同样需要提供filter的大小、步长、下面就是3x3步长为1的filter在5x5的输入图像上均值池化计算过程与输出结果
理解CNN卷积层与池化层计算

改用最大值做池化的过程与结果如下:
理解CNN卷积层与池化层计算

天下难事,
必作于易;
天下大事,
必作于细!


转载于:https://blog.51cto.com/gloomyfish/2108390

<think>好的,用户想要获取CNN卷积层池化层的基本代码实现。首先,我需要回顾一下相关的知识,确保自己理解正确。卷积层池化层CNN中的核心组件,负责特征提取降维。根据用户提供的引用,特别是引用[2]引用[3],里面有具体的代码示例实现方法。 首先,卷积层的实现通常使用现有的深度学习框架,比如PyTorch的nn.Conv2d模块。用户可能需要一个简单的代码示例,展示如何定义卷积层。引用[2]中的代码定义了两个卷积层,分别使用3264个输出通道,卷积核大小为3x3,步长填充都是1。这部分可以作为参考。 然后,池化层通常使用最大池化或平均池化。引用[2]中的代码使用了nn.MaxPool2d,核大小为2x2,步长2,这样每次池化后特征图尺寸减半。这部分代码也应该包含在回答中。 接下来,我需要确保代码的正确性可读性。用户可能希望看到完整的模型定义,包括前向传播过程。例如,引用[2]中的CNNModel类展示了卷积层池化层全连接层的组合,但用户只需要卷积层池化层的基本实现,所以可以简化代码,去除全连接部分,或者单独展示卷积池化的步骤。 另外,用户提到想了解基本实现,可能需要更底层的代码,比如手动实现卷积操作。引用[3]提到了im2col方法,这可以高效地实现卷积。不过对于大多数应用,使用框架内置的卷积层更为方便。因此,回答中可能需要区分框架实现手动实现,但根据用户提供的引用,引用[2]的PyTorch代码更为直接,所以优先展示框架代码,并简要提及手动方法。 同时,需要解释代码中的参数,如输入输出通道、卷积核大小、步长、填充等,帮助用户理解每个参数的作用。例如,在PyTorch中,nn.Conv2d的参数包括输入通道数、输出通道数、kernel_size等,这些都需要在注释中说明。 池化层的参数类似,比如核大小、步长,这些影响输出尺寸。最大池化通常用于保留显著特征,而平均池化用于平滑。用户的问题中可能只需要最大池化例子,如引用[2]中的代码所示。 最后,需要检查代码是否符合用户提供的引用内容,确保引用正确。例如,引用[2]中的代码结构是否准确,以及是否遗漏了关键部分。同时,按照用户要求,在回答末尾添加相关问题,帮助用户进一步学习。 总结步骤: 1. 提供PyTorch框架下的卷积层池化层代码示例。 2. 解释代码中的参数步骤。 3. 参考用户提供的引用,特别是引用[2]引用[3],确保准确。 4. 生成相关问题,如参数影响、其他池化方法、手动实现等。</think>以下是基于PyTorch框架实现的CNN卷积层池化层基础代码及解析: ### 一、卷积层基础实现 ```python import torch import torch.nn as nn # 定义卷积层 conv_layer = nn.Conv2d( in_channels=3, # 输入通道数(RGB图像为3) out_channels=16, # 输出特征图数量 kernel_size=3, # 卷积核尺寸3x3 stride=1, # 滑动步长 padding=1 # 边缘填充像素数 ) # 前向传播示例 input_tensor = torch.randn(1, 3, 32, 32) # (batch, channel, height, width) output = conv_layer(input_tensor) print(output.shape) # torch.Size([1, 16, 32, 32])[^2] ``` 参数说明: - `in_channels`:输入数据通道数,灰度图为1,RGB图为3 - `out_channels`:卷积核数量,决定输出特征图维度 - `kernel_size`:感受野大小,常用3x3或5x5 - `stride`:控制特征图下采样率 - `padding`:保持空间维度的关键参数[^4] ### 二、池化层基础实现 ```python # 最大池化层 pool_layer = nn.MaxPool2d( kernel_size=2, # 池化窗口尺寸 stride=2 # 滑动步长(通常等于kernel_size) ) # 平均池化层 avg_pool_layer = nn.AvgPool2d(2, stride=2) # 应用示例 conv_output = torch.randn(1, 16, 32, 32) max_pool_output = pool_layer(conv_output) print(max_pool_output.shape) # torch.Size([1, 16, 16, 16])[^2] ``` 池化层作用: 1. 降低特征图空间维度 2. 增强平移不变性 3. 减少计算过拟合风险[^4] ### 三、完整处理流程示例 ```python class SimpleCNN(nn.Module): def __init__(self): super().__init__() self.conv_block = nn.Sequential( nn.Conv2d(3, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), nn.Conv2d(16, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2) ) def forward(self, x): return self.conv_block(x) # 测试网络 model = SimpleCNN() test_input = torch.randn(1, 3, 64, 64) print(model(test_input).shape) # torch.Size([1, 32, 16, 16])[^2] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值