卷积神经网络(CNN)简单介绍,给出实例并添加详细的注释

news/2025/1/7 21:54:45/

文章目录

    • 卷积神经网络(CNN)简单介绍
      • 概念
      • 基本结构
        • 卷积层
        • 池化层
        • 全连接层
      • 实现方式
      • 总结

卷积神经网络(CNN)简单介绍

卷积神经网络(Convolutional Neural Network,CNN)是一种广泛应用于图像识别、计算机视觉等领域的深度学习模型。它通过卷积、池化等操作,提取图像特征,实现对图像的高效分类。在本教程中,我们将介绍CNN的概念、基本结构和实现方式。

概念

CNN由多层卷积层、池化层、全连接层等组成,每个卷积层包含多个卷积核,用于对输入数据进行卷积操作,提取不同的特征。每个池化层则通过下采样的方式,将特征图尺寸缩小,减少数据维度,同时保留最显著的特征。全连接层则将池化层输出的特征向量映射到指定的类别数,完成图像分类任务。

基本结构

CNN的基本结构包括输入层、卷积层、池化层、全连接层和输出层,其中输入层和输出层分别用于输入和输出数据,卷积层和池化层用于提取特征,全连接层用于分类。

卷积层

卷积层通过对输入数据进行卷积操作,提取不同的特征。假设输入数据为 X X X,卷积核为 K K K,输出特征图为 Y Y Y,则卷积操作可以表示为:
Y i , j = ∑ m ∑ n X i + m , j + n K m , n Y_{i,j}=\sum_m\sum_nX_{i+m,j+n}K_{m,n} Yi,j=mnXi+m,j+nKm,n
其中, i , j i,j i,j为输出特征图中的位置, m , n m,n m,n为卷积核中的位置。卷积核通常是可学习的参数,可以根据数据特征进行优化。

池化层

池化层通过下采样的方式,将特征图尺寸缩小,减少数据维度,同时保留最显著的特征。常见的池化操作有最大池化和平均池化。最大池化的操作可以表示为:
Y i , j = max ⁡ m max ⁡ n X i + m , j + n Y_{i,j}=\max\limits_{m}\max\limits_{n}X_{i+m,j+n} Yi,j=mmaxnmaxXi+m,j+n
其中, i , j i,j i,j为输出特征图中的位置, m , n m,n m,n为池化核中的位置。

全连接层

全连接层将池化层输出的特征向量映射到指定的类别数,完成图像分类任务。假设池化层输出的特征向量为 X X X,全连接层的权重矩阵为 W W W,偏置向量为 b b b,则全连接层的计算可以表示为:
Y = W ⋅ X + b Y = W\cdot X+b Y=WX+b
其中, W W W是可学习的参数,可以通过反向传播算法进行优化, b b b是偏置项。

实现方式

在实现CNN时,常用的深度学习框架有TensorFlow、PyTorch等。以下是使用PyTorch实现简单的卷积神经网络的示例代码:

import torch.nn as nn
import torch.nn.functional as F# 定义一个神经网络类
class Net(nn.Module):def __init__(self):super(Net, self).__init__()# 定义卷积层self.conv1 = nn.Conv2d(1, 6, 5)   # 输入通道数1,输出通道数6,卷积核大小5*5self.conv2 = nn.Conv2d(6, 16, 5)  # 输入通道数6,输出通道数16,卷积核大小5*5# 定义池化层self.pool = nn.MaxPool2d(2, 2)   # 2*2的最大化池化# 定义全连接层self.fc1 = nn.Linear(16 * 4 * 4, 120)  # 输入大小为16*4*4,输出大小为120self.fc2 = nn.Linear(120, 84)         # 输入大小为120,输出大小为84self.fc3 = nn.Linear(84, 10)          # 输入大小为84,输出大小为10# 神经网络前向计算过程def forward(self, x):# 卷积层 -> ReLU -> 池化层x = self.pool(F.relu(self.conv1(x)))   # 卷积、ReLU、池化操作x = self.pool(F.relu(self.conv2(x)))   # 卷积、ReLU、池化操作# 展开特征向量x = x.view(-1, 16 * 4 * 4)             # 展平操作,将特征向量拉成一维# 全连接层 -> ReLUx = F.relu(self.fc1(x))                # 全连接、ReLU操作x = F.relu(self.fc2(x))                # 全连接、ReLU操作x = self.fc3(x)                        # 全连接操作return x

以上代码定义了一个包含两个卷积层、两个池化层、三个全连接层的卷积神经网络模型。在前向传播过程中,首先通过卷积层对输入数据进行特征提取,然后通过池化层将特征图尺寸缩小,最后通过全连接层完成图像分类任务。

在训练CNN模型时,通常使用随机梯度下降(Stochastic Gradient Descent,SGD)等优化算法进行权重更新,使用交叉熵(Cross Entropy)等损失函数进行模型评估。

使用上述神经网络类进行图像分类的例子如下:

