Day59:卷积神经网络详解与案例

alt

前面的章节中,我们介绍了深度神经网络的基本模型和优化算法,在本节中,我们将深入介绍卷积神经网络(Convolutional Neural Network,CNN)的原理和应用。

1. 卷积的基本概念

卷积是一种在图像处理和模式识别中常用的操作,它可以提取图像或其他数据的局部特征。卷积操作通过滑动一个小的窗口(卷积核)在输入数据上进行局部区域的计算,生成一个新的特征图。

在二维图像处理中,卷积操作可以用以下数学公式表示:

( I K ) ( x , y ) = Σ i Σ j I ( x + i , y + j ) K ˙ ( i , j ) (I * K)(x, y) = \Sigma_i\Sigma_j I(x +i, y + j)\dot K(i, j)

其中, I I 是输入图像, K K 是卷积核, ( x , y ) (x,y) 是输出图像中的位置, ( i , j ) (i,j) 是卷积核的索引。

3alt

卷积通过上图中卷积核在原图像上滑动的方式,计算出每个区域的值,其中卷积有几个重要参数:卷积核的大小(kernel),填充的区域(padding,默认无填充),卷积核滑动的步长(stride,默认步长为1)。

2. 卷积神经网络

卷积神经网络(CNN)是一种由多个卷积层、池化层和全连接层组成的层级结构。卷积层用于提取输入数据的特征图,池化层用于降低特征图的空间维度,减少参数数量,全连接层用于将特征映射转换为最终的输出。

其中卷积层要学习的参数就是卷积核中的参数,故卷积层有空间共享性:不同图像区域共享这个核的参数。池化层有最大池化和平均池化,即选取一个区域的最大值或者平均值作为代替这个区域的值,故池化层没有可学习参数。全连接层就是我们在前面讲到的具有可学习的矩阵和偏置。

4alt

典型的卷积神经网络结构包括输入层、卷积层、激活函数、池化层、全连接层和输出层。

5alt

###3. 经典CNN模型

  • LeNet-5:是最早的卷积神经网络模型,用于手写数字识别。它由卷积层、池化层和全连接层组成,是卷积神经网络在图像分类领域的开创性工作。

    6alt

  • AlexNet:是在ImageNet图像分类比赛中取得突破性成果的模型。它引入了ReLU激活函数和Dropout正则化技术,并使用GPU加速训练。

    7alt

  • VGGNet:通过增加网络的深度来提高性能的模型。VGGNet在卷积层中使用了多个小尺寸的卷积核,以增加感受野,提高特征提取能力。

    8alt

  • GoogLeNet:采用Inception模块,减少参数数量的模型。Inception模块使用不同尺寸的卷积核进行特征提取,并通过1x1卷积核减少通道数,减少计算量。

    9alt

  • ResNet:使用残差连接解决梯度消失问题的模型。ResNet引入了跳跃连接,使得网络可以学习残差,从而构建更深的网络。

    10alt

  • DenseNet:通过密集连接提高信息传递的模型。DenseNet中每个层都与前面的所有层连接,使得信息可以自由传递,有效解决了梯度消失问题。

    11alt

    这些模型可以通过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%内容,订阅专栏后可继续查看/也可单篇购买

大模型-AI小册 文章被收录于专栏

1. AI爱好者,爱搞事的 2. 想要掌握第二门语言的Javaer或者golanger 3. 决定考计算机领域研究生,给实验室搬砖的uu,强烈建议你花时间学完这个,后续搬砖比较猛 4. 任何对编程感兴趣的,且愿意掌握一门技能的人

全部评论
这就是神经网络吗
点赞 回复 分享
发布于 2023-07-14 15:22 上海

相关推荐

白火同学:大二有这水平很牛了,可以适当对关键信息加粗一点,比如关键技术、性能指标之类的。
点赞 评论 收藏
分享
nus22016021404:兄弟,你这个简历撕了丢了吧,就是一坨,去找几个项目,理解项目流程,看几遍就是你的了,看看八股就去干了,多看看牛客里别人发出来的简历,对着写,你这写的啥啊,纯一坨
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务