cnn介绍

卷积神经网络(ConvolutionalNeural Networks,简称CNN)提出于20世纪60年代,由Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现。

        CNN是目前深度学习最大的一个流派,其应用优点在于避免了对图像的复杂前期预处理,可以直接处理原始图像。CNN核心在于“卷积”,传统机器学习中LBP、HOG等特征都可以看作是卷积的一种特殊形式,“卷积”以不同的参数来描述不同的抽象程度特征,更接近于原始图像的“特征抽象”。


        如上图所示,利用一个滑动窗口(卷积核)对原始图像区域进行“筛选”,将对应像素相乘,再累加( I*K),就得到了一个像素的卷积结果。可以说卷积就像一个筛子,按照一定规则(借助卷积核“乘累加”)对原始图像再加工(实际是一个积分),公式可以描述为:


        来看一个典型的CNN实例,对于分辨率为28*28的图片处理过程:


        其中Conv为卷积层(采用5*5的卷积核,Step为1),实现数据特征提取;Pool为池化层,也称为降采样(Sample),实现数据降维;FC为全连接层,通过一定规则的计算(也可能为卷积计算)得到结果。

        我们把卷积层、池化层等中间层统一称为隐层。接下来深入了解每个层的含义来加深对CNN的理解。


•   卷积层与权值共享

        按照生物学神经元数据处理机制,每个神经元需要与前一层连接,用于特征提取,如下图所示,假设神经元数量为100万,那么对于100万像素的图像将建立1012个连接,这里面的权值的数量是非常大的。



        那么如何解决大量的权值计算(参数爆炸)问题呢?大开一下脑洞,我们做两个假设:

        1)减少每个神经元(对应隐层像素)的作用范围,比如设为10*10,仅和局部的100个像素建立局部连接;

              参数简化: 100(连接权值)*1M(神经元个数)

        2)所有神经元采用同一组权值进行计算,对应CNN就是用同一个卷积核去卷积图像,这就是权值共享

              参数简化: 100(权值)

        没错,我们只需要100个参数就建立了两层之间的连接,这靠谱吗?相信第一点很好理解,每个神经元是独立工作的,问题在于第二点,权值共享 这个玩笑开的确实有点大。

        事实上从生物学上解释,神经元确实是分类的,有的对边缘敏感,有的对亮度敏感,还有的感应颜色,每一类神经元的参数是近似一致的。

        想通了吗?关键就在于“分类”,每一类神经元对应一组权值,怕种类不够?

        那就用100个卷积核来描述100种神经元

        对于上面的例子,不同的卷积核如右图所示,我们得到最终的参数个数:

        参数简化: 100(权值)*100(卷积核)

        我们用1万个权值的卷积计算,近似模拟了神经元的处理过程,这个数量级的参数对于计算机来讲并不算多,特别是对于卷积这种已经能够做GPU并行计算的方法,这就是卷积的魅力。

•   池化

        池化(降采样)较为容易理解,获取一个区域内的典型特征,比如n*n像素范围的像素最大值或平均值,其意义在于能够对输入进行抽象描述,对特征进行降维。

        一般来讲,对于输入的池化区域都是分块处理的,与卷积的区别在于块之间一般不重叠,这样就保证了信息能够更快的抽象,抽象的价值在于提取里面的“显著特征”,而忽略“细节特征”。

常用的两种池化方法:

        1)最大值池化,应用最多,能够有效减少卷积层带来的均值偏差,对纹理特征的适应较好;

        2)平均值池化,对卷积结果进一步平滑,纹理和边缘特征容易丢失,但能有效避免噪声。

•   激活层

        神经网络真正的代表作出场了,在第一节已做过专题讲解,激活层 真正反映了神经元的工作机制,可以说是神经网络的精髓。

        在CNN中被广泛采用的ReLU函数有效解决了梯度扩散问题,你可以不必太在意“稀疏”,你可以忘掉“逐层预训练”,总结一句话那就是“激活函数的一小步,深度学习的一大步”。

        激活层一般添加在卷积层或者池化层之后,没有明确的位置定义,一般对于简单的网络来讲,激活层通常可以不添加。

•   Dropout层

        这个问题的提出源于神经网络的另一个大缺陷-“过拟合”,对应于前面导致“梯度扩散”问题的欠拟合。

常规解决“过拟合”问题的方法是模型平均,通过训练多个网络进行加权组合来进行规避,这样带来的问题是更大的计算量。

        Dropout方法最早由Hinton大神提出,针对一次训练过程,网络中的神经元节点按照一定的概率进行权值更新,也就是说,神经元有可能仅保留权值参数,下一个训练过程再更新。

        按照一定的随机策略,使每一次训练的神经元并不相同,也就是说神经元节点轮流工作,这种随机过程又向人脑前进了一步。

        每一次的Dropout相当于对网络做了一次简化(如上图所示),仅简化后的网络节点参与权值更新,整个训练过程中多次Dropout,每个节点都参与了训练和学习,当然偶尔也“翘个班”,过程很简单,为什么能得到好的效果呢?我们来分析一下:

        1)“天天大鱼大肉,顿顿鲍鱼龙虾”,偶尔吃个方便面吧,想想都嘚瑟,这个小调剂的效果出奇的好;

        2)班上一共20个学生,老师每次选择回答问题的都是那几个优秀的学生,Dropout避免了训练结果对某些节点的强依赖(权重过大);

      作者倾向于从遗传学的角度来进行解释,不同的基因组合方式能提高对于环境的适应能力,“优胜劣汰”的进化概率更高。

