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

【NLP入门系列三】NLP文本嵌入(以Embedding和EmbeddingBag为例)

在这里插入图片描述

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

博主简介:努力学习的22级本科生一枚 🌟​;探索AI算法,C++,go语言的世界;在迷茫中寻找光芒​🌸
博客主页:羊小猪~~-CSDN博客
内容简介:NLP入门三,Embedding和EmbeddingBag嵌入.
🌸箴言🌸:去寻找理想的“天空“”之城
上一篇内容:【NLP入门系列二】NLP分词和字典构建-CSDN博客

文章目录

  • NLP文本嵌入
    • 前言
    • 1、Embedding嵌入
    • 2、EmbeddingBag嵌入
    • 3、参考资料

NLP文本嵌入

前言

📄 大模型语言理解文字方式: 将每一个词当做一个数字,然后不断地进行做计算题,从而不断地输出文字;

举例

如果用一个数字表示一个词,这里用1表示男人,2表示女人,这样的作用是给词进行了编号,但是表示无法表示词与词之间的关系。

但是,如果用两位数字表示呢?

👀 参考b站大佬视频:

在数学中,向量是有方向的,可以做运算,这里也一样,如图:

在这里插入图片描述
在数学中,向量是有方向的,可以做运算,这里也一样,如图:
在这里插入图片描述
这样就实现了:将每一个词当做一个数字,然后进行做计算题,从而输出文字;


💠 词嵌入: 用向量表示词。**原理:**将词嵌入到数学的维度空间,如果词用二维表示,那么嵌入到一个二维空间里,以此类推;

本质: 将离散的词汇映射到一个低维连续的向量空间中,这样词汇之间的关系就可以在向量空间中得到体现。


📘 大模型语言训练过程

大模型语言训练是一个很复杂的过程,但是了解最基本过程还是简单的,如下图表示(刚开始不同词随机分布在二维空间中不同位置):
在这里插入图片描述

经过模型训练后:
在这里插入图片描述

将语义相近的分布在一起,但是也有一些中立词,如苹果这个词,吃苹果和苹果手机是不同意思的,所以苹果就是中立的,具体的意思需要根据模型训练过程中结合上下文进行运算得出结果。

EmbeddingEmbeddingBagpytorch处理文本数据词嵌入的工具。

1、Embedding嵌入

Embeddingpytorch中最基本的词嵌入操作。

输入:一整张向量,每个整数都代表一个词汇的索引

输出:是一个浮点型的张量,每个浮现数都代表着对应词汇的词嵌入向量。

维度变化

  • 输入shape:[batch, seqSize] ,seqSize表示单个文本长度(注意:同一批次中每个样本的序列长度(seq_len)必须相同);
  • 输出shape:[batch, seqSize, embed_dim]embed_bim 表示嵌入维度。

👙 注意:嵌入层被定义为网络的第一个隐藏层,采用随机权重初始化的方式,既可以作为深度学习模型的一部分,一起训练,也可以用于用于加载训练好的词嵌入模型。

函数原型

torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None,                     max_norm=None,norm_type=2.0,scale_grad_by_freq=False,                     sparse=False,_weight=None,_freeze=False, device=None,                     dtype=None)

常见参数:

  • num_embeddings:词汇表大小, 即,最大整数 index + 1。
  • embedding_dim:词向量的维度。

📚 以一个二分类案例为例:

1、导入库和自定义数据格式

import torch
import torch.nn as nn 
import torch.nn.functional as F 
import torch.optim as optim 
from torch.utils.data import Dataset, DataLoader# 自定义数据维度
class MyDataset(Dataset):def __init__(self, texts, labels):super().__init__()self.texts = textsself.labels = labelsdef __len__(self):return len(self.labels)def __getitem__(self, idx):text = self.texts[idx]label = self.labels[idx]return text, label

2、定义填充函数(将所有词长度变成一致)

def collate_batch(batch):# 解包texts, labels = zip(*batch) # texts、labels存储在不同[]/()这样的数据结构# 获取最大长度max_len = max(len(text) for text in texts)# 填充, 不够的填充为0padding_texts = [F.pad(text, (0, max_len - len(text)), value=0) for text in texts] # 采用右填充# 改变维度--> (batch_size, max_len)padding_texts = torch.stack(padding_texts)# 标签格式化(改变维度)--> (batch_size) --> (batch_size, 1), 不改变值labels = torch.tensor(labels, dtype=torch.float).unsqueeze(1)return padding_texts, labels

