samout 结构再优化 收敛速度再加快

代码

import torch
import numpy as npclass MaxState(torch.nn.Module):def __init__(self, hidden_dim, heads, win):super(MaxState, self).__init__()assert hidden_dim % heads == 0, "Hidden size must be divisible by the number of heads."self.head_size = hidden_dim // headsself.head = torch.nn.Linear(hidden_dim, hidden_dim, bias=False)self.state = torch.nn.Linear(hidden_dim, hidden_dim, bias=False)self.head_num = headsself.win = winself.hidden = hidden_dimself.mask = torch.triu(torch.ones([win, win])).to("cuda")self.layer_nor = torch.nn.LayerNorm(hidden_dim)def forward(self, input_data, state=None):# self.head.to("cuda")b, s, k, h, w = input_data.shape[0], input_data.shape[1], self.head_num, self.head_size, self.winwindow = torch.ones([1, w]).to("cuda")out = self.head(input_data)out = out.unsqueeze(-1) @ windowout = out.permute([0, 2, 1, 3])one_list = []if state is None:state = torch.ones([out.shape[0], out.shape[1], 1, 1]) * float("-inf")state = state.to("cuda")for i in range(0, s, w):state.reshape([state.shape[0], -1])j = w + ione = out[:, :, i:j]_, _, r, c = one.shapeif r != self.win:one = torch.where(self.mask[:r, :] == 1, one, torch.Tensor([-float('inf')]).to("cuda"))else:one = torch.where(self.mask == 1, one, torch.Tensor([-float('inf')]).to("cuda"))if i == 0:one = torch.concat([one, state @ window], axis=2)state, _ = torch.max(one, axis=2, keepdim=True)else:state1, _ = torch.max(one, axis=2, keepdim=True)# state = torch.sin(self.state(state1.reshape([state1.shape[0], -1]))*state.reshape([state.shape[0], -1]))state1 = self.state(state1.permute([0, 3, 1, 2]).reshape([state1.shape[0], -1, state1.shape[1]]))state = state1.permute([0, 2, 1]).unsqueeze(-2) + state# state = state.reshape(state1.shape)one = torch.concat([one, state], axis=2)state, _ = torch.max(one, axis=2, keepdim=True)one = state.reshape([b, k, h, w])state = state[..., -1:]if r != self.win:one = one[..., :r]one = one.permute([0, 3, 1, 2])one_list.append(one)out = torch.concat(one_list, 1)out = out.reshape([b, s, -1])return out, stateclass FeedForward(torch.nn.Module):def __init__(self, hidden_size):super(FeedForward, self).__init__()self.ffn1 = torch.nn.Linear(hidden_size, hidden_size * 2)self.ffn2 = torch.nn.Linear(hidden_size * 2, hidden_size)self.gate = torch.nn.Linear(hidden_size, hidden_size * 2)self.relu = torch.nn.ReLU()def forward(self, x):x1 = self.ffn1(x)x2 = self.relu(self.gate(x))x = x1 * x2x = self.ffn2(x)return xclass DecoderLayer(torch.nn.Module):def __init__(self, hidden_size, num_heads):super(DecoderLayer, self).__init__()# self.self_attention = MaskMultiHeadAttention(hidden_size, num_heads)self.self_attention = MaxState(hidden_size, num_heads, 8)self.ffn = FeedForward(hidden_size)self.layer_norm = torch.nn.LayerNorm(hidden_size)def forward(self, x, state=None, seq_len=None):x1, state = self.self_attention(x, state)x = self.layer_norm(self.ffn(x1) + x)  # Feed-Forward with residual connectionreturn x, stateclass SamOut(torch.nn.Module):def __init__(self, voc_size, hidden_size, num_heads, num_layers):super(SamOut, self).__init__()self.em = torch.nn.Embedding(voc_size, hidden_size, padding_idx=3)self.pos = torch.nn.Embedding(1024, hidden_size)self.decoder_layers = torch.nn.ModuleList([DecoderLayer(hidden_size, num_heads) for _ in range(num_layers)])self.head = torch.nn.Linear(hidden_size, voc_size)self.head_state = torch.nn.Linear(hidden_size, num_layers)self.layer_nor=torch.nn.LayerNorm(hidden_size)self.down=torch.nn.ModuleList([torch.nn.Linear(2*hidden_size,hidden_size) for _ in range(num_layers)])def forward(self, x, state=None, seq_len=None):x = self.em(x)if x.shape[1] >= 1024:pos = self.pos(torch.range(0, x.shape[1]-1).long() // 1024).unsqueeze(0)pos = self.pos(torch.range(0, x.shape[1]-1).long() % 1024).unsqueeze(0) + poselse:pos = self.pos(torch.range(0, x.shape[1]-1).long().to("cuda")).unsqueeze(0)if state is None:state = [None] * len(self.decoder_layers)i = 0for decoder_layer in self.decoder_layers:x1, state[i] = decoder_layer(self.down[i](torch.concat([torch.zeros([x.shape[0],1,1]).to("cuda")+pos , x],-1)), state[i])x = x1 + xi += 1state_data = self.head_state((torch.concat(state, -1).squeeze(-2)).permute([0, 2, 1]))return self.head(x), state, state_dataif __name__ == '__main__':net = SamOut(235, 256, 16, 4)net(torch.randint(0, 200, [2, 3000]))

