NLP —— Transformer底层源码剖析(框架使用)

本篇是结合前面几篇把,Transformer 最终整个框架封装好直接拿来使用实例代码。

目录

[Transformer 原理](#Transformer 原理)

各个部分Transformer手写底层代码剖析

使用Transformer框架

1.定义Transformer类

(编码输入部分、解码输入部分、编码器、解码器、输出)

[2.Transformer对象 前向传播](#2.Transformer对象 前向传播)

(编码输入数据、解码输入数据、掩码)

[3. Transformer 实例对象使用](#3. Transformer 实例对象使用)

4.测试框架

5.打印Transformer框架信息


Transformer 原理

链接:https://blog.csdn.net/i_k_o_x_s/article/details/161060029

整体Transformer框架回顾

各个部分Transformer手写底层代码剖析

  1. Transformer 底层源码剖析(输入部分)

https://blog.csdn.net/i_k_o_x_s/article/details/161065795?spm=1001.2014.3001.5502

  1. Transformer底层代码剖析(通用部分)

https://blog.csdn.net/i_k_o_x_s/article/details/161096897?spm=1001.2014.3001.5502

  1. Transformer底层源码剖析(编码器部分)

https://blog.csdn.net/i_k_o_x_s/article/details/161173312?spm=1001.2014.3001.5502

4.Transformer底层源码剖析(解码器部分+输出)

https://blog.csdn.net/i_k_o_x_s/article/details/161176836?spm=1001.2014.3001.5502


使用Transformer框架

1.定义Transformer类
(编码输入部分、解码输入部分、编码器、解码器、输出)
2.Transformer对象 前向传播
(编码输入数据、解码输入数据、掩码)
python 复制代码
​
class SelfTransformer(nn.Module):
    def __init__(self, encoder_input, decoder_input, encoder, decoder:Encoder, output):
        super().__init__()

        self.encoder_input = encoder_input
        self.decoder_input = decoder_input
        self.encoder = encoder
        self.decoder = decoder
        self.output = output

    def forward(self, encoder_input_data, decoder_input_data, mask):
        # 1. 编码器 输入部分得到的数据
        en_embd_data = self.encoder_input(encoder_input_data)

        # 2. 编码器层得到的数据
        encoder_output = self.encoder(en_embd_data)

        # 3. 解码器 输入样本数据
        de_embd_data = self.decoder_input(decoder_input_data)

        # 4. 解码器的 N层 解码层处理
        decoder_data = self.decoder(data=de_embd_data, mask=mask, encoder_output=encoder_output)

        # 5. 输出部分
        return self.output(decoder_data)

​
3. Transformer 实例对象使用
python 复制代码
def get_self_transformer():
    # 设置常量
    d_model = 512
    dropout_p = 0.1
    en_vocab_size = 1000
    de_vocab_size = 4000
    en_max_len = 50
    de_max_len = 60
    num_heads = 8
    output_dim_size = 1024

    # ============== 编码器部分 ===============
    en_ebd = Embedding(vocab_size=en_vocab_size,d_model=d_model)
    en_pos = PositionalEncoding(d_model=d_model, dropout_p=dropout_p, max_len=en_max_len)
    en_multi_self_attn = MultiHeadAttention(d_model=d_model, num_heads=num_heads, dropout_p=dropout_p)
    en_ffn = FeedForward(d_model=d_model, output_dim=output_dim_size, dropout_p=dropout_p)

    #组装编码器
    encoder_layer = EncoderLayer(
        d_model=d_model,
        multi_head_self_attention=en_multi_self_attn,
        feed_forward_obj=en_ffn,
        dropout_p=dropout_p
    )

    #编码器
    encoder = Encoder(encoder_layer, N=6)

    # ============= 解码器部分 ================
    de_edb = Embedding(vocab_size=de_vocab_size,d_model=d_model)
    de_pos = PositionalEncoding(d_model=d_model, dropout_p=dropout_p, max_len=de_max_len)
    mask_multi_self_att = MultiHeadAttention(d_model=d_model, num_heads=num_heads, dropout_p=dropout_p)
    multi_att = MultiHeadAttention(d_model=d_model, num_heads=num_heads, dropout_p=dropout_p)
    de_ffn = FeedForward(d_model=d_model, output_dim=output_dim_size, dropout_p=dropout_p)

    # ============= 组装解码器 =================
    decoder_layer = DecoderLayer(
        d_model=d_model,
        mask_multi_self_atten_obj=mask_multi_self_att,
        multi_head_atten_obj=multi_att,
        feed_forward_obj=de_ffn,
    )

    decoder = Decoder(decoder_layer)

    # 输出层
    output = Output(d_model=d_model,vocab_size=de_vocab_size)


    # ============= 组装 Transformer 框架 ===================
    self_transformer = SelfTransformer(
        encoder_input=nn.Sequential(en_ebd, en_pos),
        encoder=encoder,
        decoder_input=nn.Sequential(de_edb, de_pos),
        decoder=decoder,
        output=output
    )

    print(f'架构结构信息:{self_transformer}')
    return self_transformer
4.测试框架
python 复制代码
def use_self_transformer():
    # 1. 拿到transformes乱讲
    self_transformer = get_self_transformer()

    # 2. 数据级 编码器端输入
    en_intput_data = torch.tensor([
        [1, 2, 3, 4],
        [5, 6, 7, 8]
    ])

    #3 # 数据集 解码器端 输入
    de_intput_data = torch.tensor(
        [[222, 2344, 456, 356],
        [2456, 131, 456, 67]]
    )

    # 4. 解码器的掩码
    """
        torch.triu(..., diagonal=0)
        triu = Upper Triangle 上三角
        保留对角线及以上的 1,对角线以下全部变成 0
    """
    mask = torch.triu(torch.ones([8, 4, 4]), diagonal=0)

    # 5. 调用框架
    result = self_transformer(
        en_intput_data,
        de_intput_data,
        mask
    )

    print(f"最终输出结果的张量形状:{result.shape}")
    print(f"最终输出结果的张量求和结果:{result.sum()}")

if __name__ == "__main__":
    use_self_transformer()
5.打印Transformer框架信息
相关推荐
空中湖10 分钟前
Spring AI Agent 编排:ReAct 模式 + 多 Agent 协作实战
人工智能·spring·react.js
only-qi11 分钟前
RAG 工作机制详解:构建高质量知识库的技术全流程
网络·人工智能·rag
John_ToDebug16 分钟前
Git Stash 完全指南:临时保存工作区的艺术
人工智能·git·agent
feibaoqq16 分钟前
Atlas边端板卡AI识别:部署方法、技术实现、优劣及应用场景
人工智能·低空经济·低空安防
小保CPP23 分钟前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
Xzaveir27 分钟前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
FII工业富联科技服务28 分钟前
从灯塔工厂到AI Factory新模式:AI正在重构制造业的四大核心能力
大数据·运维·人工智能·重构·ar·制造
前端开发江鸟29 分钟前
从一个最小 Runtime Demo 看懂:陌生的 599 为什么不能重试
人工智能
AI小白Lin30 分钟前
33 个 AI 专家全票通过?那问题才刚开始
人工智能·架构
Spey_Events32 分钟前
【核心议题发布】聚焦深度维修与 AI 智慧革新!2026中国民用航空维修智造展——议题重磅发布!
大数据·人工智能