Transformer实战-系列教程6:Vision Transformer 源码解读4

🚩🚩🚩Transformer实战-系列教程总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传

Vision Transformer 源码解读1
Vision Transformer 源码解读2
Vision Transformer 源码解读3
Vision Transformer 源码解读4

11、Encoder类------前向传播

class Encoder(nn.Module):def forward(self, hidden_states):# print(hidden_states.shape)attn_weights = []for layer_block in self.layer:hidden_states, weights = layer_block(hidden_states)if self.vis:attn_weights.append(weights)encoded = self.encoder_norm(hidden_states)return encoded, attn_weights

hidden_states.shape = torch.Size([16, 197, 768])
encoded.shape = torch.Size([16, 197, 768])

  1. attn_weights ,用于存储注意力权重
  2. 循环处理每一个Block层
  3. 将隐藏状态传递给当前的Block层,获取处理后的隐藏状态和注意力权重
  4. 将注意力权重添加到attn_weights列表中
  5. 将最后一层的输出通过LayerNorm层进行归一化处理
  6. 返回归一化后的输出和(如果有的话)注意力权重列表

这段代码实现了一个编码器,能够处理序列数据并可选择性地输出每层的注意力权重,通过层层叠加的Block和最终的归一化处理,它能够有效地学习输入数据的特征表示

12、Block类------前向传播

class Block(nn.Module):def forward(self, x):h = xx = self.attention_norm(x)x, weights = self.attn(x)x = x + hh = xx = self.ffn_norm(x)x = self.ffn(x)x = x + hreturn x, weights
  1. x.shape = torch.Size([16, 197, 768]),输入数据
  2. h=x
  3. self.attention_norm(x).shape = torch.Size([16, 197, 768]),x经过一个层归一化,层归一化直接在torch中的nn中调用
  4. (h+self.attn(x)).shape = torch.Size([16, 197, 768])经过一个self-Attention,再加上前面的x,加上x是一个残差连接
  5. self.ffn_norm(x).shape = torch.Size([16, 197, 768]),再经过一个层归一化
  6. self.ffn(x).shape = torch.Size([16, 197, 768]),经过一个MLP类
  7. (x + h).shape = torch.Size([16, 197, 768]),再来一个残差连接

13、MLP类------前向传播

class Mlp(nn.Module):def forward(self, x):x = self.fc1(x)x = self.act_fn(x)x = self.dropout(x)x = self.fc2(x)x = self.dropout(x)return x
  1. x.shape = torch.Size([16, 197, 768]),原始输入
  2. x.shape = torch.Size([16, 197, 3072]),经过第1层全连接
  3. x.shape = torch.Size([16, 197, 3072]),经过gelu经过函数
  4. x.shape = torch.Size([16, 197, 3072]),经过第1次dropout
  5. x.shape = torch.Size([16, 197, 768]),经过第2层全连接
  6. x.shape = torch.Size([16, 197, 768]),经过第2次dropout

14、Attention类------前向传播

最重要的Attention类

class Attention(nn.Module):def transpose_for_scores(self, x):new_x_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size)x = x.view(*new_x_shape)return x.permute(0, 2, 1, 3)def forward(self, hidden_states):mixed_query_layer = self.query(hidden_states)#Linear(in_features=768, out_features=768, bias=True)mixed_key_layer = self.key(hidden_states)mixed_value_layer = self.value(hidden_states)query_layer = self.transpose_for_scores(mixed_query_layer)key_layer = self.transpose_for_scores(mixed_key_layer)value_layer = self.transpose_for_scores(mixed_value_layer)attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2))attention_scores = attention_scores / math.sqrt(self.attention_head_size)attention_probs = self.softmax(attention_scores)weights = attention_probs if self.vis else Noneattention_probs = self.attn_dropout(attention_probs)context_layer = torch.matmul(attention_probs, value_layer)context_layer = context_layer.permute(0, 2, 1, 3).contiguous()new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size,)context_layer = context_layer.view(*new_context_layer_shape)attention_output = self.out(context_layer)attention_output = self.proj_dropout(attention_output)return attention_output, weights

14.1 transpose_for_scores函数

x------torch.Size([16, 197, 12, 64])
new_x_shape------torch.Size([16, 197, 12, 64])
x.permute(0, 2, 1, 3)------torch.Size([16, 12, 197, 64])
transpose_for_scores函数将输入张量的最后一个维度拆分为num_attention_heads(注意力头数)和attention_head_size(每个头的大小),然后将维度重新排列以满足矩阵乘法的需求

