Day59:卷积神经网络详解与案例
前面的章节中,我们介绍了深度神经网络的基本模型和优化算法,在本节中,我们将深入介绍卷积神经网络(Convolutional Neural Network,CNN)的原理和应用。
1. 卷积的基本概念
卷积是一种在图像处理和模式识别中常用的操作,它可以提取图像或其他数据的局部特征。卷积操作通过滑动一个小的窗口(卷积核)在输入数据上进行局部区域的计算,生成一个新的特征图。
在二维图像处理中,卷积操作可以用以下数学公式表示:
其中, 是输入图像, 是卷积核, 是输出图像中的位置, 是卷积核的索引。
卷积通过上图中卷积核在原图像上滑动的方式,计算出每个区域的值,其中卷积有几个重要参数:卷积核的大小(kernel),填充的区域(padding,默认无填充),卷积核滑动的步长(stride,默认步长为1)。
2. 卷积神经网络
卷积神经网络(CNN)是一种由多个卷积层、池化层和全连接层组成的层级结构。卷积层用于提取输入数据的特征图,池化层用于降低特征图的空间维度,减少参数数量,全连接层用于将特征映射转换为最终的输出。
其中卷积层要学习的参数就是卷积核中的参数,故卷积层有空间共享性:不同图像区域共享这个核的参数。池化层有最大池化和平均池化,即选取一个区域的最大值或者平均值作为代替这个区域的值,故池化层没有可学习参数。全连接层就是我们在前面讲到的具有可学习的矩阵和偏置。
典型的卷积神经网络结构包括输入层、卷积层、激活函数、池化层、全连接层和输出层。
###3. 经典CNN模型
-
LeNet-5:是最早的卷积神经网络模型,用于手写数字识别。它由卷积层、池化层和全连接层组成,是卷积神经网络在图像分类领域的开创性工作。
-
AlexNet:是在ImageNet图像分类比赛中取得突破性成果的模型。它引入了ReLU激活函数和Dropout正则化技术,并使用GPU加速训练。
-
VGGNet:通过增加网络的深度来提高性能的模型。VGGNet在卷积层中使用了多个小尺寸的卷积核,以增加感受野,提高特征提取能力。
-
GoogLeNet:采用Inception模块,减少参数数量的模型。Inception模块使用不同尺寸的卷积核进行特征提取,并通过1x1卷积核减少通道数,减少计算量。
-
ResNet:使用残差连接解决梯度消失问题的模型。ResNet引入了跳跃连接,使得网络可以学习残差,从而构建更深的网络。
-
DenseNet:通过密集连接提高信息传递的模型。DenseNet中每个层都与前面的所有层连接,使得信息可以自由传递,有效解决了梯度消失问题。
这些模型可以通过PyTorch的
torchvision.models
库访问,也可以通过TensorFlow的tf.keras.applications
进行访问,里面都有它们的预训练模型。
4. 图像分类案例
CIFAR-10是一个包含10个类别的图像分类数据集。我们将使用PyTorch框架来构建一个简单的卷积神经网络模型,对CIFAR-10数据集进行分类。
步骤1:准备数据集
在开始构建卷积神经网络之前,我们需要准备CIFAR-10数据集。首先,我们需要下载数据集并进行预处理。
首先,导入所需的库和模块:
import torch
import torchvision
import torchvision.transforms as transforms
然后,定义数据集的预处理操作:
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
这里使用了transforms.Compose
函数来将多个数据预处理操作组合起来。ToTensor()
将图像数据转换为Tensor对象,Normalize()
对图像进行标准化处理。
接下来,加载训练集和测试集,并进行预处理:
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
在上述代码中,我们使用torchvision.datasets.CIFAR10
类来加载CIFAR-10数据集,并指定了数据集的存储路径、是否下载、数据预处理等参数。然后,使用torch.utils.data.DataLoader
类来创建数据加载器,设置批量大小、是否打乱数据、使用的线程数量等参数。
最后,定义了10个类别的名称,用于在后续的分类结果中进行显示。
步骤2:构建卷积神经网络模型
我们将使用PyTorch框架
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
1. AI爱好者,爱搞事的 2. 想要掌握第二门语言的Javaer或者golanger 3. 决定考计算机领域研究生,给实验室搬砖的uu,强烈建议你花时间学完这个,后续搬砖比较猛 4. 任何对编程感兴趣的,且愿意掌握一门技能的人