VisionTransformer(ViT)与CNN卷积神经网络的对比

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称项目名称
1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】
3.【手势识别系统开发】4.【人脸面部活体检测系统开发】
5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】
7.【YOLOv8多目标识别与自动标注软件开发】8.【基于YOLOv8深度学习的行人跌倒检测系统】
9.【基于YOLOv8深度学习的PCB板缺陷检测系统】10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统】
11.【基于YOLOv8深度学习的安全帽目标检测系统】12.【基于YOLOv8深度学习的120种犬类检测与识别系统】
13.【基于YOLOv8深度学习的路面坑洞检测系统】14.【基于YOLOv8深度学习的火焰烟雾检测系统】
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统】16.【基于YOLOv8深度学习的舰船目标分类检测系统】
17.【基于YOLOv8深度学习的西红柿成熟度检测系统】18.【基于YOLOv8深度学习的血细胞检测与计数系统】
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统】20.【基于YOLOv8深度学习的水稻害虫检测与识别系统】
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统】22.【基于YOLOv8深度学习的路面标志线检测与识别系统】
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统】24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统】
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统】26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统】
27.【基于YOLOv8深度学习的人脸面部表情识别系统】28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统】
29.【基于YOLOv8深度学习的智能肺炎诊断系统】30.【基于YOLOv8深度学习的葡萄簇目标检测系统】
31.【基于YOLOv8深度学习的100种中草药智能识别系统】32.【基于YOLOv8深度学习的102种花卉智能识别系统】
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统】34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统】
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统】36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统】
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统】38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统】
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统】40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统】
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统】42.【基于YOLOv8深度学习的无人机视角地面物体检测系统】
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统】44.【基于YOLOv8深度学习的野外火焰烟雾检测系统】
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统】46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统】
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统】48.【基于深度学习的车辆检测追踪与流量计数系统】
49.【基于深度学习的行人检测追踪与双向流量计数系统】50.【基于深度学习的反光衣检测与预警系统】
51.【基于深度学习的危险区域人员闯入检测与报警系统】52.【基于深度学习的高密度人脸智能检测与统计系统】
53.【基于深度学习的CT扫描图像肾结石智能检测系统】54.【基于深度学习的水果智能检测系统】
55.【基于深度学习的水果质量好坏智能检测系统】56.【基于深度学习的蔬菜目标检测与识别系统】
57.【基于深度学习的非机动车驾驶员头盔检测系统】58.【太基于深度学习的阳能电池板检测与分析系统】
59.【基于深度学习的工业螺栓螺母检测】60.【基于深度学习的金属焊缝缺陷检测系统】
61.【基于深度学习的链条缺陷检测与识别系统】62.【基于深度学习的交通信号灯检测识别】
63.【基于深度学习的草莓成熟度检测与识别系统】64.【基于深度学习的水下海生物检测识别系统】
65.【基于深度学习的道路交通事故检测识别系统】66.【基于深度学习的安检X光危险品检测与识别系统】
67.【基于深度学习的农作物类别检测与识别系统】68.【基于深度学习的危险驾驶行为检测识别系统】
69.【基于深度学习的维修工具检测识别系统】70.【基于深度学习的维修工具检测识别系统】
71.【基于深度学习的建筑墙面损伤检测系统】72.【基于深度学习的煤矿传送带异物检测系统】
73.【基于深度学习的老鼠智能检测系统】74.【基于深度学习的水面垃圾智能检测识别系统】
75.【基于深度学习的遥感视角船只智能检测系统】76.【基于深度学习的胃肠道息肉智能检测分割与诊断系统】
77.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统】78.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统】

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

目录

  • 视觉变换器与卷积神经网络
  • 引言
  • 示例:CNN与Vision Transformer
    • **CNN方法**
    • **VisionTransformer方法**
  • **结论**

视觉变换器与卷积神经网络

引言

Vision Transformer (ViT) 是一种将Transformer架构应用于计算机视觉任务的模型,最初由Google在2020年提出。不同于传统的卷积神经网络(CNNs),ViT完全依赖于自注意力机制来处理图像数据。具体来说,图像首先被分割成固定大小的块,每个块被视为一个“词”,然后通过线性嵌入映射到一个高维空间中,类似于自然语言处理中的词嵌入过程。这些嵌入向量随后被送入标准的Transformer编码器进行处理,以学习图像的表示。ViT展示了在大规模数据集上训练时,它能够取得与先进CNN模型相媲美的性能,同时减少了对归纳偏置(如局部性和翻译等变性)的依赖。这一方法为计算机视觉领域引入了新的研究方向,并促进了后续一系列基于Transformer的视觉模型的发展。

代码:https://github.com/RustamyF/vision-transformer

由于其计算效率和可扩展性,Transformer已成为NLP中的首选模型。在计算机视觉中,卷积神经网络(CNN)架构仍然占主导地位,但一些研究人员试图将CNN与自我注意力结合起来。作者尝试将标准的Transformer直接应用于图像,发现当在中等规模的数据集上训练时,与ResNet类架构相比,模型的准确性适中。然而,当在更大的数据集上训练时,Vision Transformer(ViT)取得了优异的成绩,在多个图像识别基准上接近或超过了最先进的水平。

在这里插入图片描述
图1(摘自原始论文)描述了一个模型,该模型通过将2D图像转换为扁平的2D补丁序列来处理2D图像。然后,补丁被映射到一个恒定的潜在向量大小与可训练的线性投影。一个可学习的嵌入被预先添加到补丁的序列中,并且其在Transformer编码器的输出处的状态用作图像表示。然后将图像表示通过分类头进行预训练或微调。添加位置嵌入以保留位置信息,并且嵌入向量的序列用作Transformer编码器的输入,该编码器由多头自注意和MLP块的交替层组成。

在过去,CNN长期以来一直是图像处理任务的首选。它们擅长通过卷积层捕获局部空间模式,从而实现分层特征提取。CNN擅长从大量图像数据中学习,并在图像分类、对象检测和分割等任务中取得了显着的成功。

虽然CNN在各种计算机视觉任务中有着良好的记录,并有效地处理大规模数据集,但Vision Transformers在全局依赖性和上下文理解至关重要的场景中具有优势。然而,Vision Transformers通常需要更大量的训练数据才能实现与CNN相当的性能。此外,由于其可并行化的性质,CNN在计算上是高效的,这使得它们对于实时和资源受限的应用更实用。

示例:CNN与Vision Transformer

在本节中,我们将使用CNN和vision Transformer方法,在Kaggle中提供的猫和狗数据集上训练视觉分类器。首先,我们将从Kaggle下载包含25000个RGB图像的猫和狗数据集。

from kaggle.api.kaggle_api_extended import KaggleApiapi = KaggleApi()
api.authenticate()# we write to the current directory with './'
api.dataset_download_files('karakaggle/kaggle-cat-vs-dog-dataset', path='./')

下载文件后,可以使用以下命令解压缩文件。

!unzip -qq kaggle-cat-vs-dog-dataset.zip
!rm -r kaggle-cat-vs-dog-dataset.zip

使用以下命令克隆vision-transformer GitHub存储库。这个存储库在vision_tr目录下包含了VisionTransformer所需的所有代码。

!git clone https://github.com/RustamyF/vision-transformer.git
!mv vision-transformer/vision_tr .

下载的数据需要清理和准备用于训练我们的图像分类器。创建以下实用程序函数以清理和加载Pytorch的DataLoader格式的数据。

import torch.nn as nn
import torch
import torch.optim as optimfrom torchvision import datasets, models, transforms
from torch.utils.data import DataLoader, Dataset
from PIL import Image
from sklearn.model_selection import train_test_splitimport osclass LoadData:def __init__(self):self.cat_path = 'kagglecatsanddogs_3367a/PetImages/Cat'self.dog_path = 'kagglecatsanddogs_3367a/PetImages/Dog'def delete_non_jpeg_files(self, directory):for filename in os.listdir(directory):if not filename.endswith('.jpg') and not filename.endswith('.jpeg'):file_path = os.path.join(directory, filename)try:if os.path.isfile(file_path) or os.path.islink(file_path):os.unlink(file_path)elif os.path.isdir(file_path):shutil.rmtree(file_path)print('deleted', file_path)except Exception as e:print('Failed to delete %s. Reason: %s' % (file_path, e))def data(self):self.delete_non_jpeg_files(self.dog_path)self.delete_non_jpeg_files(self.cat_path)dog_list = os.listdir(self.dog_path)dog_list = [(os.path.join(self.dog_path, i), 1) for i in dog_list]cat_list = os.listdir(self.cat_path)cat_list = [(os.path.join(self.cat_path, i), 0) for i in cat_list]total_list = cat_list + dog_listtrain_list, test_list = train_test_split(total_list, test_size=0.2)train_list, val_list = train_test_split(train_list, test_size=0.2)print('train list', len(train_list))print('test list', len(test_list))print('val list', len(val_list))return train_list, test_list, val_list# data Augumentation
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),
])class dataset(torch.utils.data.Dataset):def __init__(self, file_list, transform=None):self.file_list = file_listself.transform = transform# dataset lengthdef __len__(self):self.filelength = len(self.file_list)return self.filelength# load an one of imagesdef __getitem__(self, idx):img_path, label = self.file_list[idx]img = Image.open(img_path).convert('RGB')img_transformed = self.transform(img)return img_transformed, label

CNN方法

该图像分类器的CNN模型由三层2D卷积组成,内核大小为3,步幅为2,最大池化层为2。在卷积层之后,有两个完全连接的层,每个层由10个节点组成。下面是一个代码片段,说明了这个结构:

class Cnn(nn.Module):def __init__(self):super(Cnn, self).__init__()self.layer1 = nn.Sequential(nn.Conv2d(3, 16, kernel_size=3, padding=0, stride=2),nn.BatchNorm2d(16),nn.ReLU(),nn.MaxPool2d(2))self.layer2 = nn.Sequential(nn.Conv2d(16, 32, kernel_size=3, padding=0, stride=2),nn.BatchNorm2d(32),nn.ReLU(),nn.MaxPool2d(2))self.layer3 = nn.Sequential(nn.Conv2d(32, 64, kernel_size=3, padding=0, stride=2),nn.BatchNorm2d(64),nn.ReLU(),nn.MaxPool2d(2))self.fc1 = nn.Linear(3 * 3 * 64, 10)self.dropout = nn.Dropout(0.5)self.fc2 = nn.Linear(10, 2)self.relu = nn.ReLU()def forward(self, x):out = self.layer1(x)out = self.layer2(out)out = self.layer3(out)out = out.view(out.size(0), -1)out = self.relu(self.fc1(out))out = self.fc2(out)return out

训练进行了10个训练时期。以下是每个epoch的训练循环的结果。

img

VisionTransformer方法

Vision Transformer架构设计为可根据特定要求进行调整的自定义尺寸。对于这种大小的图像数据集,这种架构仍然很大。

from vision_tr.simple_vit import ViT
model = ViT(image_size=224,patch_size=32,num_classes=2,dim=128,depth=12,heads=8,mlp_dim=1024,dropout=0.1,emb_dropout=0.1,
).to(device)

VisionTransformer中的每个参数都起着关键作用,如下所述:

  • image_size=224:此参数指定模型输入图像的所需大小(宽度和高度)。在这种情况下,图像的大小预期为224x224像素。
  • patch_size=32:图像被分成更小的块,该参数定义每个块的大小(宽度和高度)。在这种情况下,每个补丁是32x32像素。
  • num_classes=2:该参数表示分类任务中的类的数量。在这个例子中,模型被设计为将输入分为两类(猫和狗)。
  • dim=128:指定模型中嵌入向量的维数。嵌入捕获每个图像块的表示。
  • depth=12:此参数定义Vision Transformer模型(编码器模型)中的深度或层数。更高的深度允许更复杂的特征提取。
  • heads=8:该参数表示模型的自注意机制中的注意头数。
  • mlp_dim=1024:指定模型中多层感知器(MLP)隐藏层的维度。MLP负责在自我注意之后转换令牌表示。
  • dropout=0.1:此参数控制dropout率,这是一种用于防止过拟合的正则化技术。它在训练过程中随机将一部分输入单位设置为0。
  • emb_dropout = 0.1:它定义了专门应用于令牌嵌入的丢弃率。这种dropout有助于防止在训练过程中过度依赖特定的token。

