Paraformer解读(1)基于self-attention和dfsmn的encoder

DFSMN

dfsmn

SAN-M

san-m

python实现

import torch
import torch.nn as nn
import torch.nn.functional as F

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, dropout=0.1, max_len=5000):
        super(PositionalEncoding, self).__init__()
        self.dropout = nn.Dropout(p=dropout)

        position = torch.arange(max_len).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, d_model, 2) * -(torch.log(torch.tensor(10000.0)) / d_model))
        pe = torch.zeros(max_len, 1, d_model)
        pe[:, 0, 0::2] = torch.sin(position * div_term)
        pe[:, 0, 1::2] = torch.cos(position * div_term)
        self.register_buffer('pe', pe)

    def forward(self, x):
        x = x + self.pe[:x.size(0)]
        return self.dropout(x)

class SelfAttention(nn.Module):
    def __init__(self, in_features, out_features, dropout=0.1):
        super(SelfAttention, self).__init__()
        self.in_features = in_features
        self.out_features = out_features
        self.w_qs = nn.Linear(in_features, out_features, bias=False)
        self.w_ks = nn.Linear(in_features, out_features, bias=False)
        self.w_vs = nn.Linear(in_features, out_features, bias=False)
        self.fc_out = nn.Linear(out_features, out_features, bias=False)
        self.dropout = nn.Dropout(dropout)
        self.softmax = nn.Softmax(dim=-1)

    def forward(self, q, k, v, mask=None):
        n_heads = self.w_qs.weight.size(0)
        d_k = self.w_qs.weight.size(1) // n_heads
        q = self.w_qs(q).view(q.size(0), q.size(1), n_heads, d_k)
        k = self.w_ks(k).view(k.size(0), k.size(1), n_heads, d_k)
        v = self.w_vs(v).view(v.size(0), v.size(1), n_heads, d_k)

        scores = torch.matmul(q.transpose(1, 2), k.transpose(1, 3)) / d_k ** 0.5
        if mask is not None:
            scores = scores.masked_fill(mask == 0, -1e9)

        attn = self.softmax(scores)
        output = torch.matmul(attn, v).transpose(1, 2).contiguous()
        output = output.view(output.size(0), output.size(1), -1)
        output = self.fc_out(output)
        return output, attn

class SANMEncoderLayer(nn.Module):
    def __init__(self, size, self_attn, feed_forward, dropout=0.1):
        super(SANMEncoderLayer, self).__init__()
        self.self_attn = self_attn
        self.feed_forward = feed_forward
        self.norm1 = nn.LayerNorm(size)
        self.norm2 = nn.LayerNorm(size)
        self.dropout = nn.Dropout(dropout)

    def forward(self, x, mask):
        residual = x
        x = self.norm1(x)
        x, _ = self.self_attn(x, x, x, mask)
        x = F.relu(x)
        x = self.dropout(x)
        x = residual + x
        x = self.norm2(x)
        residual = x
        x = self.feed_forward(x)
        x = self.dropout(x)
        x = residual + x
        return x

class SANMEncoder(nn.Module):
    def __init__(self, input_dim, num_layers, size, num_heads, ff_size, dropout=0.1):
        super(SANMEncoder, self).__init__()
        self.embedding = PositionalEncoding(size)
        self.layers = nn.ModuleList([
            SANMEncoderLayer(size, SelfAttention(size, size), 
                             nn.Linear(size, ff_size), dropout)
            for _ in range(num_layers)
        ])

    def forward(self, x, mask):
        x = self.embedding(x)
        for layer in self.layers:
            x = layer(x, mask)
        return x

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国资国企如何高效实现数据监管报送

为深入贯彻国家关于数字经济与实体经济融合发展的重要指示,结合国资监管信息系统的规范要求,亿信华辰积极响应,助力国企走上数字化转型的道路。应对国资国企监管要求,国资国企监管数据填报平台作为数字化建设的关键环节&#xff0…

【Vue】——前端框架的基本使用

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

超声波清洗机哪个品牌好用点?四款超卓超声波清洗机疯狂安利!

在这个注重效率与清洁卫生的时代,小型超声波清洗机因其便携性、高效能以及出色的清洁效果,成为了家庭和小型工作室的必备神器。无论是清洗珠宝、眼镜、化妆刷,还是日常的金属餐具和电子产品,小型超声波清洗机都能轻松应对&#xf…

操作失败——后端

控制台观察,页面发送的保存菜品的请求 返回的response显示: ---------- 我开始查看明明感觉都挺正常,没啥错误,就是查不出来。结果后面电脑关机重启后,隔一天看,就突然可以了。我觉着可能是浏览器的缓存没…

C# 声音强度图绘制

C# 声音强度图绘制 采集PCM音频数据 音频原来自麦克风 音频源来自录音文件 处理PCM音频数据 将PCM数据进行强度值换算 private void UpdateVoice(double[] audio){// 计算RMS值double rms Math.Sqrt(audio.Select(x > x * x).Average());// 将RMS值转换为分贝值&#x…

常用的接口测试工具

