卷积神经网络(Convolutional Neural Networks, CNN)

卷积神经网络(Convolutional Neural Networks, CNN)是深度学习领域中用于处理具有网格结构的输入(如图像和视频)的神经网络模型。下面以最简单、直观的方式概述CNN的主要流程及其基本概念:

1. 输入层

  • 概念:输入层直接接收原始数据,比如一张图片,通常是一张二维或三维的矩阵,包含像素信息。

  • 流程:例如,输入一张28x28像素的灰度图像,形成一个28x28的矩阵,每个元素代表一个像素的亮度值。

2. 卷积层

  • 概念:卷积层通过卷积核(或称滤波器)扫描输入数据,识别特定的特征。卷积核是一个小的矩阵,它会与输入数据的局部区域做元素相乘再求和的操作。

  • 流程:一个3x3的卷积核在输入图像上滑动,每次覆盖9个像素,计算一个值,这样就形成了一个"特征图",能够捕捉图像中的基本特征,如边缘、纹理等。

3. 激活函数

  • 概念:激活函数引入了非线性变换,使得网络能够学习更复杂的模式。

  • 流程:通常在卷积操作后应用,如ReLU(Rectified Linear Unit),它会将所有负值置为0,保留和放大正值,增强网络的表达能力。

4. 池化层

  • 概念:池化层用于降低数据的维度,同时保留重要信息,增强模型对位置轻微变化的鲁棒性。

  • 流程:常见的有最大池化(取局部区域的最大值)和平均池化(取局部区域的平均值),通常使用2x2的窗口,步长为2,将特征图的尺寸减半。

5. 全连接层

  • 概念:全连接层连接所有神经元,用于整合所有特征,做出最终的分类或回归预测。

  • 流程:将卷积和池化后的多维特征图展平为一维向量,通过权重矩阵映射到分类标签的空间,输出每个类别的概率。

6. 输出层

  • 概念:输出层给出最终的分类决策或回归结果。

  • 流程:在分类任务中,通常通过softmax函数将全连接层的输出转换为概率分布,预测概率最高的类别为最终结果。

整个过程可以概括为:原始图像输入 → 卷积提取特征 → 激活非线性变换 → 池化降维 → 全连接层整合特征 → 输出层给出预测结果。

通过多层的卷积和池化处理,CNN能够从原始像素中自动学习和提取多层次的特征,最终用于识别和分类。

python 复制代码
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(         # 输入大小 (1, 28, 28)
            nn.Conv2d(
                in_channels=1,              # 灰度图
                out_channels=16,            # 要得到几 多少个特征图
                kernel_size=5,              # 卷积核大小
                stride=1,                   # 步长
                padding=2,                  # 如果希望卷积后大小跟原来一样,需要设置padding=(kernel_size-1)/2 if stride=1
            ),                              # 输出的特征图为 (16, 28, 28)
            nn.ReLU(),                      # relu层
            nn.MaxPool2d(kernel_size=2),    # 进行池化操作(2x2 区域), 输出结果为: (16, 14, 14)
        )
        self.conv2 = nn.Sequential(         # 下一个套餐的输入 (16, 14, 14)
            nn.Conv2d(16, 32, 5, 1, 2),     # 输出 (32, 14, 14)
            nn.ReLU(),                      # relu层
            nn.Conv2d(32, 32, 5, 1, 2),
            nn.ReLU(),
            nn.MaxPool2d(2),                # 输出 (32, 7, 7)
        )
        
        self.conv3 = nn.Sequential(         # 下一个套餐的输入 (16, 14, 14)
            nn.Conv2d(32, 64, 5, 1, 2),     # 输出 (32, 14, 14)
            nn.ReLU(),             # 输出 (32, 7, 7)
        )
        
        self.out = nn.Linear(64 * 7 * 7, 10)   # 全连接层得到的结果

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = x.view(x.size(0), -1)           # flatten操作,结果为:(batch_size, 32 * 7 * 7)
        output = self.out(x)
        return output
1. 再加入一层卷积,效果怎么样?

在神经网络中,增加一层卷积层通常可以增强模型的表征能力,使其能够学习到更复杂的特征。但是,这同样会增加模型的复杂度,可能导致模型训练时间变长,以及在数据量不足时容易发生过拟合。具体效果如何,需要通过实验验证。

例如,如果原模型有一层卷积层,你可以尝试在其后增加另一层卷积层,同时考虑使用更小的滤波器(例如 3x3)和合适的步长与填充,以保持输出尺寸不变。增加的卷积层可以使用ReLU激活函数,以保持非线性。

conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1)
conv2 = nn.Conv2d(out_channels, out_channels_next, kernel_size=3, stride=1, padding=1)

在实际操作中,需要监控模型的训练和验证集性能,确保增加的复杂性带来了实际的性能提升。

2. 当前任务中为什么全连接层是3277?每一个数字代表什么含义?

在卷积神经网络中,全连接层前的尺寸通常反映了特征图的大小和深度。3277中的每个数字有其特定含义:

  • 32:代表特征图的深度(也就是上一层输出的通道数)。这通常是指在卷积层或池化层后,模型学习到的特征的数量。每个通道可以看作是模型学习到的某种特定特征的响应。

  • 77:表示特征图的宽度和高度。这是经过一系列卷积和池化操作后,原始输入图像被降采样(或下采样)后的尺寸。

以典型的CNN架构为例,假设输入图像为224x224像素,使用一个7x7的卷积核,经过两次最大池化(每次池化核大小为2x2,步长为2),特征图的尺寸会从224x224降为56x56,再降为28x28,最后到14x14。如果在14x14的特征图上再使用卷积层,特征图的深度会增加,但宽度和高度保持不变,直到最后被展平(flatten)成1D向量送入全连接层。

因此,如果最终特征图的深度为32,而宽度和高度均为7,展平后的向量长度即为3277,这是在进入全连接层前,模型对图像特征的最终表征。全连接层将使用这些特征进行最终的分类决策。

相关推荐
喵~来学编程啦11 分钟前
【论文精读】LPT: Long-tailed prompt tuning for image classification
人工智能·深度学习·机器学习·计算机视觉·论文笔记
深圳市青牛科技实业有限公司24 分钟前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
水豚AI课代表1 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
几两春秋梦_1 小时前
符号回归概念
人工智能·数据挖掘·回归
用户691581141652 小时前
Ascend Extension for PyTorch的源码解析
人工智能
Chef_Chen2 小时前
从0开始学习机器学习--Day13--神经网络如何处理复杂非线性函数
神经网络·学习·机器学习
用户691581141652 小时前
Ascend C的编程模型
人工智能
成富3 小时前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
CSDN云计算3 小时前
如何以开源加速AI企业落地,红帽带来新解法
人工智能·开源·openshift·红帽·instructlab
艾派森3 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