3、定义数据

# 定义三个样本
data = [torch.tensor([1, 1, 1], dtype=torch.long), torch.tensor([2, 2, 2], dtype=torch.long),torch.tensor([3, 3], dtype=torch.long)
]# 定义标签
labels = torch.tensor([1, 2, 3], dtype=torch.float)# 创建数据
data = MyDataset(data, labels)
data_loader = DataLoader(data, batch_size=2, shuffle=True, collate_fn=collate_batch)# 展示
for batch in data_loader:print(batch)print("shape:", batch)
(tensor([[1, 1, 1],[3, 3, 0]]), tensor([[1.],[3.]]))
shape: (tensor([[1, 1, 1],[3, 3, 0]]), tensor([[1.],[3.]]))
(tensor([[2, 2, 2]]), tensor([[2.]]))
shape: (tensor([[2, 2, 2]]), tensor([[2.]]))

4、定义模型

class EmbeddingModel(nn.Module):def __init__(self, vocab_size, embed_dim):super(EmbeddingModel, self).__init__()# 定义模型self.embedding = nn.Embedding(vocab_size, embed_dim) # 词汇表大小 + 嵌入维度self.fc = nn.Linear(embed_dim, 1)  # 这里假设做二分类任务def forward(self, text):print("Embedding输入文本是: ", text)print("Embedding输入文本shape: ", text.shape)embedding = self.embedding(text)embedding_mean = embedding.mean(dim=1)print("embedding输出文本维度: ", embedding_mean.shape)return self.fc(embedding_mean)

注意
如果使用embedding_mean = embedding.mean(dim=1)语句对每个样本的嵌入向量求平均,输出shape为[batch, embed_dim]。若注释掉该语句,输出shape则为[batch, seqSize, embed_dim]


5、模型训练

# 定义词表大小和嵌入维度
vacab_size = 10
embed_dim = 6# 创建模型
model = EmbeddingModel(vacab_size, embed_dim)# 设置超参数
cirterion = nn.BCEWithLogitsLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)# 模型训练
for epoch in range(1):for batch in data_loader:text, label = batch# 前向传播outputs = model(text)loss = cirterion(outputs, label)# 方向传播optimizer.zero_grad()loss.backward()optimizer.step()print(f'Epoch {epoch+1}, Loss: {loss.item()}')
Embedding输入文本是:  tensor([[2, 2, 2],[1, 1, 1]])
Embedding输入文本shape:  torch.Size([2, 3])
embedding输出文本维度:  torch.Size([2, 6])
Epoch 1, Loss: 0.6635428667068481
Embedding输入文本是:  tensor([[3, 3]])
Embedding输入文本shape:  torch.Size([1, 2])
embedding输出文本维度:  torch.Size([1, 6])
Epoch 1, Loss: 0.5667202472686768

2、EmbeddingBag嵌入

EmbeddingBag是在Embedding基础上进一步优化的工具,其核心思想是将每个输入序列的嵌入向量进行合并,能够处理可变长度的输入序列,并且减少了计算和存储的开销,并且可以计算句子中所有词汇的词嵌入向量的均值或总和。

减少计算量:因为embedding嵌入中需要要求每一个词向量长度需要一样。

PyTorch中,EmbeddingBag输入是一个 整数张量 和一个 偏移量张量每个整数都代表着一个词汇的索引,偏移量则表示句子中每个词汇的位置输出是一个浮点型的张量,每个浮点数都代表着对应句子的词嵌入向量的均值或总和。

  • 输入shape:[seqsSize](seqsSize为单个batch文本总长度)
  • 输出shape:[batch, embed_dim](embed_dim嵌入维度)

