• 手把手教你语音识别(四)


    朋友们,今天继续讲解语音识别,前面讲到了进入模型的初步操作,这个模型的层数是非常多的,后面还要经过非常多的层,可以说是一个deep+deep 网络,所以,咱们今天继续跟着网络层forward!

    1、网络展示

    (self_attn): RelPositionMultiHeadedAttention(
     (linear_q): Linear(in_features=512, out_features=512, dtype=float32)
     (linear_k): Linear(in_features=512, out_features=512, dtype=float32)
     (linear_v): Linear(in_features=512, out_features=512, dtype=float32)
     (linear_out): Linear(in_features=512, out_features=512, dtype=float32)
     (dropout): Dropout(p=0.0, axis=None, mode=upscale_in_train)
      (linear_pos): Linear(in_features=512, out_features=512, dtype=float32)
     )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如上,之前我讲到数据经过层Conv2dSubsampling4后,shape变成了(1,90,512),然后,这个维度的数据还得继续往下forward,接下来的层变成了上面的名字:RelPositionMultiHeadedAttention,这一层也就是多头注意力机制,下面咱们往下forward。

    2、网络提取

    网络展示的是上面的结构,但是构建这个结构是非常复杂的,需要一点点构建,本次构建attention就不详细讲了,后文中咱们再讲,本次还是从架构和总体层面forward。

    import pickle
    with open("cls.pkl", "rb") as tf:    
        cls = pickle.load(tf)
    
    • 1
    • 2
    • 3
    import pickle
    with open("configs.pkl", "rb") as tf:
        configs = pickle.load(tf)
    
    • 1
    • 2
    • 3
    model0 = cls(configs)
    model_attn=model0.sublayers()[0].sublayers()[11][0].sublayers()[0]
    
    • 1
    • 2

    在这里插入图片描述

    可以看到,之前我们加载的模型,通过层层去找,就可以找到我们现在需要forward的模型,那么,这个模型我需要把数据怼进去,下面咱们先用随机数据试试。

    3、forwad

    前面咱们经过了网络Conv2dSubsampling4,下面是输出的结果。

    在这里插入图片描述

    然后,模型要看怎么输入,下面是输入参数,很明显,需要query、key、value、pos-embed和mask参数,那咱们用x输入,然后随机初始化一些数值输入试试。

    在这里插入图片描述

    model_attn(x,x,x,x,paddle.randn([1,1,90]))
    
    • 1

    在这里插入图片描述

    好了,我们假设了一些数据,然后怼入网络层,实现了上面的效果,相当于又走了一层,但是这样很难看出细节,下面咱们通过pycharm进行debug再看看。

    4、debug

    在这里插入图片描述

    在这里插入图片描述

    前面的代码可以看到,通过一个for循环挨个forward每一层的layer,咱们目前进入的是ConformerEncoderLayer,然后这里面包括很多,我们只要RelPositionMultiHeadedAttention这一个,下面继续走。

    在这里插入图片描述

    这一层的输入参数可以看到,可以认为是三个x+pos-emb+mask,至于pos-emb之前文章讲过了,mask先不讲,咱们看后面的。

    在这里插入图片描述

    到了forward里面,又来了一个qkv,下面继续走。
    在这里插入图片描述

    这里就简单了,实际上是计算q、k和v三个值,函数是一样的,咱们只进入第一个看看。

    在这里插入图片描述

    linear层,实际上就是一个矩阵计算,这部分就是一个算子,算子基本上都是cpp实现的,就不详细讲了,想了解的请看:

    https://code.ihub.org.cn/projects/680/repository/revisions/develop/entry/paddle/fluid/operators/matmul_v2_op.cc

    在这里插入图片描述

    完成这一步,后面都是常规操作,计算scores,这个自己看。

    在这里插入图片描述

    socres完成后,其实就是计算相关性了,如上代码,到了这里其实这一层的forward就完成了,后面其实还有concate等,就不讲了。

  • 相关阅读:
    磁盘误删除怎么恢复呢?教你恢复它
    为什么mac上有的软件删除不掉?
    WebGPU 入门:绘制一个三角形
    create® 3入门教程-里程计
    【图像去噪】基于matlab双立方插值和稀疏表示图像去噪【含Matlab源码 2009期】
    基于单片机的四层电梯仿真设计(#0012)
    深入探索Docker数据卷:实现容器持久化存储的完美方案(上)
    【LLM】金融大模型场景和大模型Lora微调实战
    【ENOVIA 服务包】知识重用解决方案 | 达索系统百世慧®
    技术分享 | 开发板网口热插拔自动获取IP地址
  • 原文地址:https://blog.csdn.net/qq_23953717/article/details/126103867