卷积神经网络(CNN)知识复习笔记

一、图像基础知识

1.1 图像基本概念

图像是由像素点组成的二维数组,每个像素点的取值范围为[0,255]。像素值越接近0,颜色越暗(接近黑色);像素值越接近255,颜色越亮(接近白色)。

彩色图像由RGB三个通道组成,分别表示红、绿、蓝三原色。图像的基本表示维度为[H, W, C](高度、宽度、通道数)。

1.2 图像加载与处理

使用matplotlib库可以加载和显示图像:

import matplotlib.pyplot as plt
import numpy as np

# 加载图像
img = plt.imread("data/img.jpg")
print("图像形状:", img.shape)  # 输出 (H, W, C)

# 显示图像
plt.imshow(img)
plt.axis("off")
plt.show()

二、CNN概述

2.1 什么是卷积神经网络

卷积神经网络(Convolutional Neural Network)是含有卷积层的神经网络,专门用于处理图像、视频等数据。CNN通过卷积层自动学习并提取图像特征。

2.2 CNN基本构成

CNN网络主要由三部分组成:

  1. ​卷积层​​:负责提取图像中的局部特征

  2. ​池化层​​:大幅降低参数量级(降维)

  3. ​全连接层​​:输出最终结果

三、卷积层

3.1 卷积计算原理

卷积运算本质上是卷积核与输入数据的局部区域间做点积运算。卷积核(滤波器)是一组固定的权重,通过在输入数据上滑动并计算点积来生成特征图。

3.2 多通道卷积计算

当输入有多个通道时,卷积核需要拥有相同的通道数。每个卷积核通道与对应的输入图像通道进行卷积,结果按位相加得到最终特征图。

3.3 填充(Padding)与步长(Stride)

  • ​Padding​​:在输入特征图边界周围添加额外像素(通常为零),用于保持卷积后特征图尺寸不变

  • ​Stride​​:卷积核在图像上滑动的步长大小,影响输出特征图尺寸

3.4 特征图大小计算

输出特征图大小计算公式:

N=(W−F+2P) / S ​+1

其中:

  • W:输入图像大小

  • F:卷积核大小

  • P:Padding数量

  • S:Stride大小

3.5 PyTorch卷积层API

import torch.nn as nn

# 创建卷积层
conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)

参数说明:

  • in_channels:输入通道数

  • out_channels:输出通道数(卷积核数量)

  • kernel_size:卷积核大小

  • stride:步长

  • padding:填充数量

四、池化层

4.1 池化层作用

池化层用于降低输入数据的空间维度,减少计算量和内存消耗,提高模型鲁棒性。池化操作通常在卷积层之后进行。

4.2 池化类型

  1. ​最大池化​​:取池化窗口内的最大值作为输出

  2. ​平均池化​​:取池化窗口内所有值的平均值作为输出

4.3 多通道池化

池化层对每个输入通道分别进行池化,输入输出通道数保持不变。池化只在宽高维度上进行,不改变通道数。

4.4 PyTorch池化层API

# 最大池化
nn.MaxPool2d(kernel_size=2, stride=2, padding=1)

# 平均池化
nn.AvgPool2d(kernel_size=2, stride=1, padding=0)

五、图像分类案例(CIFAR10)

5.1 CIFAR10数据集

CIFAR-10数据集包含:

  • 5万张训练图像

  • 1万张测试图像

  • 10个类别(飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车)

  • 图像大小:32×32×3

5.2 网络架构

class ImageClassification(nn.Module):
    def __init__(self):
        super(ImageClassification, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, stride=1, kernel_size=3)
        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(6, 16, stride=1, kernel_size=3)
        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
        self.linear1 = nn.Linear(576, 120)
        self.linear2 = nn.Linear(120, 84)
        self.out = nn.Linear(84, 10)

5.3 模型训练与评估

使用交叉熵损失函数和Adam优化器进行训练,并在测试集上评估模型准确率。

六、优化建议

根据案例运行结果(测试集准确率约57%),可从以下方面进行优化:

  1. 增加卷积核输出通道数

  2. 增加全连接层的参数量

  3. 调整学习率

  4. 更换优化方法

  5. 修改激活函数

  6. 使用更深的网络结构

  7. 增加数据增强技术

  8. 使用批量归一化(Batch Normalization)

七、总结

卷积神经网络是计算机视觉领域的核心算法,通过局部连接和权值共享大大减少了网络参数数量。掌握CNN的基本原理、卷积层和池化层的计算过程以及PyTorch实现方法,是深入学习计算机视觉领域更复杂模型的基础。

CNN的核心优势在于其能够自动学习图像特征,无需人工设计特征提取器,在图像分类、目标检测、图像分割等任务中表现出色。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