用于分类任务的VisionTransformer的训练进行了20个epoch(而不是CNN使用的10个epoch),因为训练损失的收敛速度很慢。以下是每个时期的训练循环结果。

img

CNN方法在10个时期内达到了75%的准确率,而视觉Transformer模型达到了69%的准确率,并且需要更长的时间来训练。

结论

总之,当比较CNN和Vision Transformer模型时,在模型大小、内存要求、准确性和性能方面存在显著差异。CNN模型传统上以其紧凑的尺寸和高效的内存利用率而闻名,使其适用于资源受限的环境。它们已被证明在图像处理任务中非常有效,并在各种计算机视觉应用中表现出出色的精度。另一方面,Vision Transformers提供了一种强大的方法来捕获图像中的全局依赖关系和上下文理解,从而提高了某些任务的性能。然而,与CNN相比,Vision Transformers往往具有更大的模型大小和更高的内存要求。虽然它们可以实现令人印象深刻的准确性,特别是在处理较大的数据集时,但计算需求可能会限制它们在资源有限的情况下的实用性。
最终,CNN和Vision Transformer模型之间的选择取决于手头任务的具体要求,考虑可用资源,数据集大小以及模型复杂性,准确性和性能之间的权衡等因素。随着计算机视觉领域的不断发展,预计这两种架构都会有进一步的进步,使研究人员和从业人员能够根据他们的特定需求和限制做出更明智的选择。


在这里插入图片描述

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java并发编程面试题:锁(17题)

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300的秘密武器

嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 企业级应用开发的需求日益增长。今天,我们要介绍的是一个在GitHub上广受好评的开源项目——Jeesite5。这不仅是一个技术框架,更…

Python OpenCV图像去模糊实战:离焦模糊的修复原理与Python实现

针对因焦距未调好导致的彩色图像模糊问题,结合OpenCV的锐化处理和色彩空间转换技术,推荐以下分步解决方案: 一、YUV色彩空间锐化(保留颜色信息) 原理: YUV色彩空间:YUV色彩空间将图像分为亮度(Y)和色度(U和V)分量。通过仅处理亮度通道(Y),可以有效避免对颜色信…

深度学习算法优化如何实现?

深度学习算法优化是一个复杂而多维的过程,旨在提高模型的性能、准确性和效率。以下是一些实现深度学习算法优化的关键步骤和方法: 一、数据预处理与增强 数据清洗:去除重复、错误或无效的数据,确保数据集的准确性和一致性。数据增…

Windows平台的小工具,功能实用!

今天给大家分享一款超实用的Windows平台监控工具,堪称“桌面小管家”,能帮你轻松掌握电脑的各种运行状态,比如网速、下载速度、内存和CPU占用率等常用参数,让你的电脑运行情况一目了然。 TrafficMonitor 网速监控悬浮窗软件 这款…

【JavaEE进阶】MyBatis通过XML实现增删改查

目录 🎍前言 🍀配置连接字符串和MyBatis 🍃写持久层代码 ​🚩添加mapper接口 🚩添加UserInfoMapper.xml 🚩单元测试 🌲查(Select) 🚩结果映射 🌴增(Insert&…

Cloud之快照存储(Cloud Snapshot Storage)

Cloud之快照存储 一、什么是快照 1. 快照的定义 快照(Snapshot)是一种记录某一时刻数据状态的技术。在计算机存储和虚拟化环境中,快照能够将文件系统或虚拟机的状态保存下来,以便以后能够回溯到某一特定时间点。快照通常用于备…

nlp|微调大语言模型初探索(2),训练自己的聊天机器人

前言 上篇文章记录了具体的微调语言大模型步骤,以及在微调过程中可能遇见的各种报错,美中不足的是只是基于开源数据集的微调,今天来记录一下怎么基于自己的数据集去微调大语言模型,训练自己的智能机器人!!&…

剑指 Offer II 025. 链表中的两数相加

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20025.%20%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E4%B8%A4%E6%95%B0%E7%9B%B8%E5%8A%A0/README.md 剑指 Offer II 025. 链表中的两数相加 题目描述 给定两个 非…

numpy(02 数据类型和数据类型转换)

numpy(01 入门) 目录 一、Python NumPy 数据类型 1.1 NumPy 基本类型 1.2 数据类型对象 (dtype) 1.3 具体实例 二、Numpy数据类型转换 2.1 浮点数据转换 2.2 整型数据转换 2.3 浮点数转整数 一、Python NumPy 数据类型 1.1 NumPy 基本类型 下表列举了常用 NumPy 基…

python: SQLAlchemy (ORM) Simple example using SQLite

领域层(Domain):定义了 School 实体类和 SchoolRepository 抽象基类,明确了业务实体和数据访问的契约。基础设施层(Infrastructure):通过 SQLAlchemy 实现了 SchoolRepository 类,负…

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 1

第01章_Linux下MySQL的安装与使用 首先在vmware中下载centos7,实际上8更好一点,不过centos已经是时代的眼泪了,我之前已经教过了,不过是忘了,所以重新说一遍,看文档即可 2.开机前修改mac地址 &#xff0…

谈谈 ES 6.8 到 7.10 的功能变迁(1)- 性能优化篇

前言 ES 7.10 可能是现在比较常见的 ES 版本。但是对于一些相迭代比较慢的早期业务系统来说,ES 6.8 是一个名副其实的“钉子户”。 借着工作内升级调研的任务东风,我整理从 ES 6.8 到 ES 7.10 ELastic 重点列出的新增功能和优化内容。将分为 6 个篇幅给…

Vue前端开发-Vant组件之Button组件

Vant 有丰富的UI组件,而基础组件是全部组件的核心,基础组件中将常用的元素做了二次的开发,封装成Vant格式组件,如按钮、图片和布局等,这些封装后的Vant组件,提供了更多面向实际应用的属性和事件&#xff0c…

《机器学习数学基础》补充资料:求解线性方程组的克拉默法则

《机器学习数学基础》中并没有将解线性方程组作为重点,只是在第2章2.4.2节做了比较完整的概述。这是因为,如果用程序求解线性方程组,相对于高等数学教材中强调的手工求解,要简单得多了。 本文是关于线性方程组的拓展,供…

力扣 买卖股票的最佳时机

贪心算法典型例题。 题目 做过股票交易的都知道,想获取最大利润,就得从最低点买入,最高点卖出。这题刚好可以用暴力,一个数组中找到最大的数跟最小的数,然后注意一下最小的数在最大的数前面即可。从一个数组中选两个数…

idea无法联网,离线安装插件

插件地址:https://plugins.jetbrains.com/ JetBrains Marketplace 如果无法进入,可以试试 配置hosts 3.163.125.103 plugins.jetbrains.com ip 变了,可以查询个最新的: https://tool.chinaz.com/speedtest/plugins.jetbrai…

【Spring详解一】Spring整体架构和环境搭建

一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构,包含一系列功能要素,被分为大约20个模块 Spring核心容器:包含Core、Bean、Context、Expression Language模块 Core :其他组件的基本核心&#xff…

Spring Boot 定时任务:轻松实现任务自动化

在现代应用开发中,定时任务是一个常见的需求。比如,我们可能需要定时清理过期数据、定时发送邮件通知等。 操作流程 开启定时任务注解 在启动类添加注解EnableScheduling 设置时间(固定时间间隔) 使用 Scheduled 注解创建定时…

DeepSeek R1生成图片总结2(虽然本身是不能直接生成图片,但是可以想办法利用别的工具一起实现)

DeepSeek官网 目前阶段,DeepSeek R1是不能直接生成图片的,但可以通过优化文本后转换为SVG或HTML代码,再保存为图片。另外,Janus-Pro是DeepSeek的多模态模型,支持文生图,但需要本地部署或者使用第三方工具。…