3)Dropout也可以理解为一种平均模型,区别在于,通过在多Step之间进行平均代替多个模型的组合。

        不管从哪个角度进行理解,Dropout本身都是直观有效的,这里面虽然没有严谨的数学公式推导,但源于生物学的直观理解,以及大量的实验足以证明。

        就好像有人问我深度学习为什么会有这么好的效果,为什么就能有效收敛?什么理论避免陷入局部最大值?我们对于某些问题的认知仅仅在这个层面上而已,有时候不需要纠结,能解决问题就可以了,至于其背后隐晦的林林种种,So What?

•   全连接层

        全连接层直观理解为简化的数据计算,其意义在于求解,对于网络本身的贡献值是比较低的,大多数情况下,全连接层放在网络最后面,有时也会被省略,这里不做过多解释,大家看到的时候能知道干什么的就行了。

•   回归层

        回归层理论上不属于CNN的一部分,当然也有人将其合并到网络,或者说也可以看作是全连接层的一部分,anyway,我们只是在这里将过程穿起来而已。

        回归是个比较熟悉的概念,前面讲过的逻辑回归、高斯回归等都属于回归,说白了回归就是对特征进行分类,可以分两类,也可以分多类。

        回归的作用也只是分类而已,你可以用最简单的SVM分类器进行分类,也可以采用复杂的多类划分,比如Softmax。Softmax是逻辑回归模型在多分类问题上的推广,本质上是将一个P维向量映射成另一个K维向量,其公式描述为:


        得到对应的类别代表的概率,这个概率正是我们要的分类结果。

### 卷积神经网络 (CNN) 的基本概念 卷积神经网络(Convolutional Neural Network,CNN)是一种专门用于处理具有网格状拓扑的数据的前馈神经网络[^1]。其设计灵感来源于生物视觉系统的结构特性,特别是哺乳动物的大脑如何感知外界环境中的模式和形状。 #### 主要组成部分 CNN 的主要组成模块包括以下几个部分: - **卷积层(Conv2d)** 卷积层是 CNN 中的核心组件之一,负责提取输入数据的空间层次特征。它通过对输入数据应用一系列滤波器来生成特征图,这些滤波器可以捕获边缘、纹理和其他重要的局部信息[^2]。 - **池化层(MaxPool2d)** 池化层的作用是对卷积层输出的结果进行降采样,从而减少计算量并保留最重要的特征。常见的池化方法有最大池化(max pooling),即取窗口内的最大值作为代表。 - **全连接层(Linear)** 全连接层通常位于网络的最后一部分,将前面各层提取到的高级抽象特征映射为具体的类别标签或其他预测结果。这一阶段会利用所有先前学到的信息来进行最终决策。 #### 特点 CNN 的两个显著特点是稀疏连接与权值共享: - **稀疏连接**:每个神经元仅与其感受野范围内的上一层单元相连,而非全局连接。 - **权值共享**:同一组权重被应用于整个输入空间的不同位置,这不仅减少了所需训练参数的数量,还增强了模型对于平移不变性的鲁棒性。 --- ### 应用领域 由于上述优势,CNN 已经成为许多实际应用场景下的首选工具,在多个方向展现了卓越的能力: - **图像分类**:这是最经典的 CNN 使用案例之一,比如 ImageNet 数据集上的大规模物体识别竞赛中多次夺冠的技术方案均基于此架构构建而成。 - **目标检测**:结合区域建议算法或者直接端到端实现的目标定位功能使得复杂场景下多物品同时发现变得可行。 - **语义分割**:逐像素级别标注任务需要精确控制边界细节以及保持整体连贯一致性,因此特别适合采用 FCN 或 U-net 这样的改进版本解决此类难题。 - **视频分析**:当时间维度加入考虑范畴之后,则可以通过三维卷积核进一步扩展传统二维形式适应动态变化序列需求。 - **医学影像诊断**:从 X 射线片读取病灶迹象直至 MRI 扫描切面解析癌症早期征兆等方面均有广泛探索实践价值。 ```python import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv_layer = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1) self.pooling_layer = nn.MaxPool2d(kernel_size=2, stride=2) self.fc_layer = nn.Linear(64 * 56 * 56, num_classes) def forward(self, x): x = self.pooling_layer(torch.relu(self.conv_layer(x))) x = x.view(-1, 64 * 56 * 56) x = self.fc_layer(x) return x ``` 以上是一个简单的 PyTorch 实现例子展示了如何定义一个基础版的 CNN 架构及其正向传播过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值