解释

这段代码定义了一个基于PyTorch的神经网络模型,该模型包含自定义的解码器层和输出层,用于处理序列数据。下面是代码的逐行解析:

import torch
import numpy as np
  • 导入PyTorch库和NumPy库。
class MaxState(torch.nn.Module):def __init__(self, hidden_dim, heads, win):super(MaxState, self).__init__()
  • 定义一个名为MaxState的类,继承自torch.nn.Module。这是自定义的一个模块,用于处理状态的最大化。
        assert hidden_dim % heads == 0, "Hidden size must be divisible by the number of heads."
  • 断言检查,确保隐藏层的维度可以被注意力头的数量整除。
        self.head_size = hidden_dim // headsself.head = torch.nn.Linear(hidden_dim, hidden_dim, bias=False)self.state = torch.nn.Linear(hidden_dim, hidden_dim, bias=False)self.head_num = headsself.win = winself.hidden = hidden_dimself.mask = torch.triu(torch.ones([win, win])).to("cuda")self.layer_nor = torch.nn.LayerNorm(hidden_dim)
  • 初始化类成员变量,包括线性层、注意力头数量、窗口大小、掩码和层归一化。
    def forward(self, input_data, state=None):# self.head.to("cuda")b, s, k, h, w = input_data.shape[0], input_data.shape[1], self.head_num, self.head_size, self.win
  • 前向传播方法,获取输入数据的形状参数。
        window = torch.ones([1, w]).to("cuda")
  • 创建一个窗口张量,并将其移动到CUDA设备。
        out = self.head(input_data)
  • 应用线性层到输入数据。
        out = out.unsqueeze(-1) @ window
  • 扩展维度并进行矩阵乘法。
        out = out.permute([0, 2, 1, 3])
  • 调整输出的维度顺序。
        one_list = []if state is None:state = torch.ones([out.shape[0], out.shape[1], 1, 1]) * float("-inf")state = state.to("cuda")
  • 初始化状态张量,如果状态为None,则创建一个初始状态。
        for i in range(0, s, w):# ... (省略中间代码)
  • 循环处理每个窗口大小的数据块。
        return out, state
  • 返回处理后的输出和状态。
    接下来是FeedForwardDecoderLayerSamOut类的定义,这些类分别实现了前馈网络、解码器层和整个模型的输出部分。代码结构与MaxState类类似,包含了初始化和前向传播方法。
