ViT 学习笔记

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

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] Intel Pentium CPU计算加减乘除的指令周期,博客园,2014

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

[3] 测试运算所需时钟周期数,CSDN,2018

[4] 【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++中的一种嵌入式语言,用来帮助编写快速图像处理代码。通过分解算法和计划,可以更容易地试验不同的优化。我们可以保持算法不变,并使用不同的策略)。

posted on 2025-06-29 01:12  Mira_2019  阅读(12)  评论(0)    收藏  举报