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

Transformer完整实现及注释

主要组件:

  1. Multi-Head Self-Attention (多头自注意力)
  2. Position Encoding (位置编码)
  3. Feed Forward Network (前馈神经网络)
  4. Encoder/Decoder Layer (编码器/解码器层)
  5. Complete Transformer Model (完整模型)
    """

import torch
import torch.nn as nn
import torch.nn.functional as F
import math
import numpy as np

class MultiHeadAttention(nn.Module):
"""
多头自注意力机制 (Multi-Head Self-Attention)

核心思想:
- 将输入投影到Q、K、V三个矩阵
- 计算注意力权重:Attention(Q,K,V) = softmax(QK^T/√d_k)V
- 多个注意力头并行计算,捕获不同位置和表示子空间的信息
"""def __init__(self, d_model, n_heads, dropout=0.1):"""Args:d_model: 模型维度 (通常512或768)n_heads: 注意力头数 (通常8或12)dropout: dropout概率"""super(MultiHeadAttention, self).__init__()# 确保d_model能被n_heads整除assert d_model % n_heads == 0self.d_model = d_modelself.n_heads = n_headsself.d_k = d_model // n_heads  # 每个头的维度# 线性变换层:将输入投影到Q、K、V# 注意:这里用一个大矩阵同时计算所有头的QKV,更高效self.w_q = nn.Linear(d_model, d_model, bias=False)self.w_k = nn.Linear(d_model, d_model, bias=False) self.w_v = nn.Linear(d_model, d_model, bias=False)# 输出投影层self.w_o = nn.Linear(d_model, d_model)self.dropout = nn.Dropout(dropout)# 缩放因子,防止softmax饱和self.scale = math.sqrt(self.d_k)def forward(self, query, key, value, mask=None):"""Args:query: [batch_size, seq_len, d_model]key: [batch_size, seq_len, d_model] value: [batch_size, seq_len, d_model]mask: [batch_size, seq_len, seq_len] 注意力掩码Returns:output: [batch_size, seq_len, d_model]attention_weights: [batch_size, n_heads, seq_len, seq_len]"""batch_size, seq_len, d_model = query.size()# 1. 线性变换得到Q、K、VQ = self.w_q(query)  # [batch_size, seq_len, d_model]K = self.w_k(key)    # [batch_size, seq_len, d_model]V = self.w_v(value)  # [batch_size, seq_len, d_model]# 2. 重塑为多头形式# 注意:Q, K, V的序列长度可能不同(特别是在交叉注意力中)q_seq_len = query.size(1)k_seq_len = key.size(1)v_seq_len = value.size(1)Q = Q.view(batch_size, q_seq_len, self.n_heads, self.d_k)K = K.view(batch_size, k_seq_len, self.n_heads, self.d_k)V = V.view(batch_size, v_seq_len, self.n_heads, self.d_k)# 转置以便矩阵乘法: [batch_size, n_heads, seq_len, d_k]Q = Q.transpose(1, 2)K = K.transpose(1, 2)V = V.transpose(1, 2)# 3. 计算注意力attention_output, attention_weights = self.scaled_dot_product_attention(Q, K, V, mask, self.scale)# 4. 拼接多头结果# [batch_size, n_heads, q_seq_len, d_k] -> [batch_size, q_seq_len, n_heads, d_k]attention_output = attention_output.transpose(1, 2).contiguous()# [batch_size, q_seq_len, n_heads, d_k] -> [batch_size, q_seq_len, d_model]attention_output = attention_output.view(batch_size, q_seq_len, d_model)# 5. 输出投影output = self.w_o(attention_output)return output, attention_weightsdef scaled_dot_product_attention(self, Q, K, V, mask, scale):"""缩放点积注意力核心计算公式:Attention(Q,K,V) = softmax(QK^T/√d_k)V"""# 计算注意力分数:QK^T# [batch_size, n_heads, seq_len, d_k] × [batch_size, n_heads, d_k, seq_len]# = [batch_size, n_heads, seq_len, seq_len]attention_scores = torch.matmul(Q, K.transpose(-2, -1)) / scale# 应用掩码(如果提供)if mask is not None:# 将掩码位置的分数设为很小的负数,softmax后接近0attention_scores = attention_scores.masked_fill(mask == 0, -1e9)# 计算注意力权重attention_weights = F.softmax(attention_scores, dim=-1)# 只在训练时应用dropoutif self.training:attention_weights = self.dropout(attention_weights)# 应用注意力权重到V# [batch_size, n_heads, seq_len, seq_len] × [batch_size, n_heads, seq_len, d_k]# = [batch_size, n_heads, seq_len, d_k]attention_output = torch.matmul(attention_weights, V)return attention_output, attention_weights

class PositionalEncoding(nn.Module):
"""
位置编码 (Positional Encoding)