📐 假设原始输入数据为 [[1, 1, 1, 1], [2, 2, 2], [3, 3]]

  1. 展平的词汇索引张量

    • 将所有样本的数据合并成一个一维数组。如 [1, 1, 1, 1, 2, 2, 2, 3, 3]
  2. 偏移量

    偏移量表示每个样本在展平张量中的起始位置。如本案例: [0, 4, 7]

  3. 合并操作

    • 根据偏移量进行合并
    • 合并操作可以是求和、平均或取最大值,默认是平均(mean)。以平均为例:
      • 第一个样本的平均值:(1 + 1 + 1 + 1) / 4 = 1
      • 第二个样本的平均值:(2 + 2 + 2) / 3 = 2
      • 第三个样本的平均值:(3 + 3) / 2 = 3
      • 最后结果为 [1, 2, 3],即batch维度

📑 一个简单的案例如下:

1、导入库和自定义数据格式

import torch
import torch.nn as nn 
import torch.nn.functional as F 
import torch.optim as optim 
from torch.utils.data import Dataset, DataLoader# 自定义数据维度
class MyDataset(Dataset):def __init__(self, texts, labels):super().__init__()self.texts = textsself.labels = labelsdef __len__(self):return len(self.labels)def __getitem__(self, idx):text = self.texts[idx]label = self.labels[idx]return text, label

2、定义数据

# 定义三个样本
data = [torch.tensor([1, 1, 1], dtype=torch.long), torch.tensor([2, 2, 2], dtype=torch.long),torch.tensor([3, 3], dtype=torch.long)
]# 定义标签
labels = torch.tensor([1, 2, 3], dtype=torch.float)# 创建数据
data = MyDataset(data, labels)
data_loader = DataLoader(data, batch_size=2, shuffle=True, collate_fn=lambda x : x)# 展示
for batch in data_loader:print(batch)
[(tensor([1, 1, 1]), tensor(1.)), (tensor([3, 3]), tensor(3.))]
[(tensor([2, 2, 2]), tensor(2.))]

3、定义模型

class EmbeddingModel(nn.Module):def __init__(self, vocab_size, embed_dim):super(EmbeddingModel, self).__init__()# 定义模型self.embedding_bag = nn.EmbeddingBag(vocab_size, embed_dim, mode='mean')self.fc = nn.Linear(embed_dim, 1)  # 这里假设做二分类任务def forward(self, text, offsets):print("Embedding输入文本是: ", text)print("Embedding输入文本shape: ", text.shape)embedding_bag = self.embedding_bag(text, offsets)print("embedding_bag输出文本维度: ", embedding_bag.shape)return self.fc(embedding_bag)

4、模型训练

# 定义词表大小和嵌入维度
vacab_size = 10
embed_dim = 6# 创建模型
model = EmbeddingModel(vacab_size, embed_dim)# 设置超参数
cirterion = nn.BCEWithLogitsLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)# 模型训练
for epoch in range(1):for batch in data_loader:# 展平和计算偏移量texts, labels = zip(*batch)# 偏移量计算,就是统计文本长度offset = [0] + [len(text) for text in texts[:-1]] # 统计长度offset = torch.tensor(offset).cumsum(dim=0) # 生成偏移量,累计求和texts = torch.cat(texts)  # 合并文本labels = torch.tensor(labels).unsqueeze(1)  # 增加维度-->(batch_size, 1)# 前向传播outputs = model(texts, offset)loss = cirterion(outputs, labels)# 方向传播optimizer.zero_grad()loss.backward()optimizer.step()print(f'Epoch {epoch+1}, Loss: {loss.item()}')
Embedding输入文本是:  tensor([2, 2, 2, 1, 1, 1])
Embedding输入文本shape:  torch.Size([6])
embedding_bag输出文本维度:  torch.Size([2, 6])
Epoch 1, Loss: 0.07764509320259094
Embedding输入文本是:  tensor([3, 3])
Embedding输入文本shape:  torch.Size([2])
embedding_bag输出文本维度:  torch.Size([1, 6])
Epoch 1, Loss: 3.315852642059326

3、参考资料

  • 【大模型靠啥理解文字?通俗解释:词嵌入embedding】https://www.bilibili.com/video/BV1bfoQYCEHC?vd_source=1fd424333dd77a7d3e2e741f7d6fd4ee
  • PyTorch 简单易懂的 Embedding 和 EmbeddingBag - 解析与实践_nn.embeddingbag-CSDN博客
  • 小团体~第十二波

相关文章:

【NLP入门系列三】NLP文本嵌入(以Embedding和EmbeddingBag为例)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 博主简介:努力学习的22级本科生一枚 🌟​;探索AI算法,C,go语言的世界;在迷茫中寻找光芒…...

电子电气架构 --- 软件供应商如何进入OEM体系

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...

检索增强生成(RAG)领域关键数据集综述:分类、挑战与展望

检索增强生成(RAG)领域关键数据集综述:分类、挑战与展望 摘要 检索增强生成(RAG)通过融合外部知识库与大型语言模型,已成为解决知识密集型自然语言处理(NLP)任务的关键范式。高质量…...

CFD仿真计算革命:基于GPU的格子玻尔兹曼方法(LBM)算子优化——利用Tensor Core加速碰撞核计算(性能提升3倍实测)

点击 “AladdinEdu,同学们用得起的【H卡】算力平台,注册即送H800算力”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 在计算流体动力学领域,格子玻尔兹曼方法正以介观模…...

【蓝牙】Qt4中向已配对的手机发送PDF文件

在Qt 4中实现通过蓝牙向已配对的设备发送文件(例如PDF文件),你可以使用Qt Bluetooth模块。Qt 4的蓝牙模块提供了基本的蓝牙功能,包括设备发现、配对管理和数据传输。下面是一些步骤和示例代码,帮助你通过蓝牙发送PDF文…...

Vue + AbortController 请求取消弹窗 hook 封装

背景 实际业务开发场景中,往往存在有些大数据请求的需求,一旦请求发起加载遮罩后用户就无法操作了,直接尬住,所以提供一个支持取消查询的功能还是很有必要的,为了在全业务接口都能使用封装一个hook。 ✋为什么要用 A…...

在小程序中实现上下左右拖动表格

在小程序的开发中,不可避免会出现上下左右拖动表格的类似需求,下面将把这个简单实现一下 其中主要使用到了overflow: scroll;来使得横向和纵向可以滚动,并且使用负边距 父容器截断的方法来同时隐藏横向和纵向滚动条,从而实现该效…...

Spark 以及 spark streaming 核心原理及实践

导语 spark 已经成为广告、报表以及推荐系统等大数据计算场景中首选系统,因效率高,易用以及通用性越来越得到大家的青睐,我自己最近半年在接触spark以及spark streaming之后,对spark技术的使用有一些自己的经验积累以及心得体会&…...

数据融合平台是什么?如何搭建数据融合平台?

目录 一、数据融合是什么 1. 定义 2. 作用 二、数据融合平台的功能是什么 1. 数据抽取 2. 数据清洗 3. 数据转换 4. 数据关联 5. 数据存储 三、如何让搭建数据融合平台 1. 需求分析 2. 选择合适的技术和工具 3. 设计平台架构 4. 开发和部署平台 5. 数据迁移和融…...

Linux之线程同步与互斥

目录 一、线程互斥 1.1、进程线程间的互斥相关背景概念 1.2、互斥量mutex 1.2.1、互斥量的接⼝ 1.3、互斥量实现原理探究 1.4、互斥量的封装 二、线程同步 2.1、条件变量 2.2、同步概念与竞态条件 2.3、条件变量函数 2.4、⽣产者消费者模型 2.4.1、为何要使⽤⽣产者…...

uniapp开发小程序,导出文件打开并保存,实现过程downloadFile下载,openDocument打开

