对于输入(1,3,64,64)和使用 patch size 为 8 的设置,维度变化的步骤可以总结为以下过程:
-
图像块的提取:
- 使用 patch size 为 (8, 8) 将输入图像划分为图像块。
- 维度变为(1,64,3,8,8)。
-
展平成向量:
- 将每个图像块展平为长度为
8 * 8 * 3
的向量。 - 维度变为(1,64,192)。
- 将每个图像块展平为长度为
-
加入 Class Token 和 位置嵌入:
- 添加 Class Token,将维度变为(1,65,192)。
- 添加位置嵌入,最终维度仍为(1,65,192)。
-
线性投影:
- 使用线性投影将维度投影到 d_model=1024(可变)。
- 维度变为(1,65,1024)。
- transformer
-
多头自注意力机制(Multi-Head Self-Attention):
- 如果默认的头数是 h(通常为 12),并且头维度(head dim)是 d_h(通常为 64),则每个头产生的输出维度为(1,65,64)。
- 线性变换得到 Q, K, V:
- 对输入进行三个线性变换,得到Q,K,V,每个变换的权重矩阵维度为 (d_model,d_h*h)即(1024->12x64)。h为头的个数
- Q 的维度为 (1,65,d_h*h),K 的维度为 (1,65,d_h*h),V 的维度为 (1,65,d_h*h)。
- 这可以用矩阵相乘的方式实现:Q=X⋅Wq,K=X⋅Wk,V=X⋅Wv,其中 X 是输入张量。
-
拆分为多头:
- 将得到的 Q,K,V 分别拆分为 h 个头,每个头的维度为 (1,65,d_h)。
- 这里的拆分是在最后一维上进行的。
-
注意力计算:
- 对每个头进行注意力计算,得到注意力分数。
- 注意力计算包括对 Q 和 K 进行点积,然后进行缩放操作,最后应用 softmax 函数。
- 将注意力分数乘以 V,得到每个头的注意力输出(1,65,d_h)。
-
合并多头输出:
- 将每个头的注意力输出按最后一维度进行连接(concatenate),得到多头注意力的输出。
- 多头注意力的输出的维度为 (1,65,768)。这里768=h*d_h
- 映射为(1,65,1024)
- 加残差,维度不变(1,65,1024)
- LayerNormalization 和 Feedforward:
- 对于每个位置,进行 LayerNormalization 维度不变(1,65,1024)。
- Feedforward 网络:
- 如果默认的 Feedforward 网络的中间维度(通常为 3072)和输出维度(通常为 768):
- 输入维度:(1,65,1024)
- 变化为:(1,65,3072)
- 输出维度:(1,65,1024)
- 如果默认的 Feedforward 网络的中间维度(通常为 3072)和输出维度(通常为 768):
- 加残差,维度不变(1,65,1024)
-
- (1,65,1024)全局池化(1,1024)mlp输出1000类->(1,1000)
图: