卷积神经网络(CNN)基本部件

本文深入探讨了卷积神经网络(CNN)的架构与工作原理,包括卷积层、池化层及全连接层的作用与计算方式,并通过CIFAR100分类任务的实例演示了CNN的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

卷积神经网络

  • 由一个或多个卷积层、池化层以及全连接层等组成。
  • 与其他深度学习结构相比,卷积神经网络在图像等方面能够给出更好的结果。
  • 这一模型也可以使用反向传播算法进行训练。
  • 相比较其他浅层或深度神经网络,卷积神经网络需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。


在这里插入图片描述

1 卷积层(Convolutions)

  • 卷积运算的目的是提取输入的不同特征,某些卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。
  • 计算公式
    在这里插入图片描述
  • 假设我们有10 个Filter,每个Filter3 X 3 X 3(计算RGB图片),并且只有一层卷积,那么参数有多少?
    • 计算:每个Filter参数个数为:3 X 3 X 3 + 1 bias = 28个权重参数,总共28 * 10 = 280个参数,即使图片任意大小,我们这层的参数也就这么多。

卷积层充当特征提取的角色,但是并没有减少图片的特征数量,在最后的全连接层依然面临大量的参数,所以需要池化层进行特征数量的减少

2 池化层(Pooling、Subsampling)

池化层主要对卷积层学习到的特征图进行亚采样(subsampling)处理,主要由两种

  • 最大池化:Max Pooling,取窗口内的最大值作为输出
  • 平均池化:Avg Pooling,取窗口内的所有值的均值作为输出
  • 意义在于:
    (1)降低了后续网络层的输入维度,缩减模型大小,提高计算速度
    (2)提高了Feature Map 的鲁棒性,防止过拟合
    在这里插入图片描述
    在这里插入图片描述
    对于一个输入的图片,我们使用一个过滤器filter大小为2 x 2,步长stride为2的参数进行求最大池化操作。同样池化也有一组参数 f,s,得到2 * 2的大小。当然如果我们调整这个超参数,比如说3 * 3,那么结果就不一样了,通常选择默认都是 f = 2 * 2, s = 2
    池化超参数特点:不需要进行学习,不像卷积通过梯度下降进行更新。

3 全连接层(Full connection)

卷积层+激活层+池化层可以看成是CNN的特征学习/特征提取层,而学习到的特征(Feature Map)最终应用于模型任务(分类、回归):

  • 先对所有 Feature Map 进行扁平化(flatten, 即 reshape 成 1 x N 向量)
  • 再接一个或多个全连接层,进行模型学习
    在这里插入图片描述

示例demo——CNN算法实现CIFAR100分类

模型网络设计:两层卷积层+两个神经网络层
CIFAR100输入的每批次若干图片数据大小为[None, 32, 32, 3],其中None表示图片数量,[32, 32, 3]表示图片大小。

1、两层 卷积层

  • 第一层

    • (1) 卷积:32个filter、大小5*5、strides=1、padding=“SAME”
      • 图片数据:[None, 32, 32, 3]———>[None, 32, 32, 32]
        32 = ( 32 − 5 + 2 ∗ p ) / 1 + 1    ⟹    p = 2 32=(32-5+2*p)/1+1\implies p=2 32=(325+2p)/1+1p=2
      • 权重数量:[5, 5, 3 ,32]
      • 偏置数量:[32]
    • (2) 激活:Relu
      • 图片数据:[None, 32, 32, 32]———>[None, 32, 32, 32]
    • (3) 池化:大小2x2、strides2
      • 图片数据:[None, 32, 32, 32]———>[None, 16, 16, 32]
  • 第二层

    • (1) 卷积:64个filter、大小5*5、strides=1、padding=“SAME”
      • 图片数据:[None, 16, 16, 32]———>[None, 16, 16, 64]
        16 = ( 16 − 5 + 2 ∗ p ) / 1 + 1    ⟹    p = 2 16=(16-5+2*p)/1+1\implies p=2 16=(165+2p)/1+1p=2
      • 权重数量:[5, 5, 32 ,64]
      • 偏置数量:[64]
    • (2)激活:Relu
      • 图片数据:[None, 16, 16, 64]———>[None, 16, 16, 64]
    • (3) 池化:大小2x2、strides2
      • 图片数据:[None, 16, 16, 64]———>[None, 8, 8, 64]

2、两层 神经网络

  • 第一层 隐层1024个神经元
    • 先对所有 Feature Map 进行扁平化(flatten, 即 reshape 成 1 x N 向量)
    • 图片数据:[None, 8, 8, 64]——>[None, 8 * 8 * 64] x [8 * 8 * 64, 1024] = [None, 1024]
    • 权重数量:[8 * 8 * 64, 1024]
    • 偏置数量:[1024]
  • 第二层 全连接层 100个神经元(100个分类)
    • 图片数据:[None,1024] x [1024, 100]——>[None, 100]
    • 权重数量:[1024, 100]
    • 偏置数量:[100]
import tensorflow as tf
from tensorflow.python import keras

class CNNCifar100(object):
    model = keras.Sequential([
        keras.layers.Conv2D(32, kernel_size=5, strides=1,
                            padding='same', data_format='channels_last', activation=tf.nn.relu),
        keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),  # 池化层此处padding='same'与卷积层的效果不同
        keras.layers.Conv2D(64, kernel_size=5, strides=1,
                            padding='same', data_format='channels_last', activation=tf.nn.relu),
        keras.layers.MaxPool2D(pool_size=2, strides=2, padding='same'),
        keras.layers.Flatten(),
        keras.layers.Dense(1024, activation=tf.nn.relu),
        keras.layers.Dense(100, activation=tf.nn.softmax),
    ])

    def __init__(self):
        (self.train, self.train_label), (self.test, self.test_label) = keras.datasets.cifar100.load_data()
        # print(self.train)
        # print(self.train.shape, self.train_label.shape)
        self.train = self.train.reshape(-1, 32, 32, 3) / 255.0  # "-1":代表未知数,原始数据本来就是(?, 32, 32, 3) 可以不用reshape
        self.test = self.test.reshape(-1, 32, 32, 3) / 255.0

    def compile(self):
        CNNCifar100.model.compile(optimizer=keras.optimizers.Adam(),
                               loss=tf.keras.losses.sparse_categorical_crossentropy,
                               metrics=['accuracy'])
        return None

    def fit(self):
        CNNCifar100.model.fit(self.train, self.train_label, epochs=1, batch_size=32)
        return None

    def evaluate(self):
        test_loss, test_acc = CNNCifar100.model.evaluate(self.test, self.test_label)
        print(test_loss, test_acc)
        return None


if __name__ == '__main__':
    cnn = CNNCifar100()
    cnn.compile()
    cnn.fit()
    cnn.evaluate()
    print(CNNCifar100.model.summary())
===运行结果:==========================================================
Epoch 1/1
   32/50000 [..............................] - ETA: 26:10 - loss: 4.6117 - acc: 0.0000e+00
   64/50000 [..............................] - ETA: 14:58 - loss: 4.6596 - acc: 0.0156    
   96/50000 [..............................] - ETA: 11:18 - loss: 4.6906 - acc: 0.0104
......
49952/50000 [============================>.] - ETA: 0s - loss: 3.4632 - acc: 0.1822
49984/50000 [============================>.] - ETA: 0s - loss: 3.4631 - acc: 0.1822
50000/50000 [==============================] - 238s 5ms/step - loss: 3.4631 - acc: 0.1822

   32/10000 [..............................] - ETA: 28s
   96/10000 [..............................] - ETA: 16s
  160/10000 [..............................] - ETA: 14s
......
 9888/10000 [============================>.] - ETA: 0s
 9952/10000 [============================>.] - ETA: 0s
10000/10000 [==============================] - 12s 1ms/step
损失评估结果: 2.957594190597534
准确率评估结果: 0.275

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              multiple                  2432      
_________________________________________________________________
max_pooling2d (MaxPooling2D) multiple                  0         
_________________________________________________________________
conv2d_1 (Conv2D)            multiple                  51264     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 multiple                  0         
_________________________________________________________________
flatten (Flatten)            multiple                  0         
_________________________________________________________________
dense (Dense)                multiple                  4195328   
_________________________________________________________________
dense_1 (Dense)              multiple                  102500    
=================================================================
Total params: 4,351,524
Trainable params: 4,351,524
Non-trainable params: 0
_________________________________________________________________
None
<think>好的,用户想了解卷积神经网络基本原理。首先,我需要回忆一下CNN的核心概念。记得CNN主要由卷积层、池化层和全连接层组成,对吧?用户可能已经知道一些基础,但需要系统的解释。 首先应该从生物灵感说起,比如视觉皮层的结构,这样能解释为什么CNN在图像处理上有效。然后要分层次介绍每个部分的作用。卷积层负责提取特征,使用滤波器进行卷积操作,这里需要提到局部感受野和权值共享,这两个特点减少了参数数量,避免过拟合。 接下来是激活函数,比如ReLU,用来引入非线性。这部分需要简单说明其重要性,但不用太深入。然后是池化层,特别是最大池化,用于降维和保持平移不变性。可能需要解释下池化操作的具体过程,比如2x2窗口取最大值。 之后是全连接层,将提取的特征进行分类或回归。这里可以对比传统神经网络,说明全连接层的作用。然后需要提到CNN的整体结构,比如LeNet或AlexNet的例子,但用户可能不需要具体网络结构,而是基本原理。 还要考虑用户可能的疑问,比如为什么CNN比全连接网络好,这时候要强调参数共享和局部连接的优势。另外,用户可能对应用场景感兴趣,比如图像识别、物体检测等,但问题主要集中在原理上,所以点到为止即可。 需要检查是否有遗漏的关键点,比如数据流动过程,卷积后的特征图尺寸计算,可能用户不需要公式,但提到步长和填充的影响是有必要的。不过用户要求行内数学表达式用$...$,如果有必要可以适当加入,比如卷积操作的计算公式。 还要确保引用相关的参考资料,比如站内的引用[1]和[2],但用户提供的引用内容有限,需要自然融入回答中,比如在介绍卷积层和池化层时提到引用来源。注意引用标识的位置,放在相关段落末尾。 最后,生成相关问题时要围绕基本原理展开,比如各层的作用、与传统网络的区别、权值共享的好处等。确保问题有助于用户深入理解,并且覆盖可能的知识点。 总结一下,回答结构应该是:引言、层次介绍(卷积层、激活函数、池化层、全连接层)、特点总结、应用场景,最后相关问题。保持语言简洁,符合中文表达,避免技术术语过于密集,适当举例说明。</think>### 卷积神经网络CNN基本原理 卷积神经网络(Convolutional Neural Network,CNN)是一种专为处理**网格状数据**(如图像、音频)设计的前馈神经网络,其核心思想是通过**局部感受野****权值共享****层次化特征提取**实现高效学习。以下是其核心原理的分步解析: --- #### 1. **卷积层(Convolution Layer)** - **功能**:提取局部特征(如边缘、纹理)。 - **操作**:使用可学习的滤波器(卷积核)在输入数据上滑动,计算局部区域的加权和。 - 数学表达式:$S(i,j) = (I * K)(i,j) = \sum_m \sum_n I(i+m, j+n)K(m,n)$ 其中 $I$ 是输入,$K$ 是卷积核,$*$ 表示卷积操作。 - **权值共享**:同一卷积核在整个输入上重复使用,极大减少参数量[^1]。 - **输出**:生成特征图(Feature Map),反映输入中特定模式的存在位置。 --- #### 2. **激活函数(Activation Function)** - **作用**:引入非线性,增强模型表达能力。 - **常用函数**:ReLU(修正线性单元),定义为 $f(x) = \max(0, x)$,解决梯度消失问题并加速训练[^2]。 --- #### 3. **池化层(Pooling Layer)** - **功能**:降低特征图维度,增强平移不变性。 - **操作**:对局部区域进行下采样。 - 最大池化(Max Pooling):取区域内的最大值,保留最显著特征。 - 数学表达式:$P(i,j) = \max_{(m,n) \in R_{i,j}} I(m,n)$ 其中 $R_{i,j}$ 是池化窗口覆盖的区域。 --- #### 4. **全连接层(Fully Connected Layer)** - **功能**:整合高层次特征,进行分类或回归。 - **实现**:将池化后的特征展平为一维向量,通过传统神经网络输出结果。 --- #### 5. **CNN 的独特优势** 1. **稀疏连接**:神经元仅连接输入局部区域,减少计算量。 2. **平移不变性**:池化操作使模型对目标位置变化不敏感。 3. **层次化特征**:浅层提取边缘/颜色,深层组合成复杂语义(如物体部件)[^1]。 --- #### 6. **应用场景** - 图像分类(如ImageNet竞赛) - 目标检测(如YOLO、Faster R-CNN) - 医学图像分析(如肿瘤识别) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值