uniapp开发小程序,导出文件打开并保存 实现思路 1、调用请求获取到后端接口返回的下载文件的url路径 (注意必须是https的路径,域名需要配置在微信小程序后台的合法域名里面) 2、使用 uni.downloadFile 方法 (下载文件…...

腾讯云COS“私有桶”下,App如何安全获得音频调用流程

流程图 #mermaid-svg-Phy4VCltBRZ90UH8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Phy4VCltBRZ90UH8 .error-icon{fill:#552222;}#mermaid-svg-Phy4VCltBRZ90UH8 .error-text{fill:#552222;stroke:#552222;}#me…...

简单的 ​Flask​ 后端应用

from flask import Flask, request, jsonify, session import os app Flask(__name__) app.secret_key os.urandom(24) users { 123: admin, admin: admin } # 登录接口 app.route(/login, methods[POST]) def login(): data request.get_json() username data.get(usern…...

Android 中 解析 XML 字符串的几种方式

在 Android 开发中,解析 XML 文件有多种方式,每种方式都有其特点和适用场景。常见的 XML 解析方式有 DOM 解析、SAX 解析 和 XmlPullParser 解析。 1、DOM 解析 DOM(Document Object Model)解析是一种基于树结构的解析方式&#…...

git commit

‌git commit 是版本控制的核心操作之一,用于将暂存区的修改记录为新的版本提交‌。以下是关键步骤和最佳实践: ‌基础操作‌ ‌提交单个文件‌: bash Copy Code git commit -m “提交信息” ‌提交多个文件‌: bash Copy Code …...

【新手向】GitHub Desktop 的使用说明(含 GitHub Desktop 和 Git 的功能对比)

GitHub Desktop 是 GitHub 公司推出的一款桌面应用程序,旨在帮助开发人员更轻松地使用 GitHub,以下是其简单的使用说明: 安装与登录 下载 GitHub Desktop |GitHub 桌面 访问GitHub Desktop 官方网站,根据自己的操作系统下载对应的…...

Tomcat项目本地部署(Servlet为例)

在Windows上部署 在idea中打开项目 首先我们需要准备一个Servlet项目,我之前的Servlet项目是用eclipse写的,这种情况下如果用idea直接打开的话会出现左侧目录无法显示的情况,这个时候我们就需要用别的方法打开 打开项目管理 如下图&#…...

Linux——linux的基本命令

目录 一、linux的目录结构 二、绝对路径和相对路径 三、文件类型(linux下所有东西都可看作文件) 四、文件的权限 五、文件权限的修改(chmod) 六、linux常用的命令 七、文件查看命令 八、文件编辑命令 九、文件压缩与解压…...

wireshark过滤显示rtmp协议

wireshark中抓包显示的数据报文中,明明可以看到有 rtmp 协议的报文,但是过滤的时候却显示一条都没有 查看选项中的配置,已经没有 RTMP 这个协议了,已经被 RTMPT 替换了,过滤框中输入 rtmpt 过滤即可...

Fiddler抓包工具使用技巧:如何结合Charles和Wireshark提升开发调试效率

在开发过程中,网络调试工具是每个程序员的必备利器,特别是当涉及到Web应用和移动应用的调试时,抓包工具的作用尤为突出。无论是处理复杂的API调用、分析性能瓶颈,还是排查网络通信问题,抓包工具都能够帮助开发者精准地…...

LVS负载均衡群集

这里写目录标题 案例:部署Tomcat案例分析案例概述案例前置知识点Tomcat 简介应用场景 案例环境 案例实施实施准备关闭 firewalld 防火墙在安装Tomcat之前必须先安装JDK 查看JDK是否安装安装配置 TomcatTomcat 的安装和配置步骤如下:解压后生成 apache-tomcat-9.0.8文件夹&#…...

【unitrix】 3.5 类型级别的比较系统(cmp.rs)

一、源码 这段代码定义了一个类型级别的比较系统,主要用于在编译时比较类型并得出比较结果。它使用了 Rust 的类型系统和标记特征(trait)来实现这一功能。 use crate::sealed::Sealed; use crate::number::{Z0, P1, N1}; use core::cmp::Ordering;// 比较结果类型…...

防御式编程:防止 XSS 攻击

对用户输入进行编码和过滤是防止 XSS 攻击的关键。以下是改进后的代码示例: from flask import Flask, request, escape from markupsafe import Markup app Flask(__name__) app.route(/comment, methods[POST]) def comment(): user_comment escape(re…...

【Java项目设计】基于Springboot+Vue的OA办公自动化系统

介绍: 基于Springboot为后端,vue为前端的企业综合性OA办公自动化平台,涵盖九大核心模块,全方位解决企业日常办公需求,提升工作效率和管理水平。系统采用模块化设计,功能全面且易于扩展,从基础登…...

WebServer实现:muduo库的主丛Reactor架构

前言 作为服务器,核心自然是高效的处理来自client的多个连接啦,那问题在于,如何高效的处理client的连接呢?这里就介绍两种架构:单Reactor架构和主丛Reactor架构。 单Reactor架构 单Reactor架构的核心为,由一个主线程监…...

每天一个前端小知识 Day 7 - 现代前端工程化与构建工具体系

现代前端工程化与构建工具体系 1. 为什么要工程化?(面试高频问题) 问题痛点: 模块太多、无法组织;代码冗长、性能差;浏览器兼容性差;团队协作混乱,缺少规范与自动化。 工程化目标…...

nginx的下载与安装 mac

1. 下载 方法一:本地下载 链接:https://nginx.org/en/download.html(可直接搜官网) 下载到本地后,上传到linux的某个文件夹中 方法二:直接linux上下载(推荐) wget -c http://ngi…...

[持续集成]

学习目标 能够使用 Git 代码托管平台管理代码能够实现 jenkinspostman 的持续集成能够实现 jenkins代码 的持续集成 持续集成 概念 : 将自己工作成果持续不断地把代码聚集在一起,成员可以每天集成一次或多次相关工具 : git : 代码管理工具,自带本地仓库gitee : 远程代码管理…...

Spring Aop @AfterThrowing (异常通知): 使用场景

核心定义 AfterThrowing 是 Spring AOP 中专门用于处理异常场景的**通知(Advice)**类型。它的核心作用是: 仅在目标方法(连接点)的执行过程中抛出异常时,执行一段特定的逻辑。如果目标方法成功执行并正常…...

【赵渝强老师】Kubernetes的安全框架

Kubernetes集群的安全框架主要由以下认证、鉴权和准入控制三个阶段组成。这三个阶段的关系如下图所示。 视频讲解如下 【赵渝强老师】Kubernetes的安全框架 认证(Authentication) 当客户端与Kubernetes集群建立HTTP通信时,首先HTTP请求会进…...

【Python小练习】3D散点图

资产风险收益三维分析 背景 王老师是一名金融工程研究员,需要对多个资产的预期收益、风险(波动率)和与市场的相关性进行综合分析,以便为投资组合优化提供决策依据。 代码实现 import matplotlib.pyplot as plt from mpl_toolk…...

腾讯混元3D制作简单模型教程-2

以下是腾讯混元3D制作简单模型的详细教程,整合最新版本特性(截至2025年6月),操作门槛低且无需专业基础: 🖥 一、在线生成(最快30秒完成) ‌访问平台‌ 打开 腾讯混元3D创作引擎官网…...

NVIDIA开源Fast-dLLM!解析分块KV缓存与置信度感知并行解码技术

Talk主页:http://qingkeai.online/ 文章原文:https://mp.weixin.qq.com/s/P0PIAMo1GVYH4mdWdIde_Q Fast-dLLM 是NVIDIA联合香港大学、MIT等机构推出的扩散大语言模型推理加速方案。 论文:Fast-dLLM: Training-free Acceleration of Diffusion…...

大白话说目标检测中的IOU(Intersection over Union)

很多同学在学习目标检测时都会遇到IoU这个概念,但总觉得理解不透彻。这其实很正常,因为IoU就像个"多面手",在目标检测的各个阶段都要"打工",而且每个阶段的"工作内容"还不太一样。 今天我就让IoU自…...

CentOS 8解决ssh连接github时sign_and_send_pubkey失败问题

我在一台centos8机器上安装git环境以连接到github,首先第一步需配置好ssh环境,因为我已经有一台Ubuntu机器已经配置好ssh环境,所以我ftp Ubuntu机器取得id_rsa id_rsa.pub known_hosts三个文件,然后执行命令: $ git …...

回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务

需要dns代理 1 配置需求或说明 1.1 适用的产品系列 本案例适用于软件平台为Comware V7系列防火墙:本案例适用于如F5080、F5060、F5030、F5000-M等F5000、F5000-X系列的防火墙。 注:本案例是在F100-C-G2的Version 7.1.064, Release 9510P08版本上进行…...

OpenCV实现二值图细化(骨架提取)

对二值图进行细化(骨架提取),也就是把每根线条细化到一个像素的宽度。有两个比较成熟的算法实现此功能,分别是Zhang-Suen算法和Guo-Hall算法。 我们下面使用OpenCVSharp,使用C#实现上述两个算法: private…...

Excel常用公式大全

资源宝整理分享:https://www.httple.net Excel常用公式大全可以帮助用户提高工作效率,掌握常用的Excel公式,让数据处理和计算工作更加便捷高效。了解公式学习方法、用途,不再死记硬背,拒绝漫无目的。 命令用途注释说…...

在 Windows 上使用 Docker Desktop 快速搭建本地 Kubernetes 环境(附详细部署教程)

言简意赅的讲解Docker Desktop for Windows搭建Kubernetes解决的痛点 目标读者: 对 Docker Desktop 有一定了解,能在 Windows 上成功安装和使用 Docker Desktop。想要在本地快速搭建一套 Kubernetes 环境进行测试或学习的开发者。 一、准备工作 安装 Doc…...

Python设计模式终极指南:18种模式详解+正反案例对比+框架源码剖析

下面我将全面解析18种Python设计模式,每种模式都包含实际应用场景、优缺点分析、框架引用案例、可运行代码示例以及正反案例对比,帮助您深入理解设计模式的价值。 一、创建型模式(5种) 1. 单例模式(Singleton&#x…...

第1章: 伯努利模型的极大似然估计与贝叶斯估计

伯努利模型的极大似然估计与贝叶斯估计 import numpy as np import matplotlib.pyplot as plt from scipy.stats import beta, bernoulli from scipy.optimize import minimize_scalar# 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] # 使用黑体 plt.rcParams[axes.…...

IPv4编址及IPv4路由基础

一、实验目的 掌握接口 IPv4 地址的配置方法理解 LoopBack 接口的作用与含义理解直连路由的产生原则掌握静态路由的配置方法并理解其生效的条件掌握通过 PING 工具测试网络层连通性掌握并理解特殊静态路由的配置方法与应用场景 二、实验环境 安装有eNSP模拟器的PC一台&#…...

基于Python的机动车辆推荐及预测分析系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…...

SpringBoot扩展——发送邮件!

发送邮件 在日常工作和生活中经常会用到电子邮件。例如,当注册一个新账户时,系统会自动给注册邮箱发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。邮箱的使用基本包括这几步:先打开浏览器并登录邮箱&…...

啊啊啊啊啊啊啊啊code

前序遍历和中序遍历构建二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNod…...

不同程度多径效应影响下的无线通信网络电磁信号仿真数据生成程序

生成.mat数据: %创建时间:2025年6月19日 %zhouzhichao %遍历生成不同程度多径效应影响的无线通信网络拓扑推理数据用于测试close all clearsnr 40; n 30;dataset_n 100;for bias 0.1:0.1:0.9nodes_P ones(n,1);Sampling_M 3000;%获取一帧信号及对…...

C语言学习day17-----位运算

目录 1.位运算 1.1基础知识 1.1.1定义 1.1.2用途 1.1.3软件控制硬件 1.2运算符 1.2.1与 & 1.2.2或 | 1.2.3非 ~ 1.2.4异或 ^ 1.2.5左移 << 1.2.6右移 >> 1.2.7代码实现 1.2.8置0 1.2.9置1 1.2.10不借助第三方变量&#xff0c;实现两个数的交换…...

Spring MVC参数绑定终极手册:单多参对象集合JSON文件上传精讲

我们通过浏览器访问不同的路径&#xff0c;就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带一些参数&#xff0c;本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接用方法中的参数就可以…...

宽度优先遍历(bfs)(2)——fllodfill算法

欢迎来到博主的专栏&#xff1a;算法解析 博主ID&#xff1a;代码小豪 文章目录 floodfiil算法leetcode733——图像渲染题目解析算法原理题解代码 leetcode130——被围绕的区域题目解析算法原理题解代码 floodfiil算法 floodfill算法&#xff0c;在博主这里看来则是一个区域填…...

嵌入式编译工具链熟悉与游戏移植

一、Linux 系统编译工具链使用与 mininim 源码编译 在 Ubuntu 系统上编译 mininim 开源游戏需要正确配置编译工具链和依赖库。以下是详细的操作步骤和故障解决方法&#xff1a; 1. 环境准备与源码获取 首先需要安装必要的编译工具和依赖库&#xff1a; # 更新系统软件包索引…...