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

news/2024/10/3 14:01:28 标签: 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能够从原始像素中自动学习和提取多层次的特征,最终用于识别和分类。

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,这是在进入全连接层前,模型对图像特征的最终表征。全连接层将使用这些特征进行最终的分类决策。


http://www.niftyadmin.cn/n/5688492.html

相关文章

Java后端中的敏捷开发实践:测试驱动开发与持续集成

Java后端中的敏捷开发实践:测试驱动开发与持续集成 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将深入探讨Java后端开发中的两大敏捷实践:测试驱动…

JS进阶 3——深入面向对象、原型

JS 进阶3——深入面向对象、原型 1.编程思想 面向过程:分析出解决问题的过程,然后用函数将这些步骤一步步封装起来面向对象:将事物分为一个个对象,然后对象之间分工合作 2.构造函数:封装性、面向对象 构造函数方法存…

基于SpringBoot+Vue+MySQL的民宿预订平台

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着旅游业的蓬勃发展,民宿作为一种独特的住宿方式,受到了越来越多游客的青睐。然而,传统的民宿预定方式往往存在信息不对称、效率低下等问题,难以满足游客的个性化需…

关于鸿蒙next 调用系统权限麦克风

使用app的时候都清楚,想使用麦克风、摄像头,存储照片等,都需要调用系统的权限,没有手机操作系统权限你也使用不了app所提供的功能,虽然app可以正常打开,但是你需要的功能是没办法使用的。今天把自己在鸿蒙学…

Redis: Sentinel工作原理和故障迁移流程

Sentinel 哨兵几个核心概念 1 ) 定时任务 Sentinel 它是如何工作的,是如何感知到其他的 Sentinel 节点以及 Master/Slave节点的就是通过它的一系列定时任务来做到的,它内部有三个定时任务 第一个就是每一秒每个 Sentinel 对其他 Sentinel 和 Redis 节点…

如何使用 Python 读取数据量庞大的 excel 文件

使用 pandas.read_excel 读取大文件时,的确会遇到性能瓶颈,特别是对于10万行20列这种规模的 .xlsx 文件,常规的 pandas 方法可能会比较慢。 要提高读取速度,关键是找到更高效的方式处理 Excel 文件,特别是在 Python 的…

计算机网络:计算机网络体系结构 —— OSI 模型 与 TCP/IP 模型

文章目录 计算机网络体系结构OSI 参考模型TCP/IP 参考模型分层的必要性物理层的主要问题数据链路层的主要问题网络层的主要问题运输层的主要问题应用层的主要问题 分层思想的处理方法发送请求路由器转发接受请求发送响应接收响应 计算机网络体系结构 计算机网络体系结构是指将…

结合vueuse实现图片懒加载

介绍 为什么要有懒加载? 在一个网页中如果有很多张图片,那么用户初进这个页面的时候不必一次性把所有图片都加载出来,否则容易造成卡顿和浪费。应该是,用户的视图页面滑到该图片的位置,然后再把该图片加载出来。 前置…