当前位置: 首页 > news >正文

代码解析MixFormer: Mixing Features across Windows and Dimensions

1 前言

最近在阅读CVPR2022的论文MixFormer: Mixing Features across Windows and Dimensions。读完论文后我根据官方的paddlepaddle框架的实现写了pytorch版本的简易版的训练代码,尝试复现。

在这里尝试对MixFormer的代码的运行做一个简单的分析。

代码整理后将公布。
官方实现https://github.com/chensnathan/PaddleClas/blob/release/2.3/ppcls/arch/backbone/model_zoo/mixformer.py

2 总览

论文中MixFormer的整体框架如下图:

2.1 Convolution Stem

输入的图片Images(H,W,3)首先进入一个Convolution Stem得到指定维度C(即embed_dim)的词向量。

这个stage由几个级联的卷积层组成,如下图(省略了bn,激活层和norm):

ViT模型中最开始的卷积直接将一个patch的数据(p, p, channel)映射为embedding_dim维度的词向量(1,embedding_dim)。这个卷积的卷积核大小为(p,p),步长stride=p,通道数为embedding_dim

MixFormer这里的卷积操作,

patch_size = p = 4

首先用了三个3*3的卷积,第一个卷积将输入图像的尺寸下采样两倍(stride=p/2=2),通道数上升到embedding_dim/2。下图是示意图:

后续两个卷积保持尺寸不变,通道数不变。

最后一个卷积是一个(p/2,p/2)即2*2的卷积,将尺寸下采样2倍(stride==p/2=2),通道数上升到embedding_dim。每次卷积计算得到的结果是最后特征图的一个点。这个卷积和ViT的卷积操作是类似的,但是参数不一样。

2.2 BasicLayer

将级联的Mixing Blocks和Stride Conv可以看作一个BasicLayer(最后一个Stage没有下采样卷积)。

2.2.1 Mixing Block

  • 首先输入的词向量数据会经过一个norm层(LayerNorm);
  • 然后恢复为特征图形状,并且划分窗口。窗口的划分通过操控tensor的形状完成,如下:

输入是[B, H, W, C],接下来的变化如下

[B, H/w, w, W/w, w, C]  --> [B, H/w, W/w, w, w, C]  --->  [B*H/w*W/w, w, w, C]

  • 窗口划分后,将一个窗口的特征图展平得到对应的词向量形式,接着在单个窗口上进行自注意力机制计算。self-attention的计算的分析可以见b站霹导的博客(在此膜拜加感谢一波)详解Transformer中Self-Attention以及Multi-Head Attentionhttps://blog.csdn.net/qq_37541097/article/details/117691873

在self-attention的计算过程中会按照下图的设计穿插depth-wise conv的计算以及双向的信息流通。

图中的projection是一个1*1的conv

Mixing Attention的计算流程:

首先是LayerNorm,然后分为两个分支。

self-attention的计算分支中,先通过两个linear映射得到QKV。得到的V与另一个分支传过来的channel interaction相乘,相乘的结果与QK计算得到的自注意力权重相乘。

dw_conv的计算中使用一个linear映射,然后通过depth-wise conv计算,结果可用于产生channel interaction的信息,也会经过一个conv后与另一个分支传过来的spatial interaction的信息相乘,结果与self-attention的结果进行拼接运算。

我把以上文字流程画成了一个比论文图示更加详细的流程图:

  • 计算完成后,词向量转窗口,取消窗口划分。取消窗口划分的形状变化如下

输入是[B*H/w*W/w, w, w, C],接下来的变化

[B, H/w,W/w, w, w, C]  --->  [B, H/w, w, W/w, w, C]  --->  [B, H, W, C]  ---> [B, H * W, C]

  • 取消窗口后与最开始的输入连接(加法),完成一个残差连接。
  • 之后是带残差的FFN层,公式化表示:x = x + FFN(x)

2.2.2 Stride Conv

这个层在代码中出现在Basic Layer的downsample参数位置,实现为ConvMerging类。

该层负责将特征图的尺寸再次下采样2倍。使用一个kernel为2*2,stride为2的卷积实现。

尺寸计算: output = floor( ( h - 2 ) / 2 ) + 1 = floor( h/2 - 1) + 1 接近于  h/2

在实现时需要先将词向量的形状修改为特征图的形式,经过卷积计算后,再恢复到词向量的形式。

2.3 Projection Layer 和Classification Head

这两个层都使用Linear实现。Projection Layer将通道数继续升高,更大程度地保留通道维度的信息。Classification Head则将通道数映射到指定的类别数目。他们之间用自适应池化将尺寸降低到1。

相关文章:

  • 墨者-网络安全
  • Thread类的基本用法
  • Vue——方法与事件、 样式绑定、数据绑定、面试题、笔试题
  • DCDC Bootstrap自举电路
  • 练习前端案例
  • Completed 404 NOT_FOUND,Whitelabel Error Page
  • 微信公众号多题库查题系统
  • Vue事件
  • TCP/IP协议专栏——ARP详解——网络入门和工程维护必看
  • python 字符串类型
  • 【canvas】-- H5新增标签canvas的简单用法
  • C#实现根据字体名称获取字体文件名
  • Android开发-视图view讲解
  • Vue样式绑定
  • 机器学习分类
  • Docker: 容器互访的三种方式
  • es6要点
  • extract-text-webpack-plugin用法
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Rancher如何对接Ceph-RBD块存储
  • SAP云平台里Global Account和Sub Account的关系
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 技术发展面试
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 少走弯路,给Java 1~5 年程序员的建议
  • 什么软件可以剪辑音乐?
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 我看到的前端
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #stm32驱动外设模块总结w5500模块
  • (3)llvm ir转换过程
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)linux 命令大全
  • (转)Sql Server 保留几位小数的两种做法
  • (转)关于多人操作数据的处理策略
  • (转载)Linux 多线程条件变量同步
  • .gitignore文件—git忽略文件
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET企业级应用架构设计系列之技术选型
  • .NET序列化 serializable,反序列化
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • /usr/bin/env: node: No such file or directory
  • ?php echo ?,?php echo Hello world!;?
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [C++]运行时,如何确保一个对象是只读的
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出