CNN中卷积的意义

在传统的神经网络中,比如多层感知机(MLP),其输入通常是一个特征向量。需要人工设计特征,然后将用这些特征计算的值组成特征向量。在过去几十年的经验来看,人工找的特征并不总是好用。有时多了,有时少了,有时选的特征根本就不起作用(真正起作用的特征在浩瀚的未知里)。这就是为啥过去几十年神经网络一直被SVM等完虐的原因。
如果有人说,任何特征都是从图像中提取的。那如果把整幅图像作为特征来训练神经网络不就行了嘛,那肯定不会有任何的信息丢失!额,先不说一幅图像有多少冗余信息,单说这数据量就,吓死了!
假如有一幅1000*1000的图像,如果把整幅图像作为向量,则向量的长度为1000000(10^6)。在假如隐含层神经元的个数和输入一样,也是1000000;那么,输入层到隐含层的参数数据量有10^12,妈呀,什么样的机器能训练这样的网络呢。所以,我们还得降低维数,同时得以整幅图像为输入(人类实在找不到好的特征了)。于是,牛逼的卷积来了。接下来看看卷积都干了些啥。
局部感知:
卷积神经网络有两种神器可以降低参数数目,第一种神器叫做局部感知野。一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。网络部分连通的思想,也是受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。如下图所示:左图为全连接,右图为局部连接。


在上右图中,假如每个神经元只和10×10个像素值相连,那么权值数据为1000000×100个参数,减少为原来的千分之一。而那10×10个像素值对应的10×10个参数,其实就相当于卷积操作。

权值共享:

但其实这样的话参数仍然过多,那么就启动第二级神器,即权值共享。在上面的局部连接中,每个神经元都对应100个参数,一共1000000个神经元,如果这1000000个神经元的100个参数都是相等的,那么参数数目就变为100了。
怎么理解权值共享呢?

我们可以这100个参数(也就是卷积操作)看成是提取特征的方式,该方式与位置无关。这其中隐含的原理则是:图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。
更直观一些,当从一个大尺寸图像中随机选取一小块,比如说 8×8 作为样本,并且从这个小块样本中学习到了一些特征,这时我们可以把从这个 8×8 样本中学习到的特征作为探测器,应用到这个图像的任意地方中去。特别是,我们可以用从 8×8 样本中所学习到的特征跟原本的大尺寸图像作卷积,从而对这个大尺寸图像上的任一位置获得一个不同特征的激活值。
如下图所示,展示了一个3*3的卷积核在5*5的图像上做卷积的过程。每个卷积都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来。


多卷积核:

上面所述只有100个参数时,表明只有1个100*100的卷积核,显然,特征提取是不充分的,我们可以添加多个卷积核,比如32个卷积核,可以学习32种特征。在有多个卷积核时,如下图所示



上图右,不同颜色表明不同的卷积核。每个卷积核都会将图像生成为另一幅图像。比如两个卷积核就可以将生成两幅图像,这两幅图像可以看做是一张图像的不同的通道。如下图所示:

池化(down-samplin):

在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如 softmax 分类器,但这样做面临计算量的挑战。例如:对于一个 96X96 像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 − 8 + 1) × (96 − 8 + 1) = 7921 维的卷积特征,由于有 400 个特征,所以每个样例 (example) 都会得到一个 892 × 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。
为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。


多卷积层:

在实际应用中,往往使用多层卷积,然后再使用全连接层进行训练,多层卷积的目的是一层卷积学到的特征往往是局部的,层数越高,学到的特征就越全局化。

到此,基本上就把CNN中的卷积说全了!