if __name__ == '__main__':net = SamOut(235, 256, 16, 4)net(torch.randint(0, 200, [2, 3000]))
  • 如果当前脚本作为主程序运行,创建一个SamOut模型实例,并使用随机整数张量作为输入进行测试。

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

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

相关文章

基于python实现并编译提升cpu与内存使用率的脚本

在服务器运维过程中,有很多公司会对服务器的资源使用率进行监测,发现使用率不高了,会对服务器降配。如果你是乙方,你可以尝试一下这种方法,脚本提升cpu与内存的使用率。如果你需要对服务器性能或者服务稳定性进行测试&…

Redis 布隆过滤器性能对比分析

redis 实现布隆过滤器实现方法: 1、redis 的 setbit 和 getbit 特点:对于某个bit 设置0或1,对于大量的值需要存储,非常节省空间,查询速度极快,但是不能查询整个key所有的bit,在一次请求有大量…

240711_昇思学习打卡-Day23-LSTM+CRF序列标注(2)

240711_昇思学习打卡-Day23-LSTMCRF序列标注(2) 今天记录LSTMCRF序列标注的第二部分。仅作简单记录 Score计算 首先计算正确标签序列所对应的得分,这里需要注意,除了转移概率矩阵𝐏外,还需要维护两个大小…

担心插座预留的不够用,家里装修留多少开关插座

全屋插座布局,防漏防后悔      家里装修留多少开关插座?留多了费钱      留少了还不够用,给大家整理了全屋开关插座的布局      1,入户门留5个,门外给监控器1个      门旁边给卧室,走廊,客厅,中央空调各留1个      2,客厅留10个,电视留4-5个, 沙发两边各1…

html5——CSS基础选择器

目录 标签选择器 类选择器 id选择器 三种选择器优先级 标签指定式选择器 包含选择器 群组选择器 通配符选择器 Emmet语法&#xff08;扩展补充&#xff09; 标签选择器 HTML标签作为标签选择器的名称&#xff1a; <h1>…<h6>、<p>、<img/> 语…

如何做好漏洞扫描工作提高网络安全

在数字化浪潮席卷全球的今天&#xff0c;企业数字化转型已成为提升竞争力、实现可持续发展的关键路径。然而&#xff0c;这一转型过程并非坦途&#xff0c;其中网络安全问题如同暗礁般潜伏&#xff0c;稍有不慎便可能引发数据泄露、服务中断乃至品牌信誉受损等严重后果。因此&a…

edge 学习工具包 math solver

简介 推荐微软推出的学习工具中的两项工具&#xff1a;数学求解器和 pdf 阅读器。 打开 edge 学习工具包的方法 &#xff1a;右上角三点-更多工具-学习工具包。 math solver 除了基础的计算求解外&#xff0c;还用图标展示公式&#xff0c;清晰直观。 地址&#xff1a;求解…

CentOS7使用yum命令报错

目录结构 前言使用yum命令&#xff0c;报错信息问题排查解决方案参考文章 前言 安装CentOS 7 虚拟机&#xff0c;使用yum命令报错&#xff0c;调查整理如下&#xff1a; 使用yum命令&#xff0c;报错信息 [rootlocalhost ~]# sudo yum install net-tools 已加载插件&#xff…

OPenCV实现直方图均衡化----20240711

# 直方图均衡化import cv2 import numpy as np import matplotlib.pyplot as plt# 读取彩色图像 img = cv2.imread("./pictures/Lena.jpg")# 检查图像是否加载成功 if img is None:print("Could not open or find the i

每天五分钟深度学习:向量化技术在神经网络中的应用

本文重点 向量化技术,简而言之,就是利用矩阵运算(而非传统的for循环)来执行大规模的计算任务。这种技术依赖于单指令多数据(SIMD)架构,允许一个指令同时对多个数据元素执行相同的操作。例如,在向量化加法中,不再需要逐个元素进行加法操作,而是可以一次性对整个向量执…

【电子通识】无源元件与有源元件的定义和区别是什么?