由于Transformer没有循环或卷积结构,需要显式地给序列添加位置信息
使用sin/cos函数生成固定的位置编码公式:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
"""def __init__(self, d_model, max_seq_len=5000):"""Args:d_model: 模型维度max_seq_len: 支持的最大序列长度"""super(PositionalEncoding, self).__init__()# 创建位置编码矩阵pe = torch.zeros(max_seq_len, d_model)# 位置索引 [0, 1, 2, ..., max_seq_len-1]position = torch.arange(0, max_seq_len, dtype=torch.float).unsqueeze(1)# 计算除数项:10000^(2i/d_model)div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))# 应用sin和cospe[:, 0::2] = torch.sin(position * div_term)  # 偶数位置用sinpe[:, 1::2] = torch.cos(position * div_term)  # 奇数位置用cos# 添加batch维度并注册为buffer(不参与梯度更新)pe = pe.unsqueeze(0)  # [1, max_seq_len, d_model]self.register_buffer('pe', pe)def forward(self, x):"""Args:x: [batch_size, seq_len, d_model]Returns:x + positional_encoding: [batch_size, seq_len, d_model]"""# 取出对应长度的位置编码并加到输入上seq_len = x.size(1)return x + self.pe[:, :seq_len, :]

class FeedForward(nn.Module):
"""
前馈神经网络 (Feed Forward Network)

结构:Linear -> ReLU -> Linear
通常中间层维度是输入的4倍(如512->2048->512)
"""def __init__(self, d_model, d_ff, dropout=0.1):"""Args:d_model: 输入/输出维度d_ff: 中间层维度(通常是d_model的4倍)dropout: dropout概率"""super(FeedForward, self).__init__()self.linear1 = nn.Linear(d_model, d_ff)self.linear2 = nn.Linear(d_ff, d_model)self.dropout = nn.Dropout(dropout)def forward(self, x):"""Args:x: [batch_size, seq_len, d_model]Returns:output: [batch_size, seq_len, d_model]"""# Linear -> ReLU -> Dropout -> Linearreturn self.linear2(self.dropout(F.relu(self.linear1(x))))

class EncoderLayer(nn.Module):
"""
Transformer编码器层

结构:
1. Multi-Head Self-Attention + 残差连接 + LayerNorm
2. Feed Forward + 残差连接 + LayerNorm
"""def __init__(self, d_model, n_heads, d_ff, dropout=0.1):super(EncoderLayer, self).__init__()self.self_attention = MultiHeadAttention(d_model, n_heads, dropout)self.feed_forward = FeedForward(d_model, d_ff, dropout)# Layer Normalizationself.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)def forward(self, x, mask=None):"""Args:x: [batch_size, seq_len, d_model]mask: 注意力掩码Returns:output: [batch_size, seq_len, d_model]"""# 1. Self-Attention + 残差连接 + LayerNormattn_output, _ = self.self_attention(x, x, x, mask)x = self.norm1(x + self.dropout(attn_output))# 2. Feed Forward + 残差连接 + LayerNorm  ff_output = self.feed_forward(x)x = self.norm2(x + self.dropout(ff_output))return x

class DecoderLayer(nn.Module):
"""
Transformer解码器层