<think>好的,我现在需要帮助用户解决关于CNN卷积核设计和构建方法的问题。用户引用了三篇博客文章,其中提到了卷积核的本质、使用小卷积核的原因以及卷积过程。我需要结合这些引用,并参考用户之前的对话历史,来组织一个结构清晰的回答。首先,用户的问题是如何在CNN中设计和构建卷积核。根据引用[1],单个卷积核的本质是一个神经元,而引用[3]解释了卷积核在多个通道上的操作。这可能涉及到卷积核的尺寸、深度、初始化方法等方面。接下来,我需要整理出卷积核设计的关键要素。比如,尺寸选择(如3x3)、深度与输入通道一致、初始化方法(如He初始化)、使用多层小卷积核替代大核(引用[2]提到的参数量和计算量优势)。此外,还要考虑特殊卷积核的设计,比如深度可分离卷积,以及1x1卷积核的作用。然后,构建步骤可能包括确定输入输出维度、选择卷积核参数、权重初始化、正则化防止过拟合,以及优化方法。这部分需要结合引用中的内容,比如引用[1]提到的神经元本质,引用[2]中的参数计算,以及引用[3]中的多通道处理。 在示例代码部分,可能需要用PyTorch或Keras展示如何定义卷积层,并明参数的意义。比如,在PyTorch中,Conv2d的参数包括输入输出通道、核大小、步长等,这里需要正确展示代码并解释每个部分。最后,生成相关问题需要考虑用户可能的后续疑问,比如不同卷积核大小的选择、1x1卷积核的应用、初始化方法的影响等。这些问题需要与之前的回答内容紧密相关,帮助用户深入理解。需要确保回答符合系统指令,如使用正确的LaTeX格式,引用标注在适当的位置,结构清晰,分点明。同时,避免使用Markdown格式,保持自然的中文表达,并检查是否有遗漏的关键点。</think>### CNN卷积核的设计与构建方法 #### 一、卷积核的核心设计要素 1. **尺寸选择** 常用奇数尺寸($3\times3$, $5\times5$),确保中心对称且边缘处理方便[^2]。 $$ \text{感受野计算公式:} RF_{l} = RF_{l-1} + (k_l -1) \times \prod_{i=1}^{l-1} s_i $$ 其中$k_l$为当前层卷积核尺寸,$s_i$为前面各层的步长。 2. **深度匹配输入通道** 每个卷积核的深度必须与输入特征图的通道数一致[^3]。例如输入为RGB三通道图像时,卷积核维度为$3\times3\times3$(宽$\times$高$\times$通道)。 3. **初始化方法** - He初始化:适合ReLU激活函数,权重从$\mathcal{N}(0, \sqrt{2/n_{\text{in}}})$采样[^1] - Xavier初始化:适用于Sigmoid/Tanh,权重从$\mathcal{N}(0, \sqrt{1/n_{\text{in}}})$采样 4. **小卷积核堆叠策略** 通过多层$3\times3$卷积核替代单层$5\times5$核,在保持相同感受野的同时减少参数量: $$ 2\times(3^2C^2) \text{ vs } 1\times(5^2C^2) \Rightarrow 参数减少28\% $$ [^2] #### 二、构建卷积核的具体步骤 1. **确定输入输出维度** - 输入特征图尺寸:$H_{\text{in}} \times W_{\text{in}} \times C_{\text{in}}$ - 输出特征图尺寸: $$ H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} + 2p - k}{s} \right\rfloor +1 $$ $p$为填充,$k$为卷积核尺寸,$s$为步长 2. **参数配置** ```python # PyTorch示例 conv_layer = nn.Conv2d( in_channels=3, # 输入通道数 out_channels=64, # 卷积核数量 kernel_size=3, # 卷积核尺寸 stride=1, # 步长 padding=1, # 填充 bias=True # 是否包含偏置项 ) ``` 3. **权重初始化与正则化** ```python # He初始化 nn.init.kaiming_normal_(conv_layer.weight, mode='fan_out', nonlinearity='relu') # L2正则化通过优化器实现 optimizer = torch.optim.SGD(model.parameters(), weight_decay=0.001) ``` #### 三、特殊卷积核设计 1. **深度可分离卷积** 将标准卷积分解为: - **深度卷积**:每个通道单独卷积,$3\times3\times C_{\text{in}}$核 - **逐点卷积**:$1\times1\times C_{\text{in}}$核实现通道融合 参数量减少为: $$ \frac{1}{C_{\text{out}}} + \frac{1}{k^2} $$ 2. **空洞卷积** 通过设置膨胀率$d$扩大感受野: $$ \text{有效核尺寸} = k + (k-1)(d-1) $$ 3. **动态卷积核** 根据输入特征生成动态权重: $$ W(x) = \phi(x) \cdot W_0 $$ 其中$\phi(x)$为注意力网络生成的权重系数 #### 四、设计原则验证方法 1. **可视化中间特征** 通过可视化卷积核响应,观察是否捕捉到边缘、纹理等基础特征[^1] ```python # 可视化第一层卷积核 kernels = model.conv1.weight.detach().cpu() plt.figure(figsize=(20,10)) for i in range(16): plt.subplot(4,4,i+1) plt.imshow(kernels[i][0], cmap='gray') ``` 2. **计算参数量与FLOPs** - 参数量:$C_{\text{out}} \times (k \times k \times C_{\text{in}} + 1)$ - FLOPs:$H_{\text{out}} \times W_{\text{out}} \times C_{\text{out}} \times (k \times k \times C_{\text{in}} + 1)$ --- ### 示例:自定义卷积核实现边缘检测 ```python import torch import torch.nn as nn # 定义垂直边缘检测核 edge_detector = nn.Conv2d(1, 1, kernel_size=3, bias=False) weights = torch.tensor([ [[[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]]] ], dtype=torch.float32) edge_detector.weight = nn.Parameter(weights) # 应用卷积核 input_tensor = torch.randn(1, 1, 28, 28) # 模拟MNIST输入 output = edge_detector(input_tensor) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值