当提到构成电路的电子器件时,许多人可能会想到晶体管、电容器、电感器和电阻器等器件。一般情况下,我们使用的电子器件分为两大类,即“有源元件”和“无源元件”。 有源元件是主动影响(如放大、整流、转换等)所供给电能的元件。 无源元件是对所供给的电能执行被动…

测试驱动开发的艺术:Xcode中实现TDD的全面指南

测试驱动开发的艺术&#xff1a;Xcode中实现TDD的全面指南 在软件开发过程中&#xff0c;测试驱动开发&#xff08;Test-Driven Development&#xff0c;TDD&#xff09;是一种以测试为先导的开发模式&#xff0c;它强调先编写测试用例&#xff0c;再编写功能代码&#xff0c;…

流程图编辑框架LogicFlow-vue-ts和js

LogicFlow官网https://site.logic-flow.cn/LogicFlow 是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端研发自定义开发各种逻辑编排场景&#xff0c;如流程图、ER图、BPMN流程等。在工作审批配…

【zabbix7】开启HTTP authentication实现单点登录

开启HTTP authentication实现单点登录 一、新建http验证用户 htpasswd -c /etc/nginx/.htpasswd another_username # 在提示中输入密码二、新建Nginx配置文件 把zabbix.conf拷贝一份&#xff0c;然后修改listen监听的端口。 cp zabbx.conf zabbix_http.conf 每个location中新…

【Dison夏令营 Day 16】如何使用 Python 中的 PyGame 制作俄罗斯方块游戏

俄罗斯方块(Tetris)是一款经典的益智游戏&#xff0c;游戏的目的是将落下的几何图形片&#xff08;称为 “俄罗斯方块”&#xff09;排列起来&#xff0c;填满水平线&#xff0c;不留空隙。当一条线被完全填满时&#xff0c;它就被清除了&#xff0c;玩家就能获得分数。随着四角…

操作系统——内存管理(面试准备)

虚拟内存 单片机没有操作系统&#xff0c;每次写完代码&#xff0c;都需要借助工具把程序烧录进去&#xff0c;这样程序才能跑起来。 另外&#xff0c;单片机的CPU是直接操作内存的物理地址。 在这种情况下&#xff0c;想在内存中同时运行两个程序是不可能的&#xff0c;如果第…

(CVPR-2024)SwiftBrush:具有变分分数蒸馏的单步文本到图像扩散模型

SwiftBrush&#xff1a;具有变分分数蒸馏的单步文本到图像扩散模型 Paper Title&#xff1a;SwiftBrush: One-Step Text-to-Image Diffusion Model with Variational Score Distillation Paper 是 VinAI Research 发表在 CVPR 24 的工作 Paper地址 Code:地址 Abstract 尽管文本…

Flutter-实现物理小球碰撞效果

效果 引言 在Flutter应用中实现物理动画效果&#xff0c;可以大大提升用户体验。本文将详细介绍如何在Flutter中创建一个模拟物理碰撞的动画小球界面&#xff0c;主要代码实现基于集成sensors_plus插件来获取设备的加速度传感器数据。 准备工作 在开始之前&#xff0c;请确保…

一文详解DDL同步及其应用场景

目录 一、什么是DDL&#xff1f; 二、什么是DDL同步&#xff1f; 三、DDL同步的痛点 1、缺少自动DDL同步机制 2、缺少DDL变更监测预警 四、解决方案 五、应用场景及案例 案例一 案例二 案例三 在现代数据管理中&#xff0c;数据库的结构变更频繁且不可避免&#xff0c;特别是在…

Kubelet 认证

当我们执行kubectl exec -it pod [podName] sh命令时&#xff0c;apiserver会向kubelet发起API请求。也就是说&#xff0c;kubelet会提供HTTP服务&#xff0c;而为了安全&#xff0c;kubelet必须提供HTTPS服务&#xff0c;且还要提供一定的认证与授权机制&#xff0c;防止任何知…