结构:
1. Masked Multi-Head Self-Attention + 残差 + LayerNorm
2. Multi-Head Cross-Attention + 残差 + LayerNorm  
3. Feed Forward + 残差 + LayerNorm
"""def __init__(self, d_model, n_heads, d_ff, dropout=0.1):super(DecoderLayer, self).__init__()self.self_attention = MultiHeadAttention(d_model, n_heads, dropout)self.cross_attention = MultiHeadAttention(d_model, n_heads, dropout)self.feed_forward = FeedForward(d_model, d_ff, dropout)self.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)self.norm3 = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)def forward(self, x, encoder_output, src_mask=None, tgt_mask=None):"""Args:x: 解码器输入 [batch_size, tgt_len, d_model]encoder_output: 编码器输出 [batch_size, src_len, d_model]src_mask: 源序列掩码tgt_mask: 目标序列掩码(下三角掩码)Returns:output: [batch_size, tgt_len, d_model]"""# 1. Masked Self-Attention(防止看到未来信息)self_attn_output, _ = self.self_attention(x, x, x, tgt_mask)x = self.norm1(x + self.dropout(self_attn_output))# 2. Cross-Attention(解码器attend到编码器输出)cross_attn_output, _ = self.cross_attention(x, encoder_output, encoder_output, src_mask)x = self.norm2(x + self.dropout(cross_attn_output))# 3. Feed Forwardff_output = self.feed_forward(x)x = self.norm3(x + self.dropout(ff_output))return x

class Transformer(nn.Module):
"""
完整的Transformer模型

包含:
- 输入嵌入 + 位置编码
- N层编码器
- N层解码器  
- 输出线性层
"""def __init__(self, src_vocab_size, tgt_vocab_size, d_model=512, n_heads=8, n_layers=6, d_ff=2048, max_seq_len=5000, dropout=0.1):"""Args:src_vocab_size: 源语言词汇表大小tgt_vocab_size: 目标语言词汇表大小d_model: 模型维度n_heads: 注意力头数n_layers: 编码器/解码器层数d_ff: 前馈网络中间层维度max_seq_len: 最大序列长度dropout: dropout概率"""super(Transformer, self).__init__()self.d_model = d_model# 词嵌入层self.src_embedding = nn.Embedding(src_vocab_size, d_model)self.tgt_embedding = nn.Embedding(tgt_vocab_size, d_model)# 位置编码self.positional_encoding = PositionalEncoding(d_model, max_seq_len)# 编码器层self.encoder_layers = nn.ModuleList([EncoderLayer(d_model, n_heads, d_ff, dropout) for _ in range(n_layers)])# 解码器层self.decoder_layers = nn.ModuleList([DecoderLayer(d_model, n_heads, d_ff, dropout)for _ in range(n_layers)])# 输出投影层self.output_projection = nn.Linear(d_model, tgt_vocab_size)self.dropout = nn.Dropout(dropout)# 参数初始化self.init_parameters()def init_parameters(self):"""Xavier初始化"""for p in self.parameters():if p.dim() > 1:nn.init.xavier_uniform_(p)def encode(self, src, src_mask=None):"""编码器前向传播Args:src: 源序列 [batch_size, src_len]src_mask: 源序列掩码Returns:encoder_output: [batch_size, src_len, d_model]"""# 词嵌入 + 位置编码src_emb = self.src_embedding(src) * math.sqrt(self.d_model)src_emb = self.positional_encoding(src_emb)src_emb = self.dropout(src_emb)# 通过编码器层encoder_output = src_embfor encoder_layer in self.encoder_layers:encoder_output = encoder_layer(encoder_output, src_mask)return encoder_outputdef decode(self, tgt, encoder_output, src_mask=None, tgt_mask=None):"""解码器前向传播Args:tgt: 目标序列 [batch_size, tgt_len]encoder_output: 编码器输出 [batch_size, src_len, d_model]src_mask: 源序列掩码tgt_mask: 目标序列掩码Returns:decoder_output: [batch_size, tgt_len, d_model]"""# 词嵌入 + 位置编码tgt_emb = self.tgt_embedding(tgt) * math.sqrt(self.d_model)tgt_emb = self.positional_encoding(tgt_emb)tgt_emb = self.dropout(tgt_emb)# 通过解码器层decoder_output = tgt_embfor decoder_layer in self.decoder_layers:decoder_output = decoder_layer(decoder_output, encoder_output, src_mask, tgt_mask)return decoder_outputdef forward(self, src, tgt, src_mask=None, tgt_mask=None):"""完整前向传播Args:src: 源序列 [batch_size, src_len]tgt: 目标序列 [batch_size, tgt_len]src_mask: 源序列掩码tgt_mask: 目标序列掩码Returns:output: [batch_size, tgt_len, tgt_vocab_size]"""# 编码encoder_output = self.encode(src, src_mask)# 解码decoder_output = self.decode(tgt, encoder_output, src_mask, tgt_mask)# 输出投影output = self.output_projection(decoder_output)return output

def create_padding_mask(seq, pad_idx=0):
"""
创建padding掩码,遮蔽padding位置

