首页   >   新闻   >   文章

ViT 学习笔记
- 2025 -
06/28
20:50
零号员工
发表时间:2025.06.28     作者:Jingyi     来源:ShoelessCai     阅读:29

封面故事:6.1 那天,20 个小朋友玩耍,4 个在摆摊。这是他们出售的商品。Jingyi 拍摄

伙伴们好,这几个礼拜坚持写周报、跑会、写会议纪要、读书及读书笔记。

2025 年 6 月 21 日于华东师范大学数据科学与工程研究院研究生学术沙龙第 43 期,正好学习到计算机视觉领域的 Transformer,即 Vision Transformer,简称 ViT。

点击《华师大第 43 期研究生学术沙龙 》,获取更多信息。

01 一些简单的 numpy 函数

关于 TF 变量
import tensorflow as tf

tf.compat.v1.disable_eager_execution()
  # 每个 passage 之前都要用,处理 placeholder 传导的

a = tf.constant([1,3,4])
a = tf.cast( a, tf.float32 )
b = tf.exp(a)

with tf.compat.v1.Session() as sess:
    print( sess.run( b ) )

[ 2.7182817 20.085537 54.59815 ]

关于 np.repeat(), np.tile()
import numpy as np
import pandas as pd

a = np.repeat( np.arange(3), 2 )
b = np.tile( [0,0,0,1,1,1,2,2,2], 3 )
c = a.reshape(-1,1) # 变成 2d
d = c.reshape(-1,1)

d
array([[0],
        [0],
        [1],
        [1],
        [2],
        [2]])

关于 np.arange()
e = np.arange(95,99).reshape(2,2) #原始输入数组
e
array([[95, 96],
        [97, 98]])

关于 np.pad()
np.pad(e,((1,1),(1,1)),'constant',constant_values = (0,0))
# np.pad(obj, ((up, bottom),(left, right)), 'constant', constant_values=(0,0) )
array([[ 0, 0, 0, 0],
        [ 0, 95, 96, 0],
        [ 0, 97, 98, 0],
        [ 0, 0, 0, 0]])

这些函数主要为了看懂第四篇文献,暂时看懂程度一般。先放一放。

参考文献
[1] 秋风一片叶(2014),Intel Pentium CPU计算加减乘除的指令周期,博客园,2014

[2] Stack Overflow(2022),乘法和加法运算所需的时钟周期,腾讯云,2022

[3] 悟道修炼中(2018),测试运算所需时钟周期数,CSDN,2018

[4] 西西嘛哟(2020),【python实现卷积神经网络】卷积层Conv2D实现(带stride、padding),博客园,2020

02 关于手写 Conv2D

(1)如何手写 conv2D,从第一篇文献来看,是嵌入前传和和后传每一层网络。





(2)这篇是 知乎-pizh12thu 的文章,解释了卷积的原理,以及卷积消耗硬件计算资源的原因。



离散形式的卷积,计算如下。



(3)Halide 和 GEMM



左边是横向 concatenate,右边是纵向 concatenate,注意,不仅仅是卷积之后的元素是列向量优先,而且 RGB 三个矩阵也是纵向拼接。



举个例子,N 样本量,C 通道,H 高度,W 宽度。

NCHW 通道置于长宽之前,按矩阵,即矩阵 R、矩阵 G、矩阵 B。

NHWC 通道置于长宽之后,RGB、RGB、RGB ……



关于参考文献(1),主要讨论不干预情况下,每秒处理FLOP 随着矩阵维度增加的变化。以及若干种改进之后的情形。实验包括:

(a) reorder(ijk->ikj),
(b) tile-vec(SIMD),
(c) parallel(threading 将一个任务自分多线程),
(d) unroll(比如检查循环终止、更新循环计数器、指针算法等。相反,如果我们手工编写重复循环语句并展开循环,我们可以减少这种开销),
(e) halide(c++中的一种嵌入式语言,用来帮助编写快速图像处理代码。通过分解算法和计划,可以更容易地试验不同的优化。我们可以保持算法不变,并使用不同的策略)。



