当前位置: 首页 > news >正文

手动实现 Transformer 模型

本文使用 Pytorch 库手动实现了传统 Transformer 模型中的多头自注意力机制、残差连接和层归一化、前馈层、编码器、解码器等子模块,进而实现了对 Transformer 模型的构建。

"""
@Title: 解析 Transformer
@Time: 2025/5/10
@Author: Michael Jie
"""import mathimport torch
import torch.nn.functional as F
from torch import nn, Tensor# 缩放点积注意力机制 (Scaled Dot-Product Attention)
class Attention(nn.Module):def __init__(self, causal: bool = True) -> None:"""注意力公式:Attention(Q, K, V) = softmax(Q · K / sqrt(d_k)) · VArgs:causal: 是否自动生成因果掩码,默认为 True"""super(Attention, self).__init__()self.causal = causaldef forward(self,q: Tensor,k: Tensor,v: Tensor,padding_mask: Tensor = None,attn_mask: Tensor = None) -> tuple[Tensor, Tensor]:"""填充掩码:处理变长序列,避免填充影响注意力计算因果掩码:防止解码器在训练时看到未来的信息Args:q: 查询 shape=(..., seq_len_q, d_k)k: 键 shape=(..., seq_len_k, d_k)v: 值 shape=(..., seq_len_k, d_v)padding_mask: 填充掩码 shape=(..., seq_len_k)attn_mask: 因果掩码 shape=(..., seq_len_q, seq_len_k)Returns:output: 输出 shape=(..., seq_len_q, d_v)weights: 注意力权重 shape=(..., seq_len_q, seq_len_k)"""# 注意力分数d_k = q.size(-1)scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_k)# 应用填充掩码if padding_mask is not None:# 广播 (..., 1, seq_len_k)scores = scores.masked_fill(padding_mask.unsqueeze(-2), float("-inf"))# 自动生成因果掩码,优先使用自定义的因果掩码seq_len_q, seq_len_k = q.size(-2), k.size(-2)if self.causal and attn_mask is None:attn_mask = torch.triu(torch.ones(seq_len_q, seq_len_k), diagonal=1).bool()# 应用因果掩码if attn_mask is not None:scores = scores.masked_fill(attn_mask, float("-inf"))# 注意力权重weights = F.softmax(scores, dim=-1)# 再次应用填充掩码,确保填充位置的注意力权重为 0if padding_mask is not None:weights = weights.masked_fill(padding_mask.unsqueeze(-2), 0)# 乘以 v 得到输出output = torch.matmul(weights, v)return output, weights# 自注意力机制 (Self Attention)
class SelfAttention(nn.Module):def __init__(self, d_model: int = 512) -> None:"""自注意力机制是注意力机制的一种特殊形式,其中 Q、K、V 都来自同一输入序列,其能够捕捉序列内部元素之间的关系,不依赖 RNN 或 CNN,直接建模长距离依赖。Args:d_model: 特征维度,默认为 512"""super(SelfAttention, self).__init__()self.attention = Attention()  # 注意力机制# 合并 Q、K、V 的线性变换self.linear_qkv = nn.Linear(d_model, d_model * 3)self.linear_out = nn.Linear(d_model, d_model)def forward(self,x: Tensor,padding_mask: Tensor = None,attn_mask: Tensor = None) -> Tensor:"""_Args:x: 词嵌入 shape=(batch_size, seq_len, d_model)padding_mask: 填充掩码 shape=(batch_size, seq_len)attn_mask: 因果掩码 shape=(seq_len, seq_len)Returns:output: 输出 shape=(batch_size, seq_len, d_model)"""# 通过线性层同时生成 Q、K、Vqkv = self.linear_qkv(x)q, k, v = qkv.chunk(3, dim=-1)  # (batch_size, seq_len, d_model)# 应用注意力机制output, weights = self.attention(q, k, v, padding_mask, attn_mask)return self.linear_out(output)# 多头自注意力机制 (Multi-Head Self Attention)
class MultiHeadSelfAttention(nn.Module):def __init__(self, d_model: int = 512, num_heads: int = 8) -> None:"""多头自注意力机制是自注意力机制的扩展,通过将输入特征分割成多个头,每个头独立计算注意力,然后将结果拼接起来,从而提高模型的多角度表达能力。Args:d_model: 特征维度,默认为 512num_heads: 头数,默认为 8"""super(MultiHeadSelfAttention, self).__init__()if d_model % num_heads != 0:raise ValueError(f"d_model must be divisible by num_heads, but got {d_model} and {num_heads}")self.num_heads = num_headsself.attention = Attention()  # 注意力机制# 分别对 Q、K、V 进行线性变换self.linear_q = nn.Linear(d_model, d_model)self.linear_k = nn.Linear(d_model, d_model)self.linear_v = nn.Linear(d_model, d_model)self.linear_out = nn.Linear(d_model, d_model)def forward(self,q: Tensor,k: Tensor,v: Tensor,padding_mask: Tensor = None,attn_mask: Tensor = None) -> Tensor:"""Q、K、V 在不同的自注意力模块中的来源可能不同,在编解码器自注意力中,Q 来自解码器的输入,K、V 来自编码器的输出。Args:q: 查询 shape=(batch_size, seq_len, d_model)k: 键 shape=(batch_size, seq_len / seq_len_k, d_model)v: 值 shape=(batch_size, seq_len / seq_len_k, d_model)padding_mask: 填充掩码 shape=(batch_size, seq_len / seq_len_k)attn_mask: 因果掩码 shape=(seq_len / seq_len_k, seq_len / seq_len_k)Returns:output: 输出 shape=(batch_size, seq_len, d_model)"""q = self.linear_q(q)k = self.linear_k(k)v = self.linear_v(v)batch_size, seq_len, seq_len_k = q.size(0), q.size(1), k.size(1)# (batch_size, num_heads, seq_len, d_k)q = q.view(batch_size, seq_len, self.num_heads, -1).transpose(1, 2)k = k.view(batch_size, seq_len_k, self.num_heads, -1).transpose(1, 2)v = v.view(batch_size, seq_len_k, self.num_heads, -1).transpose(1, 2)# 调整掩码形状以匹配多头if padding_mask is not None:padding_mask = padding_mask.unsqueeze(1)  # (batch_size, 1, seq_len)if attn_mask is not None:attn_mask = attn_mask.unsqueeze(0)  # (1, seq_len, seq_len)# 应用注意力机制output, weights = self.attention(q, k, v, padding_mask, attn_mask)# 拼接output = output.transpose(1, 2).contiguous().view(batch_size, seq_len, -1)return self.linear_out(output)# 残差连接和层归一化 (Add&Norm)
class AddNorm(nn.Module):def __init__(self, d_model: int = 512) -> None:"""Add&Norm 层结合了两种操作:残差连接和层归一化,可以使模型在训练过程中更加稳定,并且通过堆叠多个这样的层来构建更深的模型。Args:d_model: 特征维度,默认为 512"""super(AddNorm, self).__init__()self.norm = nn.LayerNorm(d_model)  # 层归一化def forward(self, x: Tensor, y: Tensor) -> Tensor:return self.norm(x + y)# 前馈层 (FeedForward Layer)
class FeedForward(nn.Module):def __init__(self,input_dim: int = 512,hidden_dim: int = 2048,activation: str = "relu",dropout: float = 0.1) -> None:"""全连接层(扩大维度) -> 激活函数 -> 全连接层(恢复原始维度)通过非线性变换进一步提取和增强特征,使模型具备更强的模式识别和语义组合能力。Args:input_dim: 输入维度,默认为 512hidden_dim: 隐藏层维度,默认为 2048activation: 激活函数,默认为 "relu"-支持:"sigmoid", "tanh", "relu", "gelu", "leaky_relu", "elu"dropout: 丢弃率,默认为 0.1"""super(FeedForward, self).__init__()match activation:  # 切换不同的激活函数case "sigmoid":activation = nn.Sigmoid()case "tanh":activation = nn.Tanh()case "relu":activation = nn.ReLU()case "gelu":activation = nn.GELU()case "leaky_relu":activation = nn.LeakyReLU()case "elu":activation = nn.ELU()case _:raise ValueError(f"Unsupported activation function: {activation}")# Linear -> activation -> Dropout -> Linearself.ffn = nn.Sequential(nn.Linear(input_dim, hidden_dim),activation,nn.Dropout(dropout),nn.Linear(hidden_dim, input_dim),)def forward(self, x: Tensor) -> Tensor:return self.ffn(x)# 编码层
class EncoderLayer(nn.Module):def __init__(self,d_model: int = 512,num_heads: int = 8,dim_feedforward: int = 2048,dropout: float = 0.1) -> None:"""MultiHeadSelfAttention -> AddNorm -> FeedForward -> AddNormArgs:d_model: 特征维度,默认为 512num_heads: 头数,默认为 8dim_feedforward: FFN 隐藏层维度,默认为 2048dropout: 丢弃率,默认为 0.1"""super(EncoderLayer, self).__init__()# 多头自注意力层self.attn = MultiHeadSelfAttention(d_model, num_heads)# Add&Norm 层self.norm1 = AddNorm(d_model)self.norm2 = AddNorm(d_model)# 前馈层self.ffn = FeedForward(d_model, dim_feedforward, dropout=dropout)# 丢弃层self.dropout1 = nn.Dropout(dropout)self.dropout2 = nn.Dropout(dropout)def forward(self,x: Tensor,padding_mask: Tensor = None,attn_mask: Tensor = None) -> Tensor:x = self.norm1(x, self.dropout1(self.attn(x, x, x, padding_mask, attn_mask)))x = self.norm2(x, self.dropout2(self.ffn(x)))return x# 编码器
class Encoder(nn.Module):def __init__(self, num_layers: int = 6, **params) -> None:"""编码器由多个编码层组成,每个编码层结构相同但并不共享参数。Args:num_layers: 层数,默认为 6**params: 编码层参数,参考 EncoderLayer"""super(Encoder, self).__init__()self.layers = nn.ModuleList([EncoderLayer(**params)for _ in range(num_layers)])def forward(self,x: Tensor,padding_mask: Tensor = None,attn_mask: Tensor = None) -> Tensor:for layer in self.layers:  # 逐层传递x = layer(x, padding_mask, attn_mask)return x# 解码层
class DecoderLayer(nn.Module):def __init__(self,d_model: int = 512,num_heads: int = 8,dim_feedforward: int = 2048,dropout: float = 0.1) -> None:"""MultiHeadSelfAttention -> AddNorm -> MultiHeadSelfAttention -> AddNorm -> FeedForward -> AddNormArgs:d_model: 特征维度,默认为 512num_heads: 头数,默认为 8dim_feedforward: FFN 隐藏层维度,默认为 2048dropout: 丢弃率,默认为 0.1"""super(DecoderLayer, self).__init__()# 多头自注意力层self.attn = MultiHeadSelfAttention(d_model, num_heads)self.cross_attn = MultiHeadSelfAttention(d_model, num_heads)# Add&Norm 层self.norm1 = AddNorm(d_model)self.norm2 = AddNorm(d_model)self.norm3 = AddNorm(d_model)# 前馈层self.ffn = FeedForward(d_model, dim_feedforward, dropout=dropout)# 丢弃层self.dropout1 = nn.Dropout(dropout)self.dropout2 = nn.Dropout(dropout)self.dropout3 = nn.Dropout(dropout)def forward(self,y: Tensor,memory: Tensor,padding_mask_y: Tensor = None,padding_mask_memory: Tensor = None,attn_mask_y: Tensor = None,attn_mask_memory: Tensor = None) -> None:x = yx = self.norm1(x, self.dropout1(self.attn(x, x, x, padding_mask_y, attn_mask_y)))x = self.norm2(x, self.dropout2(self.attn(x, memory, memory, padding_mask_memory, attn_mask_memory)))x = self.norm3(x, self.dropout3(self.ffn(x)))return x# 解码器
class Decoder(nn.Module):def __init__(self, num_layers: int = 6, **params) -> None:"""解码器由多个解码层组成,每个解码层结构相同但并不共享参数。Args:num_layers: 层数,默认为 6**params: 解码层参数,参考 DecoderLayer"""super(Decoder, self).__init__()self.layers = nn.ModuleList([DecoderLayer(**params)for _ in range(num_layers)])def forward(self,y: Tensor,memory: Tensor,padding_mask_y: Tensor = None,padding_mask_memory: Tensor = None,attn_mask_y: Tensor = None,attn_mask_memory: Tensor = None) -> Tensor:x = yfor layer in self.layers:  # 逐层传递x = layer(y, memory, padding_mask_y, padding_mask_memory, attn_mask_y, attn_mask_memory)return x# Transformer
class Transformer(nn.Module):def __init__(self,num_encoder_layers: int = 6,num_decoder_layers: int = 6,**params) -> None:"""transformer 是标准的编码器-解码器结构Args:num_encoder_layers: 编码器层数,默认为 6num_decoder_layers: 解码器层数,默认为 6**params: 编解码层参数,参考 EncoderLayer 和 DecoderLayer"""super(Transformer, self).__init__()self.encoder = Encoder(num_encoder_layers, **params)  # 编码器self.decoder = Decoder(num_decoder_layers, **params)  # 解码器def forward(self,x: Tensor,y: Tensor,padding_mask_x: Tensor = None,padding_mask_y: Tensor = None,padding_mask_memory: Tensor = None,attn_mask_x: Tensor = None,attn_mask_y: Tensor = None,attn_mask_memory: Tensor = None) -> Tensor:memory = self.encoder(x, padding_mask_x, attn_mask_x)output = self.decoder(y, memory, padding_mask_y, padding_mask_memory, attn_mask_y, attn_mask_memory)return outputif __name__ == '__main__':# attention = Attention(True)# t1, t2 = attention(#     torch.rand((2, 3, 64)),#     torch.rand((2, 5, 64)),#     torch.rand((2, 5, 512)),#     torch.tensor([[False, True, True, True, True],#                   [False, False, False, False, True]])# )# print(t1.shape, t2.shape)# self_attention = SelfAttention()# t3 = self_attention(#     torch.rand((2, 5, 512)),#     torch.tensor([[False, False, False, True, True],#                   [False, False, True, True, True]])# )# print(t3.shape)# multi_head_self_attention = MultiHeadSelfAttention(num_heads=2)# t4 = multi_head_self_attention(#     torch.rand((2, 3, 512)),#     torch.rand((2, 5, 512)),#     torch.rand((2, 5, 512)),#     torch.tensor([[False, False, False, True, True],#                   [False, False, True, True, True]])# )# print(t4.shape)# encoder_layer = EncoderLayer()# t5 = encoder_layer(#     torch.rand((2, 5, 512)),#     torch.tensor([[False, False, False, True, True],#                   [False, False, True, True, True]])# )# print(t5.shape)# encoder = Encoder(dropout=0.2)# t6 = encoder(#     torch.rand((2, 5, 512)),#     torch.tensor([[False, False, False, True, True],#                   [False, False, True, True, True]])# )# print(t6.shape)# decoder_layer = DecoderLayer()# t7 = decoder_layer(#     torch.rand((2, 3, 512)),#     torch.rand((2, 5, 512)),#     torch.tensor([[False, False, False],#                   [False, False, True]]),#     torch.tensor([[False, False, False, True, True],#                   [False, False, True, True, True]])# )# print(t7.shape)# decoder = Decoder()# t8 = decoder(#     torch.rand((2, 3, 512)),#     torch.rand((2, 5, 512)),#     torch.tensor([[False, False, False],#                   [False, False, True]]),#     torch.tensor([[False, False, False, True, True],#                   [False, False, True, True, True]])# )# print(t8.shape)transformer = Transformer()t9 = transformer(torch.rand((2, 5, 512)),torch.rand((2, 3, 512)),torch.tensor([[False, False, False, True, True],[False, False, True, True, True]]),torch.tensor([[False, False, False],[False, False, True]]),)print(t9.shape)

相关文章:

手动实现 Transformer 模型

本文使用 Pytorch 库手动实现了传统 Transformer 模型中的多头自注意力机制、残差连接和层归一化、前馈层、编码器、解码器等子模块,进而实现了对 Transformer 模型的构建。 """ Title: 解析 Transformer Time: 2025/5/10 Author: Michael Jie &quo…...

【鸿蒙开发避坑】使用全局状态变量控制动画时,动画异常甚至动画方向与预期相反的原因分析以及解决方案

【鸿蒙开发避坑】使用全局状态变量控制动画,动画异常甚至动画方向相反的原因分析以及解决方案 一、问题复现1、问题描述2、问题示意图 二、原因深度解析1、查看文档2、调试3、原因总结:(1)第一次进入播放页面功能一切正常的原因&a…...

天拓四方锂电池卷绕机 PLC 物联网解决方案

近年来,锂电制造行业作为新能源领域的核心支柱产业,呈现出迅猛发展的态势,市场需求持续高涨。在此背景下,行业内对产品质量、生产效率以及成本控制等方面提出了更为严苛的要求。锂电制造流程涵盖混料、涂布、辊压、分切、制片、卷…...

RFID系统:技术解析与应用全景

一、技术架构与运行逻辑 RFID(Radio Frequency Identification)系统通过无线电波实现非接触式数据交互,其核心由三部分组成: 电子标签(Tag): 无源标签:依赖读写器电磁场供电&…...

hbuilderX 安装Prettier格式化代码

一、打开插件安装 搜索输入:Prettier 安装后,重启hbuilderX ,再按AltShiftF 没安装Prettier格式化: import {saveFlow,getTemplate } from "../../api/flowTemplate.js"; 安装Prettier格式化后: import …...

Python-92:最大乘积区间问题

问题描述 小R手上有一个长度为 n 的数组 (n > 0),数组中的元素分别来自集合 [0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]。小R想从这个数组中选取一段连续的区间,得到可能的最大乘积。 你需要帮助小R找到最大乘积的区间,并输出这…...

Compose笔记(二十三)--多点触控

这一节主要了解一下Compose中多点触控,在Jetpack Compose 中,多点触控处理需要结合Modifier和手势API来实现,一般通过组合 pointerInput、TransformableState 和 TransformModifier 来创建支持缩放、旋转和平移的组件。 一、 API 1. Pointer…...

2025.05.17淘天机考笔试真题第一题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 魔法棋盘构造 问题描述 LYA 正在设计一款魔法棋盘游戏。游戏棋盘由 2 n 2 \times n...

python的漫画网站管理系统

目录 技术栈介绍具体实现截图![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0ed2084038144499a162b3fb731a5f37.png)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a76a091066f74a80bf7ac1be489ae8a8.png)系统设计研究方法:设计步骤设计流程核…...

系统架构设计(十):结构化编程

定义 结构化编程是一种遵循清晰逻辑结构、避免使用 goto 的编程方法。它强调使用有限的三种基本控制结构来组织程序,提高程序的可读性、可维护性和可测试性。 它是现代程序设计的基础,被广泛应用于命令式语言(如 C、Pascal、Java&#xff0…...

系统架构设计(七):数据流图

定义 数据流图(Data Flow Diagram, DFD)是一种用于表示信息系统数据流转及处理过程的图形工具。 它反映系统功能及数据之间的关系,是结构化分析与设计的重要工具。 主要符号 符号说明描述举例方框外部实体(源或终点&#xff09…...

BrepGen中的几何特征组装与文件保存详解 deepwiki occwl OCC包装库

有这种好东西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 组装几何特征以创建B-rep模型 保存为STEP和STL文件细说 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…...

QT6 源(105)篇二:阅读与注释 QAction,给出源代码

&#xff08;5&#xff09;本源代码来自于头文件 qaction . h &#xff1a; #ifndef QACTION_H #define QACTION_H#include <QtGui/qtguiglobal.h> #if QT_CONFIG(shortcut) # include <QtGui/qkeysequence.h> #endif #include <QtGui/qicon.h> #include &…...

复旦微FMQL调试笔记:PS网口

引言 FPGA&#xff0c;全程现场可编程门阵列&#xff0c;是指一切通过软件手段更改、配置器件内部连接结构和逻辑单元&#xff0c;完成既定设计功能的数字集成电路。换个简单通俗的介绍方式&#xff0c;就好比一个全能的运动员&#xff0c;FPGA就是这么神奇的可以通过设定而实…...

SpringBoot启动流程深入分析

文章目录 背景启动流程listeners.starting先获取运行监听器获取SpringApplicationRunListener的实例监听器接口从spring.factories中加载数据&#xff0c;这里有本地缓存监听启动发布starting事件 prepareEnvironment准备环境获取或创建环境配置环境 createApplicationContext创…...

Linux - 2.系统命令

1.帮助命令 1.help [root@localhost /]# cp --help1.查看命令的信息和参数2.只能显示shell内部的命令信息3.help命令第一部分是概述,第二部分是参数详解,第三部分是说明和注意 # 使用语法 Usage: cp [OPTION]... [-T] SOURCE DESTor: cp [OPTION]... SOURCE... DIRECTORYor:…...

CSP 2024 提高级第一轮(CSP-S 2024)单选题解析

单选题解析 第 1 题 在 Linux 系统中&#xff0c;如果你想显示当前工作目录的路径&#xff0c;应该使用哪个命令&#xff1f;&#xff08;A&#xff09; A. pwd B. cd C. ls D. echo 解析&#xff1a;Linux 系统中&#xff0c;pwd命令可以显示当前工作目录的路径。pwd&#x…...

JavaScript运算符

在JavaScript开发中&#xff0c;运算符是编程的基础工具。它们用于执行各种操作&#xff0c;从简单的数学计算到复杂的逻辑判断。本文将深入探讨JavaScript中的各种运算符&#xff0c;包括算术运算符、比较运算符、布尔运算符、位运算符以及其他一些特殊运算符。 一、算术运算…...

无线信道的噪声与干扰

目录 1. 无线信道(wireless channel)与电磁波 2.1 电磁波的传输(无线信道传输) 2.2 视线(line of sight)传播与天线高度 2. 信道的数学模型 2.1 调制信道模型 2.1.1 加性噪声/加性干扰 2.1.2 乘性噪声/乘性干扰 2.1.3 随参信道/恒参信道 2.2 编码信道模型 2.3 小结 …...

计算机视觉与深度学习 | Python实现EMD-CNN-LSTM时间序列预测(完整源码、数据、公式)

EMD-CNN-LSTM 1. 环境准备2. 数据生成(示例数据)3. EMD分解4. 数据预处理5. CNN-LSTM模型定义6. 模型训练7. 预测与重构8. 性能评估核心公式说明1. 经验模态分解(EMD)2. CNN-LSTM混合模型参数调优建议扩展方向典型输出示例以下是使用Python实现EMD-CNN-LSTM时间序列预测的完…...

基于Yolov8+PyQT的老人摔倒识别系统源码

概述 随着人工智能技术的普及&#xff0c;计算机视觉在安防领域的应用日益广泛。幽络源本次分享的​​基于Yolov8PyQT的老人摔倒识别系统​​&#xff0c;正是针对独居老人安全监护的实用解决方案。该系统通过深度学习算法实时检测人体姿态&#xff0c;精准识别站立、摔倒中等…...

【网络入侵检测】基于Suricata源码分析运行模式(Runmode)

【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全&#xff0c;欢迎关注与评论。 1. 概要 &#x1f44b; 在 Suricata 中抽象出线程、线程模块和队列三个概念&#xff1a;线程类似进程&#xff0c;可多线程并行执行操作&#xff1b;监听、解码、检…...

深入解析:java.sql.SQLException: No operations allowed after statement closed 报错

在 Java 应用程序开发过程中&#xff0c;尤其是涉及数据库交互时&#xff0c;开发者常常会遇到各种各样的异常。其中&#xff0c;java.sql.SQLException: No operations allowed after statement closed是一个较为常见且容易令人困惑的错误。本文将深入剖析这一报错&#xff0c…...

ARM-Linux 完全入门

1.准备部分 1.1 虚拟机安装 准备VMware软件、ubuntu系统镜像安装过程 VMware安装 破解&#xff08;自己百度破解码&#xff0c;多试几个网址&#xff0c;会有能用的&#xff09;Ubuntu安装 配置联网 桥接 虚拟机Ubuntu系统必须能连接到外网&#xff0c;不然不能更新软件安装…...

前端二进制数据指南:从 ArrayBuffer 到高级流处理

前端开发中&#xff0c;二进制数据是处理文件、图像、音视频、网络通信等场景的基础。以下是核心概念和用途的通俗解释&#xff1a; 前端二进制数据介绍 1. 什么是前端二进制数据&#xff1f; 指计算机原始的 0 和 1 格式的数据&#xff08;比如一张图片的底层代码&#xff…...

深入理解构造函数,析构函数

目录 1.引言 2.构造函数 1.概念 2.特性 3.析构函数 1.概念 2.特性 1.引言 如果一个类中什么都没有&#xff0c;叫作空类. class A {}; 那么我们这个类中真的是什么都没有吗?其实不是,如果我们类当中上面都不写.编译器会生成6个默认的成员函数。 默认成员函数:用户没有显…...

数值分析知识重构

数值分析知识重构 一 Question 请构造一下数值分析中的误差概念以及每一个具体数值方法的误差是如何估计的&#xff1f; 二 Question 已知 n 1 n1 n1个数据点 ( x i , y i ) , i 0 , 1 , ⋯ , n (x_i,y_i),i0,1,\cdots,n (xi​,yi​),i0,1,⋯,n,请使用多种方法建立数据之间…...

全端同步!ZKmall开源商城如何用B2B2C模板让消费者跨设备购物体验无缝衔接?

在数字化浪潮席卷下&#xff0c;消费者的购物行为不再局限于单一设备。早晨用手机小程序浏览商品&#xff0c;中午在 PC 端对比参数&#xff0c;晚上通过平板下单&#xff0c;跨设备购物已成常态。然而&#xff0c;设备间数据不同步、操作体验割裂等问题&#xff0c;严重影响购…...

Redis Sentinel如何实现高可用?

Redis Sentinel 通过以下核心机制实现高可用&#xff1a; 1. 监控&#xff08;Monitoring&#xff09; Sentinel 集群会持续监控主节点&#xff08;Master&#xff09;和从节点&#xff08;Slave&#xff09;的状态&#xff1a; 定期发送 PING 命令检测节点是否存活&#xf…...

环形缓冲区 ring buffer 概述

环形缓冲区 ring buffer 概述 1. 简介 环形缓冲区&#xff08;ring buffer&#xff09;&#xff0c;是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构&#xff0c;适合缓存数据流。也称作环形缓冲区&#xff08;circular buffer&#xff09;&#xff0c;环形队列&…...

Spring源码之解决循环依赖 三级缓存

目录 三级缓存核心原理 循环依赖的解决过程 1. Bean A创建过程中提前曝光工厂 2. Bean B创建时发现依赖A&#xff0c;从缓存获取 3. Bean A继续完成初始化 三级缓存的作用总结 二级缓存为何不够解决缓存依赖&#xff1f; 三级缓存如何解决&#xff1f; 为什么不直接在…...

山东大学计算机图形学期末复习9——CG12上

CG12上 几何管线末端&#xff1a;顶点已组装成基本图元&#xff08;Primitives&#xff0c;如点、线、三角形&#xff09;。 主要任务&#xff1a; 裁剪&#xff1a;视锥体是一个三维空间区域&#xff08;由近裁剪面、远裁剪面和侧面组成&#xff09;&#xff0c;超出该区域的图…...

关于软件测试开发的一些有趣的知识

文章目录 一、什么是测试&#xff1f;二、为什么要软件测试软件测试三、测试的岗位有哪些四 、软件测试和开发的区别五、走测试岗位为什么还要学开发。4、优秀的测试人员具备的素质我为什么走测试岗位 一、什么是测试&#xff1f; 其实这个问题说简单也不简单&#xff0c;说难…...

在Solana上使用 Scaled UI Amount 扩展

本指南提供 Solana Web3.js (Legacy v 1.x) 和 Solana Kit (v 2.x) 版本。选择适当的选项卡以查看你首选库的代码片段和说明&#xff1a; Solana Web3.js (Legacy)Solana Kit 概述 Solana Token-2022 程序 引入了强大的扩展&#xff0c;增强了代币功能&#xff0c;使其超越了…...

线性表之数组与栈详解

线性表之数组与栈详解 前言一、数组&#xff08;Array&#xff09;1.1 数组的基本概念1.2 数组的实现与操作1.3 数组的应用场景1.4 数组的优缺点 二、栈&#xff08;Stack&#xff09;2.1 栈的基本概念2.2 栈的实现方式2.3 栈的应用场景 2.4 栈的优缺点 三、数组与栈的对比总结…...

车载以太网驱动智能化:域控架构设计与开发实践

title: 车载以太网驱动专用车智能化&#xff1a;域控架构设计与开发实践 date: 2023-12-01 categories: 新能源汽车 tags: [车载以太网, 电子电气架构, 域控架构, 专用车智能化, SOME/IP, AUTOSAR] 引言&#xff1a;专用车智能化转型的挑战与机遇 专用车作为城市建设与工业运输…...

【Redis】redis用作缓存和分布式锁

文章目录 1. 缓存1.1 Redis作为缓存1.2 缓存更新、淘汰策略1.3 缓存预热、缓存穿透、缓存雪崩和缓存击穿1.3.1 缓存预热&#xff08;preheating&#xff09;1.3.2 缓存穿透&#xff08;penetration&#xff09;1.3.3 缓存雪崩&#xff08;avalanche&#xff09;1.3.4 缓存击穿&…...

深度学习中独热编码(One-Hot Encoding)

文章目录 独热编码独热编码的作用独热编码的优点独热编码的缺点场景选择独热编码&#xff08;PyTorch实现&#xff09;替代方案 实际使用分析&#xff1a;对对象类型使用独热编码为什么使用独热编码是合适的&#xff1f;&#x1f4cc; 场景说明&#xff1a;&#x1f4cc; 为什么…...

如何根据竞价数据判断竞价强度,是否抢筹等

竞价强度判断方法 价格变化幅度 观察开盘价与前一交易日收盘价的差距 &#xff1a;如果一只股票在开盘集合竞价阶段价格大幅高于前一交易日收盘价&#xff0c;说明市场对该股票的预期较为积极&#xff0c;可能有资金在主动抬高价格&#xff0c;这是一种较强的竞价强度表现。例如…...

Codex与LangChain结合的智能代理架构:重塑软件开发的未来

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言:当代码生成遇见智能决策 想象以下场景: 凌晨三点:你需要紧急修复一个遗留系统的内存泄漏漏洞,但代码注释缺失且逻辑复杂; 产品经理需求变更:要求在24小时内将现有…...

2025年PMP 学习十八 第11章 项目风险管理 (11.5~11.7)

2025年PMP 学习十八 第11章 项目风险管理 &#xff08;11.5~11.7&#xff09; 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 文章目录 2025年PMP 学习十八…...

2025年PMP 学习十七 第11章 项目风险管理 (11.1~11.4)

2025年PMP 学习十七 第11章 项目风险管理 &#xff08;11.1~11.4&#xff09; 第11章 项目风险管理 序号过程过程组1规划风险管理规划2识别风险规划3实施定性风险分析规划4实施定量风险分析规划5规划风险应对执行6实施风险应对执行7监控风险监控 文章目录 2025年PMP 学习十七…...

impala

Impala&#xff0c;它是 Cloudera 开发的开源 实时 SQL 查询引擎&#xff0c;专为 Hadoop 设计。与 Presto 类似&#xff0c;Impala 用于交互式分析&#xff0c;但架构和设计理念有所不同。以下是 Impala 的核心特点和工作原理&#xff1a; 一、Impala 核心架构 1. 组件组成 …...

湖北理元理律师事务所:债务优化中的双维支持实践解析

在债务压力与生活质量失衡的社会议题下&#xff0c;法律服务机构的功能边界正在从单一的法律咨询向复合型支持延伸。湖北理元理律师事务所通过“法律心理”双维服务模式&#xff0c;探索债务优化与生活保障的平衡路径&#xff0c;其方法论或为行业提供实践参考。 法律框架&…...

Redis设计与实现——Redis命令参考与高级特性

Redis命令参考 数据类型相关命令 SET&#xff1a;设置键值&#xff0c;支持过期时间、不存在/存在条件。GET&#xff1a;获取键值&#xff0c;若键不存在返回 nil。INCR/DECR&#xff1a;将键的整数值增1/减1&#xff0c;键不存在时初始化为0。MSET/MGET&#xff1a;批量设置…...

TCP/UDP协议原理和区别 笔记

从简单到难吧 区别就是TCP一般用于安全稳定的需求&#xff0c;UDP一般用于不那么需要完全数据的需求&#xff0c;比如说直播&#xff0c;视频等。 再然后就是TPC性能慢于UDP。 再然后我们看TCP的原理&#xff08;三次握手&#xff0c;数据传输&#xff0c;四次挥手&#xff0…...

JavaScript基础-对象的相关概念

在JavaScript中&#xff0c;对象是核心的数据结构之一&#xff0c;几乎所有的高级功能都围绕着对象展开。理解对象的基本概念、创建方法以及操作方式对于掌握JavaScript至关重要。本文将详细介绍JavaScript中对象的相关概念&#xff0c;包括对象的定义、属性的操作、原型链和面…...

如何通过交流沟通实现闭环思考模式不断实现自身强效赋能-250517

感谢一直以来和我交流沟通的朋友们。 闭环思考 文字部分&#xff08;25-05-04&#xff09;这一天是青年节&#xff0c;在这一天与青年朋友交流这个是事先规划好的&#xff1a; “可以猜一猜&#xff0c;博士会被撤销吗&#xff1f;导师会被处理吗&#xff1f;千万不要回复&…...

震荡指标工具

一、引言 - 可视化数字烛台工具是对传统蜡烛图的补充&#xff0c;旨在帮助交易者更有效地进入和退出交易&#xff0c;提高交易利润。 - 通过分析蜡烛图&#xff0c;结合烛台震荡指标&#xff0c;提出了一个辅助视觉工具来辅助交易决策。 二、烛台指标与交易策略 -图表通过平均开…...

【自然语言处理与大模型】大模型(LLM)基础知识④

&#xff08;1&#xff09;微调主要用来干什么&#xff1f; 微调目前最主要用在定制模型的自我认知和改变模型对话风格。模型能力的适配与强化只是辅助。 定制模型的自我认知&#xff1a;通过微调可以调整模型对自我身份、角色功能的重新认知&#xff0c;使其回答更加符合自定义…...