14.2 前向传播

  1. hidden_states,torch.Size([16, 197, 768]),原始输入
  2. mixed_query_layer,torch.Size([16, 197, 768]),经过一层全连接生成Q向量,维度不变
  3. mixed_key_layer,torch.Size([16, 197, 768]),经过一层全连接生成K向量,维度不变
  4. mixed_value_layer,torch.Size([16, 197, 768]),经过一层全连接生成V向量,维度不变
  5. query_layer ,torch.Size([16, 12, 197, 64]),多头注意力的拆分,拆分12头,每头64维向量
  6. key_layer,torch.Size([16, 12, 197, 64]),多头注意力的拆分,拆分12头,每头64维向量
  7. value_layer,torch.Size([16, 12, 197, 64]),多头注意力的拆分,拆分12头,每头64维向量
  8. attention_scores ,torch.Size([16, 12, 197, 197]),q和k的内积结果
  9. attention_scores ,torch.Size([16, 12, 197, 197]),将注意力得分除以注意力头的大小的平方根进行缩放,防止梯度过小
  10. attention_probs ,softmax归一化
  11. weights ,如果开启可视化则保留注意力权重,否则不保留
  12. attention_probs , 对注意力权重应用dropout
  13. context_layer ,torch.Size([16, 12, 197, 64]),注意力权重重构v向量
  14. context_layer ,torch.Size([16, 197, 12, 64]),重新排列维度
  15. new_context_layer_shape ,计算重塑后的上下文表示形状
  16. context_layer ,torch.Size([16, 197, 768]),重塑上下文表示的形状,合并所有注意力头的输出,将多头进行还原
  17. attention_output ,torch.Size([16, 197, 768]),使用另一个线性层处理上下文表示,生成最终的注意力模块输出
  18. attention_output ,torch.Size([16, 197, 768]),使用另一个线性层处理上下文表示,生成最终的注意力模块输出

最后回顾一下ViT的网络架构:
在这里插入图片描述

Vision Transformer 源码解读1
Vision Transformer 源码解读2
Vision Transformer 源码解读3
Vision Transformer 源码解读4

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为交换机配置Qos

QoS在企业网中的应用 在企业网络中,QoS的一系列技术不要求在同一台设备上应用,而应根据业务需要在不同位置应用。 图5 QoS技术在企业网络中的应用 理论上来说,各层次设备的功能如下: l 接入层业务识别 接入交换机LSW1作为边界…

Flume多进程传输

1.Flume介绍 Flume 是一种分布式、可靠且可用的服务,用于高效收集、聚合和移动大量日志数据。它具有基于流数据流的简单而灵活的架构。它具有鲁棒性和容错性,具有可调的可靠性机制和许多故障转移和恢复机制。它使用简单的可扩展数据模型,允许…

[鹤城杯 2021]easy_crypto

下载一看发现是核心价值观编码 核心价值观编码

安卓平台valgrind交叉编译

背景 通过上次的文章valgrind跨平台调试及其问题分析,为同事们在大部分平台下进行内存问题分析提供了帮助。但是也遇到了阻塞情况:android 平台,无法交叉编译通过。大家对于编译这件事,似乎天然有一种排斥,本能的拒绝&#xff0c…

8-树-二叉树的最大深度

这是树的第8篇算法,力扣链接。 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 这道题还是可以用层…

AIGC实战——归一化流模型(Normalizing Flow Model)

AIGC实战——归一化流模型 0. 前言1. 归一化流模型1.1 归一化流模型基本原理1.2 变量变换1.3 雅可比行列式1.4 变量变换方程 2. RealNVP2.1 Two Moons 数据集2.2 耦合层2.3 通过耦合层传递数据2.4 堆叠耦合层2.5 训练 RealNVP 模型 3. RealNVP 模型分析4. 其他归一化流模型4.1 …

PyTorch使用

前言 系统环境:win10 使用Anaconda,Anaconda的安装自行百度。 conda 23.7.4 目录 前言 创建虚拟环境 1、查看当前有哪些虚拟环境 2、创建虚拟环境pytorch 3、激活及关闭pytorch虚拟环境 4、删除pytorch虚拟环境 使用yolov5测试 1、切换至yolo…

MPLAB编译 dsPIC33FJ128GP710

安装IDE后需要安装Compile,不让会报错 Install MPLAB IDE https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide #2, Install Compiles 根据单片机选择不同的编译器 MPLABC30 v3.2

(4)【Python数据分析进阶】Machine-Learning模型与算法应用-回归、分类模型汇总

线性回归、逻辑回归算法应用请参考: https://codeknight.blog.csdn.net/article/details/135693621https://codeknight.blog.csdn.net/article/details/135693621本篇主要介绍决策树、随机森林、KNN、SVM、Bayes等有监督算法以及无监督的聚类算法和应用PCA对数据进行降维的算法…

Coreline Soft x Incredibuild

关于 Coreline Soft Coreline Soft 是一家专注于先进医疗人工智能成像软件技术的上市公司,致力于提高疾病诊断的准确性和效率。Coreline soft 成立于2012年,总部位于韩国首尔,目前 Coreline Soft 业务已向全球范围内扩展,在德国法…

关于服务器解析A记录和CNAME记录的分析

内容提要: 大致讲下理解,dns域名解析这一块 0 . 问题来源 最近搞了一个七牛云上传,然后需要配置融合cdn加速,也就是可以加速域名,中间有一部需要CNAME 域名,也就是将七牛云提供的域名CNAME一下,查阅资料其实就是起一个别名,好访问而已. 方便我们访问云存储,达到加速的效果. …

七个步骤教会你构建企业关键绩效指标体系

明确战略和目标 通常用平衡计分卡来建立关键绩效指标体系,完成各部门的关键绩效指标体系。有人力资源部牵头组织并汇总整理关键绩效指标,确定公司组织结构及部门职责、岗位职责,促进组织内上下级就设定指标的充分沟通。作为牵头组织者&#x…