#导入PyTorch相关模块
import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader#定义数据预处理方式
#将图片转换成Tensor格式,同时对图片进行标准化,均值0.5,方差0.5
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])# 创建一个用于训练的 MNIST 数据集
# 在执行此行代码时,数据集将自动下载到 './data' 文件夹中(如果尚未下载)
#加载MNIST数据集,train=True表示加载训练集,train=False表示加载测试集
#数据会被自动下载到"./data"文件夹中,同时经过transform的处理
trainset = datasets.MNIST('./data', download=True, train=True, transform=transform)
# 创建一个用于测试的 MNIST 数据集
# 此处 train 参数设置为 False,以表示是用于测试的数据集
# 同样也会自动下载
testset = datasets.MNIST('./data', download=True, train=False, transform=transform)#定义数据加载器,用于批量读取数据,batch_size表示每次读取的数量,shuffle=True表示每次读取时打乱顺序
trainloader = DataLoader(trainset, batch_size=64, shuffle=True)
testloader = DataLoader(testset, batch_size=64, shuffle=False)#创建神经网络实例
#--------------------这就是对上述神经网络的实例化------------------------------
net = Net()#定义损失函数和优化器
criterion = nn.CrossEntropyLoss() # 交叉熵损失函数
optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9) # 随机梯度下降优化器#训练神经网络
epochs = 5 # 训练轮数
for epoch in range(epochs):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data # 读取数据
optimizer.zero_grad() # 清空梯度
outputs = net(inputs) # 输入数据进行前向计算
loss = criterion(outputs, labels) # 计算损失
loss.backward() # 反向传播,计算梯度
optimizer.step() # 更新参数
running_loss += loss.item() # 计算当前损失
if i % 100 == 99: # 每100个batch输出一次训练状态
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 100))
running_loss = 0.0#测试神经网络
correct = 0
total = 0
with torch.no_grad(): # 不计算梯度,加速计算过程
for data in testloader:
images, labels = data # 读取数据
outputs = net(images) # 输入数据进行前向计算
_, predicted = torch.max(outputs.data, 1) # 找到概率最大的标签
total += labels.size(0) # 计算标签总数
correct += (predicted == labels).sum().item() # 计算分类正确的标签个数print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total)) # 输出准确率

总结

本教程介绍了卷积神经网络(CNN)的概念、基本结构和实现方式,希望能对深度学习初学者有所帮助。在实践中,可以根据具体任务和数据特征进行CNN模型的设计和优化,提高模型性能和效率。


http://www.ppmy.cn/news/50214.html

相关文章

【C/C++】MySQL 为什么选择 B+ 树作为底层数据结构

为什么MySQL底层数据结构选择B树?(而不是B树等其他数据结构) B树非叶子节点,不存放数据记录,仅存放指针与关键字,所以一个B树非叶子节点可以存放更多子节点信息,有利于降低树高度,从…

通信原理 数字基带信号之码间串扰

通信原理 数字基带信号之码间串扰目录 1.码间串扰 2.满足无码间串扰的条件 3.例题 1.码间串扰 2.满足无码间串扰的条件 nyquist带宽 Bfnw/2Π。 nyquist速率 RB2fn (最高码元传输速率)。 若RB满足等于nRB‘ n=1、2、3、4.....时 RB’为实际…

Three.js+TypeScript+Webpack学习记录(二)

使用环境参考 Node.js v16.19.1 正文 跟着文档画个线 看看 Three 的官方文档,起步 -> 画线 -> 没了?!! 不管怎么说,先画个线吧。 import * as THREE from threeconst scene new THREE.Scene() const camer…

用友nc6 如果用户长时间没有任何操作,如何设置会话的失效时间?

1.web应用(新开的) NC中间件环境下的web profile和NC中间件没有关系,NC中间件只不过是个J2EE运行环境,是个Container,当你的web项目启动后,NC中间件创建web容器,其web应用的会话超时时间由你的web部署描述符&#xff…

简单聊聊k8s,和docker之间的关系

前言 随着云原生和微服务架构的快速发展,Kubernetes和Docker已经成为了两个重要的技术。但是有小伙伴通常对这两个技术的关系产生疑惑: 既然有了docker,为什么又出来一个k8s? 它俩之间是竞品的关系吗? 傻傻分不清。…

程序员的二三事(五)

书接上回 社交技能和人际关系 虽然程序员的工作主要集中在电脑前,但在职场中,社交技能和人际关系同样重要。良好的人际关系有助于促进团队的合作和协作,提高工作效率和项目质量。 程序员应该学会与团队成员、上级、客户和其他部门建立良好的…

【软件工程】常见的软件开发模型

一.瀑布模型 瀑布模型将软件生命周期划分为: 指定计划——需求分析——软件设计——程序编写——软件测试——运行维护 适用场景: 一般适用于功能,性能明确,完整无重大变化的软件系统的开发 特点: (1) 阶段间具有顺序性和依赖…

条码控件Aspose.BarCode入门教程(8):C#从图像中读取条形码

Aspose.BarCode for .NET 是一个功能强大的API,可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能,以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理&am…