Args:seq: [batch_size, seq_len]pad_idx: padding token的索引Returns:mask: [batch_size, 1, 1, seq_len]
"""
mask = (seq != pad_idx).unsqueeze(1).unsqueeze(2)
return mask

def create_look_ahead_mask(seq_len):
"""
创建下三角掩码,防止解码器看到未来信息

Args:seq_len: 序列长度Returns:mask: [1, 1, seq_len, seq_len]
"""
mask = torch.tril(torch.ones(seq_len, seq_len))
return mask.unsqueeze(0).unsqueeze(0)

使用示例和训练代码

if name == "main":
# 模型参数
src_vocab_size = 10000
tgt_vocab_size = 10000
d_model = 512
n_heads = 8
n_layers = 6
d_ff = 2048
max_seq_len = 100

# 创建模型
model = Transformer(src_vocab_size=src_vocab_size,tgt_vocab_size=tgt_vocab_size,d_model=d_model,n_heads=n_heads,n_layers=n_layers,d_ff=d_ff,max_seq_len=max_seq_len
)print(f"模型参数量: {sum(p.numel() for p in model.parameters()):,}")# 模拟数据
batch_size = 32
src_len = 20
tgt_len = 25src = torch.randint(1, src_vocab_size, (batch_size, src_len))
tgt = torch.randint(1, tgt_vocab_size, (batch_size, tgt_len))# 创建掩码
src_mask = create_padding_mask(src)
tgt_mask = create_look_ahead_mask(tgt_len) & create_padding_mask(tgt)# 前向传播
with torch.no_grad():output = model(src, tgt, src_mask, tgt_mask)print(f"输出形状: {output.shape}")  # [batch_size, tgt_len, tgt_vocab_size]# 简单训练循环示例
criterion = nn.CrossEntropyLoss(ignore_index=0)  # 忽略padding
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)model.train()
for epoch in range(3):# 前向传播output = model(src, tgt[:, :-1], src_mask, tgt_mask[:, :, :-1, :-1])# 计算损失(预测下一个token)target = tgt[:, 1:].contiguous().view(-1)output = output.contiguous().view(-1, tgt_vocab_size)loss = criterion(output, target)# 反向传播optimizer.zero_grad()loss.backward()# 梯度裁剪(防止梯度爆炸)torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)optimizer.step()print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")print("\n=== Transformer模型实现完成 ===")

相关文章:

Transformer完整实现及注释

主要组件:Multi-Head Self-Attention (多头自注意力) Position Encoding (位置编码) Feed Forward Network (前馈神经网络) Encoder/Decoder Layer (编码器/解码器层) Complete Transformer Model (完整模型) """import torch import torch.nn as nn import to…...

数据策略与模型算法

数据策略与模型算法数据工程师:更多关心「基建」的问题,比如,数据链路如何构建、如何做技术选型、效率稳定性如何保障等等。 算法工程师:更多关心「模型」的问题,比如,具体某个算法是什么原理,如何调参等等。 数据分析师:运用工具解决「端到端」的问题,包括「问题抽象…...

25fall-cs101 作业图床 - Amy

...

在使用代理的时候,可以使用更简单的C++语法代替FGameplayAttribute代理,使用TStaticFuncPtr T

DECLARE_DELEGATE_REVAL(FGameplayAttribute, FAttributeSignature); 比如这里的代理 定义为FAttributeSignature AttributeSignature ;但是可以不生命代理,直接声明 TBaseStaticDelegateInstance<FGameplayAttribute(), FDefaultDelegateUserPolicy>::FFuncPtr它代表…...

从 url 到 PPT 一键生成:Coze 工作流,颠覆你的内容创作方式!

完整内容:从 url 到 PPT 一键生成:Coze 工作流,颠覆你的内容创作方式!你是否曾在面对大量文章资料,却要在短时间内将其精华提炼并制作成演示文稿时,感到焦头烂额、无从下手?一页页翻阅文章,手动摘取要点,再逐一编排进 PPT,整个过程繁琐又耗时,效率低下不说,最终呈现…...

[WPF学习笔记]多语言切换-001

1、VS2019新建项目2、引入Nuget包 3、修改XML代码引入命名空间并设置<Window x:Class="WPFMultiLanguageTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/…...

