《深度学习实战》第4集:Transformer 架构与自然语言处理(NLP)
《深度学习实战》第4集:Transformer 架构与自然语言处理(NLP)
在自然语言处理(NLP)领域,Transformer 架构的出现彻底改变了传统的序列建模方法。它不仅成为现代 NLP 的核心,还推动了诸如 BERT、GPT 等预训练模型的发展。本集将带你深入了解 Transformer 的工作原理,并通过实战项目微调 BERT 模型完成情感分析任务。
1. 自注意力机制与多头注意力
1.1 自注意力机制(Self-Attention)
自注意力机制是 Transformer 的核心组件,它允许模型在处理输入序列时关注不同位置的相关性。以下是其工作原理:
- 输入嵌入:
- 输入序列被转换为词向量表示。
- 计算注意力权重:
- 通过查询(Query)、键(Key)和值(Value)矩阵计算注意力分数。
- 注意力分数公式:
- 加权求和:
- 根据注意力分数对值进行加权求和,得到上下文相关的表示。
1.2 多头注意力(Multi-Head Attention)
为了捕捉不同子空间中的特征,Transformer 使用多头注意力机制。每个“头”独立计算注意力,然后将结果拼接并线性变换。
2. Transformer 的编码器-解码器结构
Transformer 由编码器(Encoder)和解码器(Decoder)两部分组成:
2.1 编码器(Encoder)
- 编码器由多个相同的层堆叠而成,每层包含:
- 多头自注意力层:捕捉输入序列的全局依赖关系。
- 前馈神经网络(FFN):进一步提取特征。
- 残差连接与层归一化:稳定训练过程。
2.2 解码器(Decoder)
- 解码器同样由多层组成,但额外增加了:
- 掩码多头注意力(Masked Multi-Head Attention):防止未来信息泄露。
- 编码器-解码器注意力层:结合编码器输出生成目标序列。
好的!为了让你更好地理解 自注意力机制(Self-Attention) 和 多头注意力(Multi-Head Attention) 的底层结构和原理,我会用一个生活中的例子来类比,并逐步拆解它们的工作方式。
3. 自注意力机制:一场“会议讨论”的比喻
想象一下,你正在参加一场公司会议,会议的主题是“如何提高产品销量”。会议室里有几位同事,每个人都有自己的观点。你需要综合大家的意见,得出一个全面的结论。
3.1 每个人的观点
- 假设会议室里的每个人代表输入序列中的一个单词。
- 每个人的观点(比如市场分析、用户体验、技术改进等)就是这个单词的嵌入向量(Embedding Vector)。
3.2 问题来了:如何听取所有人的意见?
在会议中,你会根据每个人的发言内容,判断他们的观点对你当前思考的重要性。这就像自注意力机制的核心思想:计算每个单词对当前单词的相关性。
具体步骤:
-
准备材料(生成 Query、Key 和 Value):
- 每个人会准备三份材料:
- Query(提问):你想问的问题,比如“你的建议对我有什么帮助?”
- Key(关键词):每个人的核心观点,比如“市场分析”或“用户体验”。
- Value(具体内容):每个人的具体建议,比如“我们需要增加广告预算”。
- 这些材料通过线性变换(矩阵乘法)从原始观点(嵌入向量)生成。
- 每个人会准备三份材料:
-
打分(计算注意力分数):
- 你拿着自己的 Query,去和每个人提供的 Key 对比,看看谁的观点和你的问题最相关。
- 相关性通过点积计算,结果越大表示越相关。
- 计算公式:
[
\text{Attention Score} = \frac{\text{Query} \cdot \text{Key}}{\sqrt{d_k}}
]
(这里的 (\sqrt{d_k}) 是为了防止分数过大,保持数值稳定。)
-
加权求和(整合信息):
- 根据每个人的得分,计算权重(通过 softmax 归一化)。
- 然后,根据权重对每个人的 Value 进行加权求和,得到最终的结论。
3.3 总结:自注意力机制的作用
自注意力机制的核心是让每个单词都能“看到”整个句子中的其他单词,并根据它们的相关性调整自己的表示。这样,模型可以捕捉到全局的上下文信息。
4. 多头注意力:多个“视角”的讨论
回到刚才的会议场景,假设你不仅关心“如何提高产品销量”,还想知道“哪些用户群体最重要”、“竞争对手有哪些策略”等多个问题。这时,你可以邀请几个专家小组,分别从不同角度分析问题。
4.1 多个“专家小组”
- 每个专家小组相当于一个多头注意力的一个“头”。
- 每个小组会独立地进行讨论,生成自己的结论。
4.2 如何整合多个小组的意见?
- 每个小组的讨论结果(即每个头的输出)会被拼接在一起。
- 然后通过一个线性变换(矩阵乘法),将这些结果融合成一个最终的结论。
4.3 多头注意力的好处
- 不同的“头”可以关注输入的不同部分。例如:
- 一个头可能专注于语法关系(主语和谓语的联系)。
- 另一个头可能关注语义关系(情感或主题)。
- 通过多头注意力,模型可以从多个角度提取特征,从而更全面地理解输入。
图解:会议讨论与注意力机制的对应关系
会议讨论 | 注意力机制 |
---|---|
每个人的观点 | 输入序列中的单词嵌入向量 |
提问(Query) | 查询向量(Query Vector) |
关键词(Key) | 键向量(Key Vector) |
具体内容(Value) | 值向量(Value Vector) |
打分并加权求和 | 注意力分数计算 + 加权求和 |
多个专家小组分别讨论 | 多头注意力的多个“头” |
一个具体的例子:翻译句子
假设我们要翻译一句话:“The cat sat on the mat.”(猫坐在垫子上)。
自注意力机制的作用
- 当处理单词“cat”时,自注意力机制会让它“看到”整个句子。
- 它会发现“sat”和“mat”与自己高度相关,因为它们描述了猫的动作和位置。
多头注意力的作用
- 一个头可能专注于语法关系(“cat”是主语,“sat”是谓语)。
- 另一个头可能专注于语义关系(“cat”和“mat”之间存在空间关系)。
- 最终,这些信息被整合起来,帮助模型生成更准确的翻译。
关于自注意力机制和多头注意力的总结
- 自注意力机制:就像你在会议上听取每个人的意见,计算出谁的观点最重要,并据此做出决策。
- 多头注意力:就像你邀请多个专家小组,从不同角度分析问题,最后整合所有意见。
通过这种机制,Transformer 模型能够高效地捕捉输入序列中的全局依赖关系,从而在自然语言处理任务中表现出色。
5. BERT、GPT 等预训练模型的原理与应用
5.1 BERT(Bidirectional Encoder Representations from Transformers)
- 特点:
- 双向编码:同时考虑上下文信息。
- 预训练任务:
- Masked Language Model(MLM):预测被遮挡的单词。
- Next Sentence Prediction(NSP):判断句子对是否连续。
- 应用场景:
- 文本分类、命名实体识别、问答系统等。
5.2 GPT(Generative Pre-trained Transformer)
- 特点:
- 单向解码:从左到右生成文本。
- 基于自回归语言模型。
- 应用场景:
- 文本生成、对话系统、代码补全等。
6. 实战项目:使用 Hugging Face Transformers 微调 BERT 模型
我们将使用 Hugging Face 的 transformers
库微调 BERT 模型,完成情感分析任务。
6.1 数据准备
下载 SST-2数据集,链接如下:SST-2下载链接
import pandas as pd
from sklearn.model_selection import train_test_split
import os
from transformers import BertTokenizer, BertForSequenceClassification
import torch# 设置代理(如果需要)
# os.environ["HTTP_PROXY"] = "http://your_proxy:port"
# os.environ["HTTPS_PROXY"] = "http://your_proxy:port"# 设置离线模式,使用本地文件
# 定义文件路径(根据你的实际路径修改)
train_file = "SST-2/SST-2/train.tsv"
dev_file = "SST-2/SST-2/dev.tsv"
6.2 数据预处理
from transformers import BertTokenizer
# 使用 Pandas 读取 TSV 文件
try:train_data = pd.read_csv(train_file, sep='\t')test_data = pd.read_csv(dev_file, sep='\t')print("成功加载本地数据集")print(train_data.head())
except Exception as e:print(f"加载本地数据集失败: {e}")print("请确保数据文件路径正确")# 尝试加载本地分词器或使用备选方案
try:# 尝试从本地缓存加载cache_dir = "./models_cache"os.makedirs(cache_dir, exist_ok=True)# 使用本地缓存目录tokenizer = BertTokenizer.from_pretrained("bert-base-uncased", cache_dir=cache_dir,local_files_only=False, # 允许在线下载use_fast=True)print("成功加载分词器")
except OSError as e:print(f"无法加载BERT分词器: {e}")print("尝试使用备选方案...")# 备选方案:使用简单的分词方法from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer(max_features=10000)print("已切换到简单分词器 (CountVectorizer)")# 定义预处理函数
def preprocess_data(data):sentences = data["sentence"].tolist()labels = data["label"].tolist()try:# 如果BERT分词器加载成功if 'tokenizer' in locals():# 对句子进行分词和编码encodings = tokenizer(sentences,truncation=True,padding="max_length",max_length=128,return_tensors="pt")return encodings, labels, True # 返回True表示使用BERTelse:# 使用备选分词方法# 注意:这里只对训练数据进行fit_transformif 'vectorizer_fitted' not in globals():global vectorizer_fittedvectorizer_fitted = Truefeatures = vectorizer.fit_transform(sentences)else:# 对于测试数据,只进行transformfeatures = vectorizer.transform(sentences)return features, labels, False # 返回False表示使用备选方案except Exception as e:print(f"预处理数据时出错: {e}")return None, labels, False# 预处理训练集和测试集
if 'train_data' in locals() and 'test_data' in locals():print("开始预处理数据...")train_features, train_labels, using_bert = preprocess_data(train_data)test_features, test_labels, _ = preprocess_data(test_data)print("数据预处理完成")
6.3 模型定义与训练
import torch
from torch.utils.data import Dataset
import numpy as np
from sklearn.linear_model import LogisticRegressionclass SSTDataset(Dataset):def __init__(self, encodings, labels):self.encodings = encodingsself.labels = labelsself.is_bert_encoding = isinstance(encodings, dict)def __len__(self):if self.is_bert_encoding:return len(self.labels)else:return self.encodings.shape[0]def __getitem__(self, idx):if self.is_bert_encoding:item = {key: val[idx] for key, val in self.encodings.items()}item["labels"] = torch.tensor(self.labels[idx])return itemelse:# 对于非BERT编码,返回稀疏向量的密集表示和标签features = torch.tensor(self.encodings[idx].toarray()[0], dtype=torch.float)label = torch.tensor(self.labels[idx])return {"features": features, "labels": label}# 创建数据集实例
train_dataset = SSTDataset(train_features, train_labels)
test_dataset = SSTDataset(test_features, test_labels)# 根据使用的分词器选择不同的模型训练方法
if using_bert:from transformers import BertForSequenceClassification, Trainer, TrainingArguments# 加载预训练的 BERT 模型(用于二分类任务)model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)# 定义训练参数training_args = TrainingArguments(output_dir="./results", # 输出目录evaluation_strategy="epoch", # 每个 epoch 后评估模型per_device_train_batch_size=16, # 训练时的批量大小per_device_eval_batch_size=16, # 验证时的批量大小num_train_epochs=3, # 训练轮数weight_decay=0.01, # 权重衰减logging_dir="./logs", # 日志目录logging_steps=10 # 每 10 步记录一次日志)# 定义 Trainertrainer = Trainer(model=model,args=training_args,train_dataset=train_dataset,eval_dataset=test_dataset)# 开始训练trainer.train()
6.4 测试模型
# 测试单句预测test_sentence = "This movie was absolutely fantastic!"inputs = tokenizer(test_sentence, return_tensors="pt", truncation=True, padding=True, max_length=128)outputs = model(**inputs)prediction = outputs.logits.argmax(dim=-1).item()# 输出结果print("情感分析结果:", "积极" if prediction == 1 else "消极")
else:print("使用备选方案 (LogisticRegression) 进行训练...")# 将稀疏矩阵转换为numpy数组进行训练X_train = train_features.toarray()X_test = test_features.toarray()# 使用逻辑回归作为备选模型clf = LogisticRegression(max_iter=1000)clf.fit(X_train, train_labels)# 评估模型accuracy = clf.score(X_test, test_labels)print(f"测试集准确率: {accuracy:.4f}")# 测试单句预测test_sentence = "This movie was absolutely fantastic!"# 使用已经训练好的vectorizer进行转换test_features = vectorizer.transform([test_sentence])prediction = clf.predict(test_features)[0]# 输出结果print("情感分析结果:", "积极" if prediction == 1 else "消极")
程序运行结果:
2025-02-27 23:52:05.928189: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
2025-02-27 23:52:07.648400: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
成功加载本地数据集sentence label
0 hide new secretions from the parental units 0
1 contains no wit , only labored gags 0
2 that loves its characters and communicates som... 1
3 remains utterly satisfied to remain the same t... 0
4 on the worst revenge-of-the-nerds clichés the ... 0
无法加载BERT分词器: (MaxRetryError("HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /bert-base-uncased/resolve/main/tokenizer_config.json (Caused by ProxyError('Unable to connect to proxy', FileNotFoundError(2, 'No such file or directory')))"), '(Request ID: 3fff21e5-ab5a-4c4c-8695-70d49bb4ebdf)')
尝试使用备选方案...
已切换到简单分词器 (CountVectorizer)
开始预处理数据...
数据预处理完成
使用备选方案 (LogisticRegression) 进行训练...
测试集准确率: 0.8131
情感分析结果: 积极
7. 前沿关联:超大规模语言模型的能力与挑战
7.1 超大规模模型
- GPT-4 和 PaLM 等模型拥有数千亿参数,能够生成高质量的文本、代码甚至图像描述。
- 能力:
- 上下文理解、多语言支持、零样本学习。
- 挑战:
- 计算资源需求高。
- 模型可解释性差。
- 潜在的偏见与伦理问题。
7.2 未来方向
- 更高效的训练方法(如稀疏激活、知识蒸馏)。
- 提升模型的可控性与安全性。
总结
Transformer 架构以其强大的自注意力机制和灵活的编码器-解码器结构,成为 NLP 领域的基石。通过实战项目,我们学会了如何使用 Hugging Face 的工具微调 BERT 模型。同时,我们也探讨了超大规模语言模型的潜力与挑战。
希望这篇博客能帮助你更好地理解 Transformer 的原理与应用!如果需要进一步扩展或优化,请随时告诉我!
相关文章:
《深度学习实战》第4集:Transformer 架构与自然语言处理(NLP)
《深度学习实战》第4集:Transformer 架构与自然语言处理(NLP) 在自然语言处理(NLP)领域,Transformer 架构的出现彻底改变了传统的序列建模方法。它不仅成为现代 NLP 的核心,还推动了诸如 BERT、…...
vue下载插件
1.下载路由组件 npm i vue-router2.创建router文件夹 3.创建router.js文件 import {createRouter, createWebHistory} from "vue-router"let router createRouter({history: createWebHistory(),routes: [{path: "/",component: () > import(".…...
两周学习安排
日常安排 白天 看 MySQL实战45讲,每日一讲 看 图解设计模式 每天1-2道力扣算法题(难度中等以上) 每天复习昨天的单词,记20个单词,写一篇阅读 晚上 写服创项目 每日产出 MySQL实战45讲 读书笔记 设计模式 读书笔…...
蓝桥与力扣刷题(蓝桥 k倍区间)
题目:给定一个长度为 N 的数列,A1,A2,⋯AN,如果其中一段连续的子序列 Ai,Ai1,⋯Aj( i≤j ) 之和是 K 的倍数,我们就称这个区间[i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗? 输入描述 第一行包含两…...
Spring项目-抽奖系统(实操项目-用户管理接口)(END)
^__^ (oo)\______ (__)\ )\/\ ||----w | || || 一:前言: 活动创建及展示博客链接:Spring项目-抽奖系统(实操项目-用户管理接口)(THREE)-CSDN博客 上一次完成了活动的创建和活动的展示,接下来就是重头戏—…...
5个GitHub热点开源项目!!
1.自托管 Moonlight 游戏串流服务:Sunshine 主语言:C,Star:14.4k,周增长:500 这是一个自托管的 Moonlight 游戏串流服务器端项目,支持所有 Moonlight 客户端。用户可以在自己电脑上搭建一个游戏…...
数据结构:二叉搜索树(排序树)
1.二叉搜索树的定义 二叉搜索树要么是空树,要么是满足以下特性的树 (1)左子树不为空,那么左子树左右节点的值都小于根节点的值 (2)右子树不为空,那么右子树左右节点的值都大于根节点的值 &#…...
JavaEE--计算机是如何工作的
一、一台计算机的组成部分 1.CPU(中央处理器) 2.主板(一个大插座) 3.内存(存储数据的主要模板) 4.硬盘(存储数据的主要模板) 内存和硬盘对比: 内存硬盘读写速度快慢存…...
Redis 实战篇 ——《黑马点评》(下)
《引言》 (下)篇将记录 Redis 实战篇 最后的一些学习内容,希望大家能够点赞、收藏支持一下 Thanks♪ (・ω・)ノ,谢谢大家。 传送门(上):Redis 实战篇 ——《黑马…...
OpenCV计算摄影学(10)将一组不同曝光的图像合并成一张高动态范围(HDR)图像的实现类cv::MergeDebevec
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 resulting HDR 图像被计算为考虑了曝光值和相机响应的各次曝光的加权平均值。 cv::MergeDebevec 是 OpenCV 中用于将一组不同曝光的图像合并成一…...
Linux驱动开发之串口驱动移植
原理图 从上图可以看到RS232的串口接的是UART3,接下来我们需要使能UART3的收发功能。一般串口的驱动程序在内核中都有包含,我们配置使能适配即可。 设备树 复用功能配置 查看6ull如何进行uart3的串口复用配置: 设备树下添加uart3的串口复用…...
c语言中return 数字代表的含义
return 数字的含义:表示函数返回一个整数值,通常用于向调用者(如操作系统或其他程序)传递程序的执行状态或结果。 核心规则: return 0: 含义:表示程序或函数正常结束。 示例: int m…...
Android 端侧运行 LLM 框架 MNN 及其应用
MNN Chat Android App - 基于 MNN 引擎的智能聊天应用 一、MNN 框架简介与工作原理1.1 什么是 MNN?1.2 MNN 的工作原理 二、MNN Chat Android App2.1 MNN Chat 的功能2.2 MNN Chat 的优势2.3 MNN Chat Android App 的使用 三、总结 随着移动端人工智能需求的日益增长…...
jupyter汉化、修改默认路径详细讲解
1、配置镜像路径 修改第三方库的下载路径,比如:[清华镜像pypi](https://mirrors.tuna.tsinghua.edu.cn/help/pypi/),配置镜像地址。 首先执行 pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 2、安…...
java面试笔记(二)
1.流程中如何数据回填 (1)方法1: 在工作流中有一个标识,每一次审批的时候去判断是否审批完成,然后调用反射 (2)方法2: 创建一个流程结束的监听器,监听流程是否结束&a…...
【大语言模型笔记进阶一步】提示语设计学习笔记,跳出框架思维,自己构建提示词
一、大语言模型应用场景 1. 文本生成 文本创作: 诗歌故事,剧本,推文帖子 摘要与改写: 长文本摘要与简化,多语言翻译与本地化 结构化生成: 表格,根据需求生成代码片段,API文档生成…...
sql调优:优化响应时间(优化sql) ; 优化吞吐量
Sql性能调优的目的 1.优化响应时间>>优化sql 经过调优后,执行查询、更新等操作的时候,数据库的反应速度更快,花费的时间更少。 2.优化吞吐量 即“并发”, 就是“同时处理请求”的能力。 优化sql 尽量将多条SQL语句压缩到一句>…...
debian/control中的包关系
软件包依赖就是软件包关系的一种,一般用 Depends 表示。 每个软件包都可以和其他软件包有各种不同的关系。除 Depends 外,还有 Recommends、Suggests、Pre-Depends、Breaks、Conflicts、Provides 和 Replaces,软件包管理工具(如 …...
python学习第三天
条件判断 条件判断使用if、elif和else关键字。它们用于根据条件执行不同的代码块。 # 条件判断 age 18 if age < 18:print("你还是个孩子!") elif age 18:print("永远十八岁!") else:print("你还年轻!")…...
k8s架构及服务详解
目录 1.1.容器是什么1.2.Namespace1.3.rootfs5.1.Service介绍5.1.1.Serice简介 5.1.1.1什么是Service5.1.1.2.Service的创建5.1.1.3.检测服务5.1.1.4.在运行的容器中远程执行命令 5.2.连接集群外部的服务 5.2.1.介绍服务endpoint5.2.2.手动配置服务的endpoint5.2.3.为外部服务…...
Unity中动态切换光照贴图LightProbe的方法
关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...
基于Matlab的多目标粒子群优化
在复杂系统的设计、决策与优化问题中,常常需要同时兼顾多个相互冲突的目标,多目标粒子群优化(MOPSO)算法应运而生,作为群体智能优化算法家族中的重要成员,它为解决此类棘手难题提供了高效且富有创新性的解决…...
Android Studio 新版本Gradle发布本地Maven仓库示例
发布代码到JitPack示例:https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2(Gradle 8.10.2 AGP 8.8.0 JDK17) 的本地 Maven 仓库发布示例,包含aar和jar的不同配置: 1.…...
Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
在 LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法 这篇博客中,我们了解了格式化LLM输出内容的必要性以及如何通过调用langchain框架中提供的 with_structured_output() 方法对LLM输出进行格式化(三种可选方…...
深入理解Spring @Async:异步编程的利器与实战指南
一、为什么需要异步编程? 在现代高并发系统中,同步阻塞式编程会带来两大核心问题: // 同步处理示例 public void processOrder(Order order) {// 1. 保存订单(耗时50ms)orderRepository.save(order); // 2. 发送短信…...
让Word插上AI的翅膀:如何把DeepSeek装进Word
在日常办公中,微软的Word无疑是我们最常用的文字处理工具。无论是撰写报告、编辑文档,还是整理笔记,Word都能胜任。然而,随着AI技术的飞速发展,尤其是DeepSeek的出现,我们的文字编辑方式正在发生革命性的变…...
清华DeepSeek深度探索与进阶指南
「清华北大-Deepseek使用手册」 链接:https://pan.quark.cn/s/98782f7d61dc 「清华大学Deepseek整理) 1-6版本链接:https://pan.quark.cn/s/72194e32428a AI学术工具公测链接:https://pan.baidu.com/s/104w_uBB2F42Da0qnk78_ew …...
迁移学习策略全景解析:从理论到产业落地的技术跃迁
(2025年最新技术实践指南) 一、迁移学习的范式革命与核心价值 在人工智能进入"大模型时代"的今天,迁移学习已成为突破数据瓶颈、降低训练成本的关键技术。本文基于2025年最新技术进展,系统梳理六大核心策略及其在产业实…...
WireGuard搭建网络,供整个公司使用
一、清理现有配置(如已有失败尝试) # 停止并删除现有 WireGuard 接口 sudo wg-quick down wg0 sudo rm -rf /etc/wireguard/wg0.conf# 验证接口已删除 (执行后应该看不到 wg0) ifconfig二、服务器端完整配置流程 1. 安装 WireGuard sudo apt update &…...
MyAgent:用AI开发AI,开启智能编程的产业革命
在人工智能技术爆发的2025年,MyAgent智能体平台凭借其独特的“AI开发AI”模式,正在重构全球软件开发行业的底层逻辑。这一创新范式不仅将自然语言处理、机器学习、RPA(机器人流程自动化)等技术深度融合,更通过“…...
Cherno C++ P60 为什么不用using namespace std
这篇文章我们讲一下之前写代码的时候的一个习惯,也就是不使用using namespace std。如果我们接触过最早的C教程,那么第一节课都会让我们写如下的代码: #include<iostream>using namespace std;int main() {cout << "Hello …...
el-select的下拉选择框插入el-checkbox
el-check注意这里要使用model-value绑定数据 <el-selectv-model"selectDevice"multiplecollapse-tags:multiple-limit"5"style"width: 200px"popper-class"select-popover-class" ><el-optionv-for"item in deviceList…...
M系列芯片 MacOS 在 Conda 环境中安装 TensorFlow 2 和 Keras 3 完整指南
目录 1. 引言2. 环境准备3. 安装 TensorFlow 和必要依赖4. 结语Reference 1. 引言 Keras 是搞深度学习很可爱的工具,其友好的接口让我总是将其作为搭建模型原型的首选。然而,当我希望在 M 系列芯片的MacBook Pro上使用 Keras时,使用Conda和P…...
GitHub教程
目录 1.是什么?2.安装3.创建库3.增删改查4.远程仓库5.分支6.标签7.使用流程8.总结 1.是什么? Git 是一个命令行工具,但也有许多图形用户界面可用。本地仓库,安装包下载到本地。Git 的一个流行 GUI 是 GitHub,它可以方便地管理存储库、推送…...
《JavaScript解题秘籍:力扣队列与栈的高效解题策略》
232.用栈实现队列 力扣题目链接(opens new window) 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。 示例: MyQueue queue new MyQueue(); queue…...
Supra软件更新:AGRV2K CPLD支持无源晶体做时钟输入
Supra软件更新:AGRV2K CPLD支持无源晶体做时钟输入 AGRV2K CPLD支持无源晶体做时钟输入,和AG32一样接入OSC_IN和OSC_OUT管脚。 VE管脚文件设为PIN_HSE,如: clk PIN_HSE ledout[0] PIN_31 ledout[1] PIN_32 ...... 在下载烧录文…...
简易的微信聊天网页版【项目测试报告】
文章目录 一、项目背景二、项目简介登录功能好友列表页面好友会话页面 三、测试工具和环境四、测试计划测试用例部分人工手动测试截图web自动化测试测试用例代码框架配置内容代码文件(Utils.py)登录页面代码文件(WeChatLogin.py)好…...
nio使用
NIO : new Input/Output,,在java1.4中引入的一套新的IO操作API,,,旨在替代传统的IO(即BIO:Blocking IO),,,nio提供了更高效的 文件和网络IO的 操作…...
【蓝桥杯单片机】第十二届省赛
一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…...
Jenkins与Flutter项目持续集成实战指南
一、环境准备 1. 基础环境要求 Jenkins Server:已安装JDK 11,建议使用Linux服务器(Ubuntu/CentOS)Flutter SDK:全局安装或通过工具动态管理构建代理节点: Android构建:需Android SDK、Gradle、…...
linux常见操作命令
查看目录和文件 ls:列出目录内容。 常用选项: -l:以长格式显示,显示文件的权限、所有者、大小、修改时间等详细信息。-a:显示所有文件和目录,包括隐藏文件(以 . 开头的文件)。-h&…...
6.人工智能与机器学习
一、人工智能基本原理 1. 人工智能(AI)定义与范畴 核心目标:模拟人类智能行为(如推理、学习、决策)分类: 弱人工智能(Narrow AI):专精单一任务(如AlphaGo、…...
GPU架构分类
一、NVIDIA的GPU架构 NVIDIA是全球领先的GPU生产商,其GPU架构在图形渲染、高性能计算和人工智能等领域具有广泛应用。NVIDIA的GPU架构经历了多次迭代,以下是一些重要的架构: 1. Tesla(特斯拉)架构(2006年…...
23种设计模式之单例模式(Singleton Pattern)【设计模式】
文章目录 一、简介二、关键点三、实现单例模式的步骤四、C#示例4.1 简单的单例模式4.2 线程安全的单例模式(双重检查锁定)4.3 静态初始化单例模式 五、单例模式优缺点5.1 优点5.2 缺点 六、适用场景七、示例的现实应用 一、简介 单例模式(Si…...
MAX232数据手册:搭建电平转换桥梁,助力串口稳定通信
在现代电子设备的通信领域,串口通信因其简单可靠而被广泛应用。MAX232 芯片作为串口通信中的关键角色,发挥着不可或缺的作用。下面,我们将依据提供的资料,深入解读 MAX232 芯片的各项特性、参数以及应用要点。 一、引脚说明 MAX2…...
Day 55 卡玛笔记
这是基于代码随想录的每日打卡 所有可达路径 题目描述 给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 输入描述 第一行包含两个整数…...
python量化交易——金融数据管理最佳实践——使用qteasy管理本地数据源
文章目录 统一定义的金融历史数据表最重要的数据表数据表的定义交易日历表的定义:交易日历表: trade_calendar qteasy是一个功能全面且易用的量化交易策略框架, Github地址在这里。使用它,能轻松地获取历史数据,创建交易策略并完…...
AVM 环视拼接 鱼眼相机
https://zhuanlan.zhihu.com/p/651306620 AVM 环视拼接方法介绍 从内外参推导IPM变换方程及代码实现(生成AVM环视拼接图)_avm拼接-CSDN博客 经典文献阅读之--Extrinsic Self-calibration of the Surround-view System: A Weakly... (环视系统的外参自…...
计算机基础面试(数据库)
1. 事务的ACID特性?如何通过日志保证原子性和持久性? 专业解答: ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Dura…...
Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks
Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks #paper/GFM/GNN-BASED# #paper/⭐⭐⭐# 注意:这篇文章是每个图一个GCN模型,而不是所有图一个GCN 模型 算是最早的涉及异配图的prompt了 贡献和动机: 非对…...