qidao123.com技术社区-IT企服评测·应用市场

标题: 深入理解卷积神经网络:从根本原理到实战应用 [打印本页]

作者: 络腮胡菲菲    时间: 3 天前
标题: 深入理解卷积神经网络:从根本原理到实战应用
在人工智能范畴,卷积神经网络(Convolutional Neural Network,简称 CNN)依附其强大的图像辨认、处理能力,成为深度学习中不可或缺的技能。无论是自动驾驶汽车辨认门路标志,照旧医学影像分析辅助疾病诊断,CNN 都发挥着至关重要的作用。本文将深入分析卷积神经网络的根本原理、焦点组件,并通过实战案例带你把握其应用方法。
一、卷积神经网络的根本概念

卷积神经网络是一种专门为处理具有网格结构数据(如图像、音频)而计划的深度学习模子。传统的全连接神经网络在处理图像时,由于图像像素点数目庞大,会导致模子参数过多,轻易出现过拟合问题,同时盘算量也会急剧增加。而 CNN 通过引入卷积层、池化层等特殊结构,有效减少了模子参数数目,低沉盘算复杂度,同时还能自动提取图像的特征。
1.1 卷积神经网络的发展进程

CNN 的发展可以追溯到 20 世纪 80 年代,Yann LeCun 等人提出的 LeNet - 5 模子是 CNN 发展史上的重要里程碑,该模子成功应用于手写数字辨认,为后续 CNN 的发展奠基了根本。随着盘算能力的提升和数据量的增加,AlexNet 在 2012 年 ImageNet 大规模视觉辨认挑战赛(ILSVRC)中以巨大上风夺冠,引发了深度学习在盘算机视觉范畴的高潮。今后,VGGNet、ResNet、Inception 等一系列优秀的 CNN 模子不断涌现,推动着 CNN 技能的连续发展。
1.2 卷积神经网络的上风




二、卷积神经网络的焦点组件

2.1 卷积层(Convolutional Layer)

卷积层是 CNN 的焦点构成部门,其主要作用是通过卷积操作提取图像的特征。卷积操作是将一个可学习的卷积核(也称为滤波器)与输入数据举行滑动相乘并求和,得到卷积结果。
假设我们有一个 5×5 的输入图像和一个 3×3 的卷积核,卷积核在输入图像上按照肯定的步长(stride)滑动,每次滑动都会盘算卷积核与对应图像区域的乘积之和,天生输出特征图上的一个像素值。比方,当步长为 1 时,卷积核从图像左上角开始,依次向右、向下滑动,最终天生一个 3×3 的输出特征图。通过调解卷积核的数目、巨细、步长等参数,可以控制输出特征图的尺寸和提取到的特征范例。
2.2 池化层(Pooling Layer)

池化层的作用是对卷积层输出的特征图举行下采样,低沉数据维度,减少盘算量,同时还能在肯定程度上防止过拟合。常见的池化操作有最大池化(Max Pooling)和平均池化(Average Pooling)。
以最大池化为例,假设我们有一个 4×4 的输入特征图,使用 2×2 的池化窗口,步长为 2。在每个 2×2 的池化窗口内,取最大值作为输出特征图对应位置的像素值,最终得到一个 2×2 的输出特征图。最大池化能够保留每个池化窗口内的最强特征,而平均池化则是盘算池化窗口内像素值的平均值作为输出。
2.3 激活函数(Activation Function)

激活函数为神经网络引入非线性因素,使得网络能够学习和表示复杂的非线性关系。常见的激活函数有 ReLU(Rectified Linear Unit)、Sigmoid、Tanh 等。
ReLU 函数是现在 CNN 中使用最为广泛的激活函数,其数学表达式为\(f(x) = max(0, x)\)。ReLU 函数在正半轴上是线性的,盘算简单,能够有效缓解梯度消散问题,同时还能加快网络的训练速度。
2.4 全连接层(Fully Connected Layer)

全连接层将经过卷积层和池化层处理后的特征图展开成一维向量,然后通过一系列全连接神经元举行分类或回归任务。在网络的末了一层,全连接层的输出通常会经过一个 Softmax 激活函数(用于分类任务),将输出转换为各个类别的概率分布。
三、卷积神经网络实战:MNIST 手写数字辨认

接下来,我们使用 Python 和 PyTorch 框架实现一个简单的 CNN 模子,用于 MNIST 手写数字辨认任务。MNIST 数据集包罗 60000 张训练图像和 10000 张测试图像,每张图像都是一个 28×28 像素的手写数字,共 10 个类别(0 - 9)。
3.1 情况准备

起首,确保已经安装了 PyTorch 和相关的库。如果没有安装,可以使用以下命令举行安装:
  1. pip install torch torchvision
复制代码
3.2 数据加载

  1. import torch
  2. import torchvision
  3. import torchvision.transforms as transforms
  4. # 数据预处理
  5. transform = transforms.Compose(
  6. [transforms.ToTensor(),
  7. transforms.Normalize((0.5,), (0.5,))])
  8. # 加载训练集
  9. trainset = torchvision.datasets.MNIST(root='./data', train=True,
  10. download=True, transform=transform)
  11. trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
  12. shuffle=True, num_workers=2)
  13. # 加载测试集
  14. testset = torchvision.datasets.MNIST(root='./data', train=False,
  15. download=True, transform=transform)
  16. testloader = torch.utils.data.DataLoader(testset, batch_size=64,
  17. shuffle=False, num_workers=2)
复制代码
3.3 界说模子

  1. import torch.nn as nn
  2. import torch.nn.functional as F
  3. class Net(nn.Module):
  4. def __init__(self):
  5. super(Net, self).__init__()
  6. self.conv1 = nn.Conv2d(1, 6, 5)
  7. self.pool = nn.MaxPool2d(2, 2)
  8. self.conv2 = nn.Conv2d(6, 16, 5)
  9. self.fc1 = nn.Linear(16 * 4 * 4, 120)
  10. self.fc2 = nn.Linear(120, 84)
  11. self.fc3 = nn.Linear(84, 10)
  12. def forward(self, x):
  13. x = self.pool(F.relu(self.conv1(x)))
  14. x = self.pool(F.relu(self.conv2(x)))
  15. x = x.view(-1, 16 * 4 * 4)
  16. x = F.relu(self.fc1(x))
  17. x = F.relu(self.fc2(x))
  18. x = self.fc3(x)
  19. return x
  20. net = Net()
复制代码
3.4 界说损失函数和优化器

  1. import torch.optim as optim
  2. criterion = nn.CrossEntropyLoss()
  3. optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
复制代码
3.5 训练模子

  1. for epoch in range(10): # 训练10个epoch
  2. running_loss = 0.0
  3. for i, data in enumerate(trainloader, 0):
  4. inputs, labels = data
  5. optimizer.zero_grad()
  6. outputs = net(inputs)
  7. loss = criterion(outputs, labels)
  8. loss.backward()
  9. optimizer.step()
  10. running_loss += loss.item()
  11. if i % 200 == 199: # 每200个mini - batch打印一次损失
  12. print('[%d, %5d] loss: %.3f' %
  13. (epoch + 1, i + 1, running_loss / 200))
  14. running_loss = 0.0
  15. print('Finished Training')
复制代码
3.6 测试模子

  1. correct = 0
  2. total = 0
  3. with torch.no_grad():
  4. for data in testloader:
  5. images, labels = data
  6. outputs = net(images)
  7. _, predicted = torch.max(outputs.data, 1)
  8. total += labels.size(0)
  9. correct += (predicted == labels).sum().item()
  10. print('Accuracy of the network on the 10000 test images: %d %%' % (
  11. 100 * correct / total))
复制代码
通过上述代码,我们成功构建并训练了一个简单的 CNN 模子用于 MNIST 手写数字辨认,最终在测试集上可以获得较高的准确率。
四、卷积神经网络的应用扩展

卷积神经网络不仅在图像辨认范畴表现出色,在其他范畴也有广泛的应用:




五、总结与展望

本文详细介绍了卷积神经网络的根本原理、焦点组件,并通过 MNIST 手写数字辨认的实战案例,展示了如何使用 PyTorch 构建和训练 CNN 模子。卷积神经网络依附其独特的结构计划和强大的特征提取能力,在众多范畴取得了优秀的成绩。
随着技能的不断发展,未来 CNN 大概会在以下几个方面继续发展:



盼望通过本文的介绍,你对卷积神经网络有了更深入的理解和熟悉。如果你对 CNN 的某个方面感爱好,大概有任何疑问,接待在评论区留言讨论!
以上从原理到实践全面介绍了卷积神经网络。若你对代码细节、其他应用场景感爱好,或想了解更多深度学习知识,接待和我说说。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4