卷积神经网络(含案例代码)

news2024/12/23 19:28:43

概述

        卷积神经网络(Convolutional Neural Network,CNN)是一类专门用于处理具有网格结构数据的神经网络。它主要被设计用来识别和提取图像中的特征,但在许多其他领域也取得了成功,例如自然语言处理中的文本分类任务。

        CNN 的主要特点是它使用了卷积层(convolutional layer)来处理输入数据。卷积层通过卷积操作在输入数据上滑动一个或多个卷积核(也称为滤波器),从而学习局部特征。这种局部感知能力使得 CNN 能够有效地捕捉输入数据中的空间结构和模式。

基本组成部分

        卷积层(Convolutional Layer)

        由多个卷积核组成,每个卷积核用于检测输入数据中的特定特征。卷积操作通过在输入数据上滑动卷积核并计算局部区域的加权和来提取特征。

        池化层(Pooling Layer)

        用于减小数据的空间维度,降低计算复杂度,并且增强模型对平移变化的鲁棒性。最大池化是常用的池化操作,它选择输入区域中的最大值作为输出。

        激活函数(Activation Function)

通常在卷积层之后应用,引入非线性特性。常用的激活函数包括ReLU(Rectified Linear Unit)。

        全连接层(Fully Connected Layer)

        在卷积层和输出层之间,用于整合卷积层提取的特征并生成最终的输出。全连接层将前一层的所有节点与当前层的每个节点连接。

        CNN 在图像处理任务中表现出色,因为它能够学习到图像的局部和全局特征,具有平移不变性(通过共享权重)、参数共享和稀疏交互等特性。这些特性使得 CNN 在图像分类、目标检测、图像生成等任务中取得了显著的成功。

基本实现原理

        卷积神经网络(CNN)的实现原理涉及卷积层、池化层、激活函数、全连接层等关键组件。

输入层(Input Layer)

        接收原始输入数据,通常是图像或其他具有网格结构的数据。

卷积层(Convolutional Layer)

        使用卷积核(filter)对输入数据进行卷积操作,通过在输入数据上滑动卷积核,提取局部特征。卷积操作通过计算局部区域的加权和来生成输出特征图(feature map)。

激活函数(Activation Function)

        在卷积操作后,应用激活函数引入非线性,增加网络的表示能力。常用的激活函数包括ReLU(Rectified Linear Unit)。

池化层(Pooling Layer)

        对卷积层的输出进行下采样,减小空间维度,提高计算效率,并增强网络对平移变化的鲁棒性。最大池化是常用的池化操作,选择局部区域中的最大值作为输出。

全连接层(Fully Connected Layer)

        将池化层的输出扁平化,并通过全连接层连接到输出层。全连接层负责整合卷积层和池化层提取的特征,并生成最终的输出。

输出层(Output Layer)

        输出层根据任务的性质确定,可以是分类问题的softmax层,回归问题的线性层,或者其他适当的输出层结构。

        在训练过程中,通过反向传播算法更新网络参数,以最小化损失函数。这个过程包括前向传播(计算预测输出)、计算损失、反向传播(计算梯度),以及使用优化算法(如梯度下降)来更新权重。

        CNN 的关键之一是参数共享,即卷积核在整个输入上共享权重,这减少了参数数量,提高了模型的效率和泛化能力。此外,卷积操作和池化操作的重复使用使得网络能够逐渐构建出对输入数据的抽象表示。卷积神经网络通过多层次的特征提取和抽象,能够学习到输入数据的有用表示,从而在图像分类、目标检测等任务中表现出色。

案例代码

        下面是一个使用PyTorch的简单卷积神经网络(CNN)的代码案例。

        在这个例子中,使用PyTorch来构建一个简单的CNN模型,以进行图像分类。确保你已经安装了PyTorch:

pip install torch torchvision

        代码:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# 设置随机种子,以保证实验的可重复性
torch.manual_seed(42)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

# 定义CNN模型
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        self.relu1 = nn.ReLU()
        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.relu2 = nn.ReLU()
        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
        self.flatten = nn.Flatten()
        self.fc1 = nn.Linear(64 * 7 * 7, 128)
        self.relu3 = nn.ReLU()
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.pool1(self.relu1(self.conv1(x)))
        x = self.pool2(self.relu2(self.conv2(x)))
        x = self.flatten(x)
        x = self.relu3(self.fc1(x))
        x = self.fc2(x)
        return x

# 数据预处理和加载MNIST数据集
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)

train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

# 初始化模型、损失函数和优化器
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
num_epochs = 5
for epoch in range(num_epochs):
    for images, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