大家好,当谈到软件开发中的质量保证时,接口测试无疑是至关重要的一环。在当今快节奏的开发环境中,确保应用程序的各个组件之间的交互正常运作是至关重要的。而接口测试工具则成为了开发人员和测试人员的得力助手,帮助他们有效地测…

Java版电商平台B2B2C:多商家直播商城系统特性解析

B2B2C平台,立足于传统电商领域,同时引入了创新的商业模式。该平台不仅支持商家入驻和平台自营,还积极构建了一个全新的市场环境,旨在为各行各业及互联网创业者提供更多收益机会。 该平台以消费者需求为中心,帮助企业构…

什么是人机协同翻译

什么是人机协同翻译 序什么是人机协同翻译账号绑定服务开通文档翻译图片翻译体验感受及建议 序 什么是人机协同翻译,为什么会需要人机协同翻译,以及人机协同翻译的效果,应用场景等,本文将关于这些内容一一解答。 什么是人机协同…

全平台自定义小程序源码系统 一个后台控制7端 自主设计属于你的小程序 前后端带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代,小程序以其轻量级、跨平台、即用即走的特点,成为企业、个人及开发者们追捧的热门工具。为了满足不同用户的需求,小编给大家分享一款全平台自定义小程序源码系统。该系统通过一套强大的后台管理系统,实…

SD NAND的垃圾回收机制:无人机数据管理的隐形守护者

随着科技的飞速发展,无人机在各个领域的应用越来越广泛,从航拍到物流配送,再到农业监测,无人机正逐渐成为我们生活中不可或缺的一部分。而SD NAND作为一种创新的存储芯片,可以直接贴片使用,具有小尺寸、高可…

机台数据导出难住IT管理员,如何才能解决IT人员的困境?

为了方便数据的共享、保存、分析、合规性和迁移等目的,企业会按规律性的时间周期进行机台数据的导出操作,通过专业的数据迁移软件、外部存储设备(如USB硬盘、移动硬盘、SD卡等),或者通过机台设备的专用导出功能来完成。…

MoE 混合专家模型(Mixture of Experts)

参考:深度揭秘爆火MoE!GPT-4关键架构,成开源模型逆袭杀手锏 (baidu.com) MoE是一种神经网络架构设计,在Transformer模块中集成了专家/模型层。 当数据流经MoE层时,每个输入token都会动态路由到专家子模型进行处理。当…

使用Rufus工具制作Ubuntu To Go——很详细

一、准备工作 准备工具: 1、下载Rufus(主角)软件 2、准备一个U盘或硬盘(小白128G足够,装Ubuntu系统) 3、下载Ubuntu系统镜像文件 1、下载软件Rufus 先来看一下官网介绍: Rufus 是一款格式化和创建 USB 启动盘的辅助工…

直播商城源码-PC+APP+H5+小程序现成源码

随着电商行业的不断演进,直播商城已成为连接消费者和商品的新兴桥梁。直播商城源码提供了一个完整的解决方案,使得企业能够迅速搭建起一个覆盖PC、APP、H5和小程序的全渠道电商平台。本文将探讨直播商城源码的优势、关键功能以及如何选择适合的现成源码。…

银河麒麟操作系统 v10 离线安装 mysql 8.4.0

一 查看系统环境 [root0003 ~]# cat /etc/os os-release ostree/ [root0003 ~]# cat /etc/os-release NAME"Kylin Linux Advanced Server" VERSION"V10 (Lance)" ID"kylin" VERSION_ID"V10" PRETTY_NAME"Kylin Linux Ad…

嵌入式Linux系统编程 — 1.5 文件描述符详解

目录 1 文件描述符简介 1.1 文件描述符特点 1.2 标准文件描述符 1.3 文件描述符的生命周期 2 fcntl()函数 2.1 fcntl()函数简介 2.2 复制文件描述符(F_DUPFD) 2.3 获取/设置文件状态标志(F_GETFL/F_SETFL ) 1 文件描述符简介 文件描述符(File Descriptor&a…

绘画新手必备!六款免费易用的绘图软件推荐

在当今的数字世界里有各种各样的设计创作工具,那么问题来了我们应该如何在众多免费绘图软件中选择呢?为了回答这个问题,我们将在本文中介绍和测评六个领先的绘图软件。每一个都有自己独特的特点和优势,适合不同的需求和用户。以下…

Django缓存

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,若某个时…

C++设计模式-策略模式,AI角色动态选择行为

运行在VS2022,x86,Debug下。 27. 策略模式 策略模式让算法的选择与使用独立开来,使得代码更灵活、可扩展和易维护。应用:如在游戏开发中,AI角色需要根据环境和条件做出不同的行为,如寻路、攻击、躲避等。可…

【优选算法】栈 {何时使用栈结构?后缀表达式求值;中缀转后缀表达式;中缀表达式求值}

一、经验总结 何时使用栈结构解题? 做过相似的使用栈结构解得的题目嵌套处理:在从前向后处理的过程中,由于之后内容的不确定性而导致当前操作不能贸然进行,需要先进行保存,直到遇到区间结束标志(如’)&am…