Vision Transfomer系列第二节---Tricks测试

news2024/11/18 0:42:47

目录

  • 学习式和固定式位置编码测试
  • dropout的作用测试
  • block深度的作用测试
  • embeding维度大小的作用测试
  • 多头的作用测试
  • Overlap Patch的作用

学习式和固定式位置编码测试

主要测试无位置编码\可学习位置编码和固定式位置编码的训练效果:
其中固定式位置编码采用之前博客的正余弦位置编码
无位置编码:

# input = input + self.pos_embed.to(input)

train: epoch=30, loss=0.523701012134552

可学习位置编码:

self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + 1, embed_dim))

train: epoch=31, loss=0.4830354154109955

固定式位置编码:

self.pos_embed = posemb_sincos_1d(len=num_patches + 1, dim=embed_dim,temperature=1000).unsqueeze(0)

train: epoch=30, loss=0.5667092204093933

目测位置编码好像没什么大作用???谁呢解释下

dropout的作用测试

这里主要测试attension矩阵后的dropout层.
该dropout层可以使得attension矩阵行方向随机赋0,其他除以drop概率,可以用于缓解 Vision Transformer 中的过拟合问题.

下面测试下dropout=0/0.25/0.5/0.75的训练效果.
dropout=0:

train: epoch=45, loss=0.3784039616584778
val: epoch=45, loss=0.24934779107570648, accuracy=0.9

dropout=0.25:

train: epoch=45, loss=0.38590484857559204
val: epoch=45, loss=0.24613243341445923, accuracy=0.906

dropout=0.5:

train: epoch=45, loss=0.48613107204437256
val: epoch=45, loss=0.30928316712379456, accuracy=0.876

dropout=0.75:

train: epoch=45, loss=0.4950393736362457
val: epoch=45, loss=0.36618882417678833, accuracy=0.852

初步来看一定程度地dropout有利于模型收敛,但是过大就会使得其反,因此我后面开始取p=0.1

block深度的作用测试

block作为transfomer类模型的核心组件,block的重复次数是一个超参数,直接影响到模型的深度和表达能力.
下面测试下depth分别为1/3/6/12/24的训练效果.
为了对比方便,下面我都用tensorboard可视化,为了训练快一点batch为8.
depth=1:
在这里插入图片描述
depth=3:
在这里插入图片描述
depth=6:

在这里插入图片描述
depth=12:
在这里插入图片描述

实验可知:block的重复次数过低会导致模型的表达能力不够;
过高会导致训练很慢,和过拟合(验证损失更早地上升),而且当表达能力足够后准确率并不会上升太多.因此后面开始我取depth=6

embeding维度大小的作用测试

在VIT中embeding维度可以理解为每一个图像块的编码维度
embeding维度大小和block的重复次数类似,可以直接影响到模型的表达能力.
下面测试下embeding dim分别为12/48/192/768的训练效果.
embeding dim=12:
在这里插入图片描述

embeding dim=48:
在这里插入图片描述

embeding dim=192:
在这里插入图片描述

embeding dim=768:

实验可知:embeding dim过小会导致模型的表达能力不够,具体表现为训练集损失下不去;
过大会导致训练很慢,而且当表达能力足够后准确率并不会上升太多.考虑到速度,因此后面开始我取embeding dim=192.

多头的作用测试

Multi-Head Attention的原理是通过将模型分为多个头,形成多个子空间,让模型关注不同方面的信息。每个头独立进行注意力运算,得到一个注意力权重矩阵。注意力矩阵完成不同块之间的交互,然后每个头之间通过cat和全连接进行交互.
下面测试下head_num分别为1/4/12/36的训练效果.

head_num=1
在这里插入图片描述

head_num=4
在这里插入图片描述

head_num=12
在这里插入图片描述
head_num=36
在这里插入图片描述

实验可知,适当的head_num可以提高模型的拟合能力,但是不是越多越好,需要根据任务的复杂情况和embeding维度去调整.本处实验其实效果不明显,可能是任务过于简单的原因.
在后面,我将会令head_num为4

Overlap Patch的作用

Overlap Patch指的是在切分图像为小块时,允许相邻的小块之间有重叠。这种重叠可以提高图像块之间的信息交互,可能会影响模型的性能和效果。这种trick在很多transfomer网络如EfficientViT,SwimTransfomer中都有应用.
非Overlap Patch:
卷积核大小是16,stride取16,padding取0,输入为224x224时,输出为14x14
在这里插入图片描述
Overlap Patch:
卷积核大小是20,stride取16,padding取2,输入为224x224时,输出也为14x14,但是相邻图像块之间有2圈像素的交集.
在这里插入图片描述
本处实验其实效果不明显

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

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

相关文章

动态规划算法学习(基础)

做题步骤: 确定dp数组的含义(一维或者二维) 获取递推公式 dp数组如何初始化 确定遍历顺序 打印dp数组(检查) 题目: 1. 斐波那契数 509 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 …

【C++】类和对象---友元,内部类,匿名对象详解

目录 友元 友元函数 友元类 内部类 匿名对象 ⭐友元 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。 友元分为:友元函数和友元类。 ⚡友元函数 先看一个问题&#x…

React18源码: Fiber树中的全局状态与双缓冲

Fiber树构造 在React运行时中,fiber树构造位于 react-reconciler 包在正式解读 fiber 树构造之前,再次回顾一下renconciler的4个阶段 1.输入阶段:衔接react-dom包,承接fiber更新请求2.注册调度任务:与调度中心(schedu…

Nginx网络服务四-----日志、Nginx压缩和ssl

1.自定义访问日志 如果访问出错---404,可以去看error.log日志信息 访问日志是记录客户端即用户的具体请求内容信息,而在全局配置模块中的error_log是记录nginx服务器运行时的日志保存路径和记录日志的level,因此两者是不同的,而且…

机器视觉【3】非线性求解相机几何参数

线性求解相机几何参数的缺点 上一章节介绍学习了(DLT)线性求解相机几何参数,了解到线性求解法当中比较明显的缺点: 没有考虑到镜头畸变的影响不能引入更多的约束条件融入到DLT算法当中优化最关键的是,代数距离并不是…

Python入门学习——基础语法

一、Python解释器 1. Python解释器的作用是&#xff1a; 将Python代码翻译成计算机认识的O和1并提交计算机执行在解释器环境内可以一行行的执行我们输入的代码也可以使用解释器程序&#xff0c;去执行".py"代码文件 2. Python解释器程序在&#xff1a; <Python…

Jenkins详解

目录 一、Jenkins CI/CD 1、 Jenkins CI/CD 流程图 2、介绍 Jenkins 1、Jenkins概念 2、Jenkins目的 3、特性 4、产品发布流程 3、安装Jenkins 1、安装JDK 2、安装tomcat 3.安装maven 4安装jenkins 5.启动tomcat&#xff0c;并页面访问 5.添加节点 一、Jenkins CI/…

【Docker】免费使用的腾讯云容器镜像服务

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 1、设置密码 2、登录实例&#xff08;sudo docker login xxxxxx&#xff09; 3、新建命名空间&#xff08;每个命名空…

【Delphi 基础知识 35】MainMenu控件的详细使用

把TmenuMain放在Form后&#xff0c;右击控件就可以对菜单进行设计 菜单中添加分割线只需加“-”就可以添加一个分割线 级联菜单的设计 单击鼠标右键弹出菜单中选择Create Submenu菜单项 单选功能设计 要在设计的菜单项目中选择RadioItem属性为True&#xff0c;Checked属性…

使用logicflow流程图实例

一.背景 需要使用流程引擎开发项目&#xff0c;没有使用flowable、activiti这类的国外流程引擎&#xff0c;想使用国内的引擎二次开发&#xff0c;缺少单例模式的流程画图程序&#xff0c;都是vue、react、angluer的不适合&#xff0c;从网上找了antx6、logicflow、bpmn.js。感…

了解人工智能计算: 人工智能入门

回顾历史&#xff0c;各种数学仪器在人类进步的历程中发挥了重要作用。从算盘和六分仪到滑尺和计算机&#xff0c;这些工具推动贸易、助力航海&#xff0c;增强理解&#xff0c;并提高了我们的生活质量。然而&#xff0c;在科学和工业领域&#xff0c;推动我们前进的前沿且强大…

Redis 工具类 与 Redis 布隆过滤器

Redis 工具类 1. 核心依赖 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.google.guava…

网卡本质,网络发展(局域网,广域网概念)

目录 引入 网卡的本质 网络的发展 引入 早期 局域网LAN&#xff08;Local Area Network&#xff09; 广域网WAN&#xff08;Wide Area Network&#xff09; 注意 引入 前面我们已经学习了很多关于linux系统的知识,其中文件系统和线程尤为繁杂 而网络其实也算系统的一部…

Vue监听器(上)之组合式watch

1. 定义监听器 //要监视的属性被改变时触发 watch(要监视的属性, (更改后的心值, 更改前的旧值) > {具体操作}, );//监视对象为getter的时候 //表达式内任意响应式属性被改变时触发 watch(() > return表达式, (表达式的新值, 表达式的旧值) > {具体操作} );//数组中任…

如何实现一个规则研究区域内数据的提取(matlab)

在利用经验正交分解&#xff08;EOF&#xff09;进行某一个研究区域分析时&#xff0c;我们需要将研究区域转换成N*M的矩阵&#xff0c;其中N为空间维度&#xff0c;M为时间维度&#xff0c;这意味着我们之前的数据加上时间维度是三维的&#xff0c;即&#xff08;lon,lat,rg&a…

【深入理解设计模式】原型设计模式

原型设计模式 原型设计模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许通过复制已有对象来创建新对象&#xff0c;而无需直接依赖它们的具体类。这种模式通常用于需要频繁创建相似对象的场景&#xff0c;以避免昂贵的创建操作或初始化过…

泛微e-office系统敏感信息泄露漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 1、系统简介 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软…

C++之类作用域

目录 1、全局作用域 2、类作用域 2.1、设计模式之Pimpl 2.2、单例模式的自动释放 2.2.0、检测内存泄漏的工具valgrind 2.2.1、可以使用友元形式进行设计 2.2.2、内部类加静态数据成员形式 2.2.3、atexit方式进行 2.2.4、pthread_once形式 作用域可以分为类作用域、类名…

【MIT-PHP-推荐】imi-ai 是一个 ChatGPT 开源项目

mi-ai 是一个 ChatGPT 开源项目&#xff0c;支持聊天、问答、写代码、写文章、做作业等功能。 项目架构合理&#xff0c;代码编写优雅&#xff0c;简单快速部署。前后端代码完全开源&#xff0c;不管是学习自用还是商用二开都很适合。 本项目现已支持 ChatGPT 聊天 AI 和 Emb…

PyTorch概述(五)---LINEAR

torch.nn.Linear torch.nn.Linear(in_features,out_features,biasTrue,deviceNone,dtypeNone) 对输入的数据应用一个线性变换&#xff1a; 该模块支持TensorFLoat32类型的数据&#xff1b;在某些ROCm设备上&#xff0c;使用float16类型的数据输入时&#xff0c;该模块在反向传…