# 在测试集上评估模型
model.eval()
correct = 0
total = 0
with torch.no_grad():
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

accuracy = correct / total
print('Test Accuracy: {:.2%}'.format(accuracy))

        这个示例中,使用PyTorch构建了一个包含两个卷积层和两个全连接层的简单CNN模型,并在MNIST手写数字数据集上进行训练和测试。可以根据自己的需求修改模型架构、训练参数等。

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# 定义CNN模型
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        self.relu1 = nn.ReLU()
        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.relu2 = nn.ReLU()
        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
        self.flatten = nn.Flatten()
        self.fc1 = nn.Linear(64 * 7 * 7, 128)
        self.relu3 = nn.ReLU()
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.pool1(self.relu1(self.conv1(x)))
        x = self.pool2(self.relu2(self.conv2(x)))
        x = self.flatten(x)
        x = self.relu3(self.fc1(x))
        x = self.fc2(x)
        return x

# 数据预处理和加载MNIST数据集
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)

train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

# 初始化模型、损失函数和优化器
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
num_epochs = 5
for epoch in range(num_epochs):
    for images, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

# 保存模型
torch.save(model.state_dict(), 'simple_cnn_model.pth')
print("Model has been saved.")

# 加载模型
new_model = SimpleCNN()
new_model.load_state_dict(torch.load('simple_cnn_model.pth'))
new_model.eval()

# 在测试集上评估加载的模型
correct = 0
total = 0
with torch.no_grad():
    for images, labels in test_loader:
        outputs = new_model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

accuracy = correct / total
print('Test Accuracy of Loaded Model: {:.2%}'.format(accuracy))

        这个示例中,添加了模型的保存和加载过程。模型在训练完成后被保存到simple_cnn_model.pth文件,然后通过加载这个文件,可以重新创建模型并在测试集上进行评估。这对于在训练后的应用部署和模型共享上都是非常有用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1310842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

arthas一次操作实现递归分析下游方法的耗时

背景 使用arthas的trace分析方法的耗时时,我们一般只能分析下一层的方法的耗时,然后一层一层的递归进去找到耗时最长的那个方法,有没有一种方式可以一次trace分析就可以把所有要关注的下层所有的耗时都打印出来? 解决方式 使用…

苍穹外卖项目笔记(12)— 数据统计、Excel报表

前言 代码链接: Echo0701/take-out⁤ (github.com) 1 工作台 需求分析和设计 产品原型 工作台是系统运营的数据看板,并提供快捷操作入口,可以有效提高商家的工作效率 接口设计 ① 今日数据接口: ② 订单管理接口&#xff1…

TSINGSEE青犀基于EasyCVR与AI技术的高校实验室视频可视化监管方案

一、行业背景 实验室作为科研、教学过程中的一个重要场所,其管理也十分至关重要。尤其是高校实验室安全问题,教育部《高等学校实验室安全规范》中说明,需要进一步加强高校实验室的安全管理工作,实现规范化、常态化的管理体制&…

2019年第八届数学建模国际赛小美赛D题安全选举的答案是什么解题全过程文档及程序

2019年第八届数学建模国际赛小美赛 D题 安全选举的答案是什么 原题再现: 随着美国进入一场关键性的选举,在确保投票系统的完整性方面进展甚微。2016年总统大选期间,唐纳德特朗普因被指控受到外国干涉而入主白宫,这一问题再次成为…

跟着我学Python基础篇:08.集合和字典

往期文章 跟着我学Python基础篇:01.初露端倪 跟着我学Python基础篇:02.数字与字符串编程 跟着我学Python基础篇:03.选择结构 跟着我学Python基础篇:04.循环 跟着我学Python基础篇:05.函数 跟着我学Python基础篇&#…

HPM5300系列--第二篇 Visual Studio Code开发环境以及多种调试器调试模式

一、目的 在博文《HPM5300系列--第一篇 命令行开发调试环境搭建》、《HPM6750系列--第四篇 搭建Visual Studio Code开发调试环境》中我们介绍了命令行方式开发环境,也介绍了HPM6750evkmini开发板如何使用Visual Studio Code进行开发调试(其中调试方式使用…

了解一下DHCP

DHCP的工作原理 本质: 1、物理网卡自身集成了DHCP的功能,为了请求获取合法、可用的IP 2、DHCP服务端核心功能在于:通过自定义的网段的地址池,来给与新加入的网络环境的设备以租约的方式分配合法IP 1.什么是DHCP 1.1DHCP定义 …

【JUC】二十九、synchronized锁升级之轻量锁与重量锁

文章目录 1、轻量锁2、轻量锁的作用3、轻量锁的加锁和释放4、轻量级锁的代码演示5、重量级锁6、重量级锁的原理7、锁升级和hashcode的关系8、锁升级和hashcode关系的代码证明9、synchronized锁升级的总结10、JIT编译器对锁的优化:锁消除和锁粗化11、结语 &#x1f4…

Mac 如何删除文件及文件夹?可以尝试使用终端进行删除

MacOS 是 Mac 电脑采用的操作系统,你知道 Mac 如何删除文件吗?除了直接将文件或者文件夹拖入废纸篓之外,我们还可以采用终端命令的办法去删除文件,本文为大家总结了 Mac 删除文件方法。 为何使用命令行删除文件 在使用 Mac 电脑…

纯前端使用XLSX导出excel表格

1 单个sheet page.js(页面中的导出方法) import { exportExcel } from ../../../utils/exportExcel.js; leadOut() {const arr [{ id: 1, name: 张三, age: 14, sex: 男 },{ id: 2, name: 李四, age: 15, sex: 女 },{ id: 3, name: 王五, age: 16, sex: 男 },];const allR…

6.4.如何生成SDP

在我们前面的课程中呢,我已经向你介绍了很多sdp相关的内容,那今天呢,我们来看看如何生成sdp。 那我们的目标呢,当然就是生成这样一个文本,那这个文本呢,就是sdp文本那里边包括了各种各样的媒体信息&#…

GPIO模拟MDIO

背景 CPU:AST2500 驱动里实现GPIO模拟MDIO驱动,参考内核驱动mdio-bitbang.c和mdio-gpio.c,当前项目不支持设备树,驱动需要改成platform注册 MDIO介绍 SMI接口 SMI是MAC内核访问PHY寄存器接口,它由两根线组成,双工…

论文阅读《Parameterized Cost Volume for Stereo Matching》

论文地址:https://openaccess.thecvf.com/content/ICCV2023/papers/Zeng_Parameterized_Cost_Volume_for_Stereo_Matching_ICCV_2023_paper.pdf 源码地址:https://github.com/jiaxiZeng/Parameterized-Cost-Volume-for-Stereo-Matching 概述 现有的立体匹…

c# 字段和属性(get、set、init)

目录 基本概念: 个人理解: 访问器的默认写法: set与init无法共存: init: 必须在类的实例化时给字段赋值的情况(require属性): 基本概念: “字段”就是类内成员变量,一般为了隐藏数据&…

超详细教程:使用React实现动态轮播图

前言 轮播组件是常见的一种方式,用来展示图像、信息或者是广告。我们可以使用React来创建一个轮播组件,并且利用其中的State和effect Hook来创建一款动态的、可以自动播放的轮播组件。 效果 轮播组件会展示一个平铺的图片列表。在图片列表下方是一组小…

java定位系统源码,UWB技术的无线定位系统源码

UWB技术是一种传输速率高,发射功率较低,穿透能力较强并且是基于极窄脉冲的无线技术。UWB最优的应用环境是室内或者相对密闭的空间,有着厘米级的定位精度,不仅可以非常精准地进行位置跟踪,还可以快速地进行数据传输。 智…

基于亚马逊云科技新功能:Amazon SageMaker Canvas无代码机器学习—以构建货物的交付状态检测模型实战为例深度剖析以突显其特性

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道。 目录 🚀一. Amazon SageMaker 🔎1.1 新功能发布:A…

消息通知(Notification)/用户触达系统设计

近年来,通知功能已经成为许多应用程序中突出的特性。构建一个能每天发送数百万通知的可扩展系统绝非易事。这正是为什么我觉得有必要记录我在这方面踩坑之路。也叫用户触达系统。 完成这项任务要求对通知生态系统有深刻的理解,否则需求很容易变得模糊和…

系列十五、Redis面试题集锦

一、Redis面试题集锦 1.1、Redis到底是单线程还是多线程 Redis6.0版本之前的单线程指的是其网络IO和键值对读写是由一个线程完成的; Redis6.0引入的多线程指的是网络请求过程采用了多线程,而键值对读写命令仍然是单线程的,所以多线程环境下&…

MITO-ID®线粒体膜电位检测试剂盒

线粒体膜电位(Mitochondrial Membrane Potential,MMP)是判定细胞健康程度、线粒体膜通透性和细胞凋亡的一个重要指标,MMP的丧失通常与细胞凋亡的早期阶段有关。评估线粒体功能状态的基于细胞的检测方法正在成为阐明线粒体活动在药物诱导毒性、…