Shell 语法摘要

sed 的使用 sed 的全称是 Stream Editor,即流编辑器。它可以逐行处理输入数据(先将读入的行放到缓冲区中,对缓冲区里的内容进行处理),并将处理结果输出到标准输出。 格式:sed [选项] [address]{脚本命令(块)} 文件名 前缀 address 可以是数字或者文本(正则),格式:[addr…...

软件设计师知识点总结(一)

一、Linux目录与Windows目录区别 Linux的目录结构是一个树型结构 Windows 系统 可以拥有多个盘符, 如 C盘、D盘、E盘 Linux 没有盘符 这个概念, 只有一个根目录 /, 所有文件都在它下面 二、常见目录介绍(记住重点)目录作用/bin二进制命令所在的目录(普通命令 => 普通用户…...

智能引擎驱动:DRS.Editor让汽车诊断设计效率跃升!

在汽车电子诊断数据管理领域,用户普遍依赖传统的线下 Excel 管理模式,这种离线、文件化的方式常常导致数据分散、版本混乱、共享困难、复用率低,正成为制约开发效率与质量的瓶颈,并带来以下痛点:校验低效易错:诊断数据编写不规范,合法性、逻辑性及完整性校验效率低,易出…...

【译】Visual Studio 2026 Insider 来了!

Visual Studio 2026 Insider 现已发布 —— 这标志着我们在这款 IDE 上迈出了最具雄心的一步。此版本将人工智能直接融入开发者的工作流程,性能方面的改进重新树立了企业级规模下对速度的预期,而现代化的设计则让整个开发环境感觉更轻盈、更专注。并且,我们首次推出了全新的…...

GAS_Aura-Granting Abilities

1...

CH584 CH585 触摸应用介绍一

1、提供的资料工程和功能介绍 | | | |-- TOUCH | | | | |-- TKYLIB:触摸库文件及其头文件 | | | | |-- Touch_EX001:触摸应用的综合演示,包括触摸滑条、触摸滑环、触摸按键和隔空感应四种触摸应用,配合EVB使用。 | | …...

OpenEuler 24.03 (LTS-SP2)安装最新版本docker

OpenEuler 24.03系统默认安装的docker版本是18.09,该版本有重大bug,所以鉴于此安装最新版本docker。 一、配置 Docker 仓库 首先,需要设置 Docker 的官方仓库,和替换为国内的镜像源。 1.安装必要的包:sudo dnf install -y dnf-utils2.设置稳定的仓库: docker官方没有明确…...

西门子SINAMICS S120伺服驱动系统介绍

SINAMICS S120是集V/F、矢量控制及伺服控制于一体的驱动控制系统,可以控制普通的三相异步电动机,还能控制同步电机、扭矩电机及直线电机,属于高性能驱动,是西门子SINAMICS M1级产品。S120产品特点“高度灵活”的模块化设计 允许不同功率等级与控制性能的单元自由组合,所有…...

第10章 STM32 模拟SPI电阻屏触摸配置和测试

前言 硬件的配置由前面的工程递增,会根据目的修改部分控制代码 由于本人较懒,记录主要是过程,原理性的东西网上一大把,我就不赘述了,由于懒,主要由图片和代码加少量文字组成 源码地址https://gitcode.com/qq_36517072/stm32,第x章为cx文件夹一、STM32CUBE配置修改 带的2…...

ABAP同步和异步

在保存增强触发其他单据生成或者自建表保存需要COMMIT WORK 时候使用STARTING NEW TASK 优势是在新会话中提交:在这个新的、独立的上下文中执行 COMMIT WORK,只会提交该 RFC 函数内部自身的数据库操作,而不会影响到主增强程序所在的事务上下文。主程序的数据库更改仍会等待…...

202208_网鼎杯青龙组_CRYPTO

MD5,爆破Tags:MD5,爆破 0x00. 题目 小A鼓起勇气向女神索要电话号码,但女神一定要考考他。女神说她最近刚看了一篇发表于安全顶会USENIX Security 2021的论文,论文发现苹果AirDrop隔空投送功能的漏洞,该漏洞可以向陌生人泄露AirDrop发起者或接收者的电话号码和电子邮箱。小A经…...

Oracle笔记:11GR2 datagruad 环境搭建BORKER

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Oracle笔记:11GR2 datagruad 环境搭建BORKER 公司所有的DG环境都用到了…...

GAS_Aura-Gameplay Abilities

1简单说明了下GAS运行的情景...

领域驱动设计(DDD)【23】之泛化:从概念到实践

文章目录 一 泛化基础&#xff1a;理解DDD中的核心抽象机制1.1 什么是泛化&#xff1f;1.2 为什么泛化在DDD中重要&#xff1f;1.3 泛化与特化的双向关系 二 DDD中泛化的实现形式2.0 实现形式概览2.1 类继承&#xff1a;最直接的泛化实现2.2 接口实现&#xff1a;更灵活的泛化方…...

零基础langchain实战二:大模型输出格式化成json

零基础langchain实战一&#xff1a;模型、提示词和解析器-CSDN博客 书接上文 大模型输出格式化 在下面例子中&#xff1a;我们需要将大模型的输出格式化成json。 import os from dotenv import load_dotenvload_dotenv() # 加载 .env 文件 api_key os.getenv("DEEPS…...

Python 数据分析:numpy,抽提,整数数组索引

目录 1 代码示例2 欢迎纠错3 免费爬虫------以下关于 Markdown 编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个…...

在项目中如何巧妙使用缓存

缓存 对于经常访问的数据&#xff0c;每次都从数据库&#xff08;硬盘&#xff09;中获取是比较慢&#xff0c;可以利用性能更高的存储来提高系统响应速度&#xff0c;俗称缓存 。合理使用缓存可以显著降低数据库的压力、提高系统性能。 那么&#xff0c;什么样的数据适合缓存…...

C语言字符串

字符串是C语言最核心的概念之一&#xff0c;却也是引发最多Bug的领域。掌握它&#xff0c;你将解锁高效处理文本的能力&#xff1b;忽视细节&#xff0c;则可能陷入内存陷阱。 一、字符串的本质&#xff1a;字符数组 核心规则&#xff1a;C语言用\0&#xff08;ASCII值0&#…...

HarmonyOS NEXT仓颉开发语言实战案例:图片预览器

上文分享了如何使用仓颉语言实现动态广场&#xff0c;动态广场中有很多图片&#xff0c;本文一下如何使用仓颉语言实现一个图片放大预览器&#xff1a; 看到这个效果&#xff0c;我首先想到的实现方案是弹窗&#xff0c;弹窗的弹出和消失效果为我们节省了很多工作&#xff0c;这…...

Rust代码规范之蛇形命名法和驼峰命名法

Rust 使用两种主要的命名风格&#xff1a;驼峰命名法&#xff08;UpperCamelCase&#xff09;和蛇形命名法&#xff08;snake_case&#xff09;。通常&#xff0c;类型&#xff08;如结构体、枚举、特征&#xff09;使用驼峰命名法&#xff0c;而变量、函数、方法等使用蛇形命名…...

cocos creator 3.8 - 精品源码 - 六边形消消乐(六边形叠叠乐、六边形堆叠战士)

cocos creator 3.8 - 精品源码 - 六边形消消乐 游戏介绍功能介绍免费体验下载开发环境游戏截图免费体验 游戏介绍 六边形堆叠战士(六边形消消消)是一款脱胎于2048、1010&#xff0c;基于俄罗斯方块的魔性方块达人小游戏&#xff0c;可以多方向多造型消除哦&#xff01; 功能介…...

(七)Spring Web

Spring Web 是 Spring Framework 的一部分&#xff0c;专门用于构建 Web 应用程序。Spring Web 提供了一个强大的基础设施&#xff0c;用于开发 Web 服务、Web 应用程序和 RESTful API。它包括许多模块和组件&#xff0c;帮助开发人员轻松地构建、配置和管理 Web 应用程序。 以…...

计算机操作系统(十七)内存管理

计算机操作系统&#xff08;十七&#xff09;内存管理 前言一、内存的使用与程序重定位&#xff08;一&#xff09;内存是什么&#xff1f;&#xff08;二&#xff09;程序的重定位过程&#xff08;三&#xff09;总结&#xff1a;内存使用的核心问题 二、连续分区管理&#xf…...

Java 大视界 -- Java 大数据机器学习模型在金融市场高频交易策略优化与风险控制中的应用(327)

Java 大视界 -- Java 大数据机器学习模型在金融市场高频交易策略优化与风险控制中的应用&#xff08;327&#xff09; 引言&#xff1a;正文&#xff1a;一、Java 驱动的高频交易数据处理架构1.1 边缘 - 中心协同数据接入系统&#xff08;SEC 17a-4 合规&#xff09;1.2 多市场…...

Idea 项目远程开发 Remote Development

个人建议&#xff1a;Remote Development 使用体验不佳&#xff0c;不推荐。实际远程开发受限于网络通信速度&#xff0c;在开发时&#xff0c;基本无法SSH更新项目内容。 1. File -> Remote Development 2. New Connection Connect to SSH Connection 3. Project director…...

【驱动设计的硬件基础】CPLD和FPGA

在数字电路设计领域&#xff0c;CPLD&#xff08;复杂可编程逻辑器件&#xff09;和 FPGA&#xff08;现场可编程门阵列&#xff09;堪称 “变形金刚” 般的存在。它们既能像 ASIC&#xff08;专用集成电路&#xff09;一样实现硬件加速&#xff0c;又能通过软件编程快速迭代功…...

JavaScript中Object()的解析与应用

在JavaScript中&#xff0c;Object() 是一个基础构造函数&#xff0c;用于创建对象或转换值为对象类型。它既是语言的核心组成部分&#xff0c;也提供了一系列静态方法用于对象操作。以下是详细解析和应用示例&#xff1a; 一、Object() 的基本行为 作为构造函数&#xff08;…...

Spring Cloud 微服务(负载均衡策略深度解析)

&#x1f4cc; 摘要 在微服务架构中&#xff0c;负载均衡是实现高可用、高性能服务调用的关键机制之一。Spring Cloud 提供了基于客户端的负载均衡组件 Ribbon&#xff0c;结合 Feign 和 OpenFeign&#xff0c;实现了服务间的智能路由与流量分配。 本文将深入讲解 Spring Clo…...

从单体架构到微服务:微服务架构演进与实践

一、单体架构的困境与演进 &#xff08;一&#xff09;单体应用的初始优势与演进路径 在系统发展的初期&#xff0c;单体架构凭借其简单性和开发效率成为首选。单体应用将整个系统的所有功能模块整合在一个项目中&#xff0c;以单一进程的方式运行&#xff0c;特别适合小型系…...

Infineon AURIX TriCore TC3xx芯片内存专题报告

作者: DBGAUTOMAN 日期: 2025-06-28 摘要 本报告旨在深入分析Infineon AURIX TriCore TC3xx系列微控制器的内存架构。通过对官方技术文档的系统性研究,报告详细阐述了TC3xx的内存配置、架构设计、存储器技术特性、系统级内存管理以及性能优化策略,为相关技术开发和系统设计…...

WPF中获取主窗体

在WPF的MVVM模式中&#xff0c;通常不直接引用主窗体&#xff08;MainWindow&#xff09;&#xff0c;而是通过依赖注入、事件聚合器或命令参数传递等方式实现逻辑解耦。以下是几种推荐方法&#xff1a; 方法1&#xff1a;依赖注入&#xff08;推荐&#xff09; 在ViewModel中…...

【龙泽科技】新能源汽车故障诊断仿真教学软件【吉利几何G6】

产品简介 新能源汽车故障诊断仿真教学软件是依托《全国职业院校技能大赛》“新能源汽车维修”赛项中“新能源汽车简单故障诊断与排除” 竞赛模块&#xff0c;自主开发的一款仿真教学软件。软件采用仿真技术模拟实际的新能源汽车故障诊断过程&#xff0c;主要通过对新能源汽车常…...

SpringBoot -- 以 jar 包运行(以及常见错误分析)

7.SpringBoot 以 jar 包运行 打包 在打包之前先要导入一个maven项目的打包插件&#xff0c;使用 springInitializr 创建的 maven 项目&#xff0c;已经自动导入了。如果没有需要手动导入。将下面代码&#xff0c;放进 Pom.xml 里面即可。 <build><plugins><p…...

求职招聘小程序源码招聘小程序搭建招聘小程序定制开发

身份&#xff1a;求职者、企业 求职者&#xff1a;完善简历&#xff0c;简历投递 企业&#xff1a;企业入驻&#xff0c;查看简历 企业会员&#xff1a;半年 、年度 权益&#xff1a;每日发布条数、刷新条数&#xff0c;简历下载数量 聊天&#xff1a;求职者可以和企业聊…...

Day44 预训练模型

目录 一、预训练的概念 二、常见的分类预训练模型 2.1 CNN架构预训练模型 2.2 Transformer类预训练模型 2.3 自监督预训练模型 三、图像预训练模型的发展史 四、预训练的策略 五、预训练代码实战&#xff1a;resnet18 六、尝试在cifar10对比alexnet 七、尝试通过ctrl进…...

【菜狗的记录】模糊聚类最大树、图神经网络、大模型量化——20250627

每日学习过程中记录的笔记&#xff0c;从各个网站整理下来&#xff0c;用于当日复盘。 如果其中的知识点能帮到你&#xff0c;也很荣幸呀。 -------------------------------------------------------20250622------------------------------------------------------------- …...

【Linux 设备模型框架 kobject 和 kset】

Linux 设备模型框架 kobject 和 kset 一、Linux 设备模型概述二、kobject 与 kset 的核心概念1. kobject2. kset3. 关键数据结构 三、kobject 与 kset 的实现源码四、源码解析与使用说明1. kset 的创建与初始化2. kobject 的创建与属性3. sysfs 属性操作4. 用户空间访问示例 五…...

leetcode.2014 重复k次的最长子序列

题目描述 解题思路 这一题本来在想怎么样做才能获得通用解&#xff0c;因为乍一看总感觉遍历的时间代价会非常高。直到后面看到提示&#xff1a; 提示里面专门包含了一个n < k * 8&#xff0c;这太反常了。后面仔细一想&#xff0c;有道理&#xff0c;最后答案的字符个数一定…...

机器学习3——参数估计之极大似然估计

参数估计 问题背景&#xff1a; P ( ω i ∣ x ) p ( x ∣ ω i ) P ( ω i ) p ( x ) p ( x ) ∑ j 1 c p ( x ∣ ω j ) P ( ω j ) \begin{aligned} & P\left(\omega_i \mid \mathbf{x}\right)\frac{p\left(\mathbf{x} \mid \omega_i\right) P\left(\omega_i\right)…...

利用python实现NBA数据可视化

大家好&#xff0c;今天我们利用python爬取NBA球星每年的比赛数据并进行可视化展示。主要用到三个模块&#xff1a;xpath、matplotlib。其中xpth负责爬取网站上的信息。Matplotlib是Python开发人员常用的Python绘图库&#xff0c;可以用来绘制各种2D图形&#xff0c;具有绘图质…...

杭州西湖断桥不断:3D扫描还原‘残雪‘视觉骗局

“断桥残雪”是西湖十景之一&#xff0c;所谓“视觉骗局”指的是在特定条件下&#xff0c;从远处看断桥仿佛断开的奇妙视觉效果。利用3D扫描技术还原这一效果可按以下步骤进行&#xff1a; 数据采集 3D扫描断桥&#xff1a;使用高精度的3D激光扫描仪对断桥及其周边环境进行全面…...

Dubbo服务调用超时问题解决方案

Dubbo服务调用超时问题解决方案 Dubbo服务调用超时通常由网络延迟、服务端性能瓶颈、配置不当或资源竞争引发。以下解决方案基于根本原因分类&#xff0c;优先采用高可信度实践&#xff1a; &#x1f50d; 一、排查问题根源 网络诊断 使用 ping、telnet 检查服务提供者网络连…...

视觉疲劳检测如何优化智能驾驶的险情管理

视觉分析疲劳检测在智能驾驶中的应用研究 一、背景与需求 近年来&#xff0c;智能驾驶领域因疲劳驾驶引发的交通事故频发&#xff0c;如2025年某品牌智能汽车因驾驶员疲劳导致高速追尾事件&#xff0c;暴露了现有技术对复杂场景的适应不足。传统疲劳检测依赖单一生理信号或车…...

C++ 第三阶段 并发与异步 - 第二节:异步任务(std::async)

目录 一、std::async 概述 1. std::async 的定义 二、std::async 的基本用法 1. 基本语法 (1) 函数调用 (2) Lambda 表达式 三、执行策略详解 1. std::launch::async 2. std::launch::deferred 3. 默认策略&#xff08;std::launch::any&#xff09; 四、std::futur…...