Btw,算法并不是所有都看懂。自己笔记如下。

(1)GEMM

GEMM 比较好理解,按照上述的方式任何卷积,都可以变成矩阵相乘。只要对 Filter 按行展开之后,行优先和列优先排列,这波操作称为“im2col”。GEMM 全称 Generalized Matrix Multiplication。

(2)Halide

Halide::Buffer C, A, B;
Halide::Var x, y;
C(x,y) += A(k, x) *= B(y, k);
(3)Tile

为了防止计算大矩阵时候内存产生“抖动”(频繁换入换出不同的矩阵内容),索性取矩阵的一小块,就像铺设瓦片一样。函数编写的时候,规定输出输入的位置(即长度),xo,yo,xi,yi。

(4)FMA

Fused Multiply-Add 融合乘加算法。即使用专用硬件计算乘法、加法。

(5)SIMD

Single Instruction Multiple Data 单指令多操作。相同 CPU 周期内,多个同时执行的操作。如果过同时运行 4 个数据点的 SIMD 指令,速度提升 4 倍。

(6)Threading

多内核,每个内核执行多个指令,一个程序把自己分成多个线程。相同工作负载,线程工作时间更少,与彼此同步时间更多。

(7)Unrolling

注意,4 个句子 2 个迭代,好于 1 个句子 8 迭代。然而,循环累积之后,代价都是巨大的。额外 2-3 条指令,都会使得成本很快增加。循环开销变得相对小,那么好处就开始减少。

接下来看一下 Attention 和 Convolution 的效果。

我一直理解成 Edge Detection,当然也可能讲 ML 的老师对很多算法的理解就是 Detection,例如,Edge Detection,Anomaly Detection,等等等。我拿 MNIST 卷了一层的效果。





这是文章中 Attention 的效果。很多文献介绍 Self-Attention,解释成记录全局变量信息。



最后,文献(7)亮点是提出了 Transformer 在 Computer Vision 的应用,同时行业的 state-of-the-art 是 CNN,程度无人能及。新的 Transformer(ViT)应用之后,发现效果还挺好的,特别针对中小图片,也就是平时最多的监控设备画面。以下是各种算法在各种数据集上的表现。其中,ViT-B 意为 ViT-Basic,ViT-L 意为 ViT-Large,ViT-H 意为 ViT-Huge。



关于通道数是这样的,在这篇文章《TensorFlow 实战 Google 深度学习框架(四)》,不难发现第一层通道数 32,第二层通道数 64,这是怎么产生的呢?经过找寻线上资料,不难发现,32 即第一层卷积神经网络有 32 个卷积核,而 64 则含义第二层神经网络有 64 个卷积核。

依据上述卷积核的输出,不难理解 Pooling 之后只捕捉到数字的“一部分”,32 个卷积核的含义,即从 32 个不同的部分捕捉手写数字的信息。那么第二层 64 即 64 个不同细节信息。

参考文献
[5] pizh12thu(2020),算法优化:卷积运算加速,知乎,2020

[6] AI 算法与图像处理(2019),解析卷积的高速计算中的细节,一步步代码带你飞,知乎,2019

[7] Alexey(2021), AN IMAGE IS WORTH 16x16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE, Google Research, 2021

[8] ML 小小白(2021), 关于卷积神经网络中的“输入通道”和“输出通道”的概念, CSDN, 2021

[9] Jingyi(2025),TensorFlow 实战 Google 深度学习框架(四) , ShoelessCai, 2025

[10] 全栈程序员站长(2022),tensorflow模型查看参数(pytorch conv2d函数详解), 腾讯云, 2022



原文链接

长按/扫码,有您的支持,我们会更加努力!







TOP 5 精选
回到顶部   回上一级
写文章

最新资讯




直播笔记


热点话题


精品论文


有你的鼓励
ShoelessCai 将更努力





文档免费。保护知识产权,保护创新。