双向长短期记忆(Bi-LSTM)神经网络介绍
长短期记忆(Long Short-Term Memory, LSTM)神经网络:
1.是Hochreiter和Schmidhuber设计的循环神经网络(Recurrent Neural Network, RNN)的改进版本。LSTM模型借鉴了人类大脑的选择性输入和选择性遗忘机制,获取序列中的关键信息,遗忘和当前预测任务无关的信息。
2.在循环神经网络的基础上,在隐藏层各神经单元中增加记忆单元(memory cell,一种可以长时间保存信息的容器),从而使时间序列上的记忆信息可控。每次在隐藏层各单元间传递时通过三个可控门(遗忘门、输入门、输出门),可以控制之前信息和当前信息的记忆和遗忘程度,从而使LSTM网络具备了长期记忆功能。
3.在RNN中,有一个很大局限,就是梯度消失和梯度爆炸问题。也就是RNN只能对较短距离的信息进行记忆,随着时间的间隔增大,RNN学习起来就会变的非常的困难。LSTM神经网络的出现很好的解决了这个问题,相对于传统的RNN,LSTM神经网络在其中添加了一个能够记忆长时间信息的单元。
4.LSTM神经网络一般由输入层,隐藏层和输出层构成。LSTM神经网络的核心就是其中的具有记忆功能的隐藏层。如下图所示是具有记忆功能的LSTM单元图:它包括输入门、输出门、遗忘门以及记忆单元块。图中xt代表当前时刻的输入数据,Ct-1代表上一时刻的单元状态(cell state),ht-1代表上一时刻的输出(或上一时刻的隐藏状态(hidden state)),Ct代表当前记忆单元状态,ht代表t时刻的输出值(或当前的隐藏状态)。ft代表遗忘门,it代表输入门,ot代表输出门。其中的输入门以及输出门为控制门,输入门决定给记忆单元传送的信息量,用来控制当前的输入值xt有多少数据被保留在Ct中,从而实现对单元状态Ct的更新;输出门决定将记忆单元中的多少信息传送给当前的输出。遗忘门对记忆单元进行控制,用来决定记忆单元的记忆和遗忘,决定的是上一时刻的记忆单元有多少数据将传递到现在。
5.LSTM的核心概念是单元状态及其各种门。单元状态充当传输高速公路,将相关信息传输到序列链的下游。你可以将其视为网络的"记忆(memory)"。理论上,单元状态可以在整个序列处理过程中携带相关信息。因此,即使是来自较早时间步(time step)的信息也可以进入后续时间步,从而减少短期记忆(short-term memory)的影响。随着单元状态的旅程,信息会通过门添加到单元状态或从单元状态中删除。门是不同的神经网络,它们决定哪些信息允许进入单元状态。门可以了解在训练期间哪些信息是相关的,需要保留或遗忘。有三个不同的门来调节LSTM单元中的信息流。由三个门控制记忆单元。这使得LSTM网络能够在信息流经网络时有选择地保留或丢弃信息,从而使它们能够学习长期依赖关系。
(1).输入门(it):控制向记忆单元添加哪些信息。为了更新单元状态,我们有输入门。首先,我们将之前的隐藏状态和当前输入传递到sigmoid函数中。通过将值转换为0到1之间的值,该函数决定更新哪些值。0表示不重要,1表示重要。你还可以将隐藏状态和当前输入传递到tanh函数中,以将值压缩到-1和1之间,以帮助调节网络。然后将tanh输出与sigmoid输出相乘。sigmoid输出将决定哪些信息对于保留在tanh输出中很重要。
(2).遗忘门(ft):控制从记忆单元移除哪些信息。该门决定应该丢弃或保留哪些信息,来自前一个隐藏状态的信息和来自当前输入的信息通过sigmoid函数传递。值介于0和1之间。越接近0表示丢弃,越接近1表示保留。
(3).输出门(ot):控制从记忆单元输出哪些信息。输出门决定下一个隐藏状态应该是什么。隐藏状态包含有关先前输入的信息。隐藏状态也用于预测。首先,我们将先前的隐藏状态和当前输入传递给sigmoid函数。然后我们将新修改的单元状态传递给tanh函数。我们将tanh输出与sigmoid输出相乘,以决定隐藏状态应该携带什么信息。输出是隐藏状态。然后,新的单元状态和新的隐藏状态被延续到下一个时间步。
(4).隐藏状态(ht):充当网络的短期记忆,保存着网络之前见过的先前数据的信息。隐藏状态根据输入、先前的隐藏状态和记忆单元的当前状态进行更新。
(5).单元状态(ct):首先,单元状态逐点(pointwise)乘以遗忘向量(forget vector)。如果乘以接近0的值,则有可能丢弃单元状态中的值。然后我们从输入门获取输出并进行逐点加法,将单元状态更新为神经网络认为相关的新值。这给了我们新的单元状态。
遗忘门决定了哪些信息与之前的时间步相关,哪些信息需要保留。输入门决定了哪些信息与当前时间步相关,哪些信息需要添加。输出门决定了下一个隐藏状态应该是什么。
6.LSTM架构中的网络可以堆叠以创建深度架构,从而能够学习序列数据中更复杂的模式和层次结构。LSTM架构具有链式结构。
7.LSTM使用单元状态来存储有关过去输入的信息。此单元状态在网络的每个步骤中更新,网络使用它来对当前输入进行预测。单元状态使用一系列门进行更新,这些门控制允许多少信息流入和流出单元。
8.LSTM的控制流程与RNN类似。它在信息前向传播的过程中处理数据。不同之处在于LSTM单元(cell)内的操作。
双向长短期记忆(Bi-directional Long Short-Term Memory, Bi-LSTM)神经网络:
1.Bi-LSTM是LSTM的扩展,涉及两个并行运行的LSTM,两个LSTM网络组成,前向LSTM和后向LSTM,一个网络处理前向输入序列,另一个网络处理后向输入序列,每个隐藏层的输出由两个LSTM组合而成。
2.Bi-LSTM神经网络在训练时能同时对当前训练t时刻之前的历史数据和之后的未来数据进行充分利用。
3.Bi-LSTM基本工作原理:通过前向LSTM和后向LSTM得到两个时间序列相反的隐藏层状态,然后将其连接得到同一个输出,其他步骤与LSTM训练过程类似。前向LSTM 和后向LSTM可以分别获取当前输入序列的前向信息和后向信息。
注:以上整理的内容主要来自:
1. https://towardsdatascience.com
2. 硕论,《基于LSTM的人体连续动作识别》
PyTorch中torch.nn.LSTM使用说明:
1.声明如下:
torch.nn.LSTM(input_size, hidden_size, num_layers=1, bias=True, batch_first=False, dropout=0.0, bidirectional=False, proj_size=0, device=None, dtype=None)
2.公式如下:
3.参数说明:
(1).input_size:输入x的特征数量。
(2).hidden_size:隐藏状态h的特征数量。
(3).num_layers:循环层的数量。例如,设置num_layers=2意味着将两个LSTM堆叠在一起以形成堆叠的LSTM,第二个LSTM接收第一个LSTM的输出并计算最终结果。默认值为1。
(4).bias:如果为False,则该层不使用偏置(bias)。默认为True。
(5).batch_first:如果为True,则输入和输出张量将以(batch, seq, feature)而不是(seq, batch, feature) 的形式提供。这不适用于隐藏状态或单元状态。默认为False。
(6).dropout:如果非零,则在除最后一层之外的每个LSTM层的输出上引入Dropout层,dropout概率等于dropout。默认值为0.0。
(7).bidirectional:如果为True,则变为双向LSTM。默认为False。
(8).proj_size:如果大于0,将使用具有投影的LSTM(LSTM with projections will be used)。默认值为0。
4.对于inputs和outputs: 假设batch_first=False, batch input,proj_size=0
(1).inputs: input, (h_0, c_0)
1).input:(L,N,Hin)
2).h_0:(D∗num_layers,N,Hout)
3).c_0:(D∗num_layers,N,Hcell)
(2).outputs: output, (h_n, c_n)
1).output: (L,N,D∗Hout)
2).h_n:(D*num_layers,N,Hout)
3).c_n:(D*num_layers,N,Hcell)
其中:
N = batch size
L = sequence length
D = 2 if bidirectional=True otherwise 1
Hin = input_size
Hcell = hidden_size
Hout = hidden_size
将Bi-LSTM用于分类,示例代码如下:
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
import colorama
import argparsedef parse_args():parser = argparse.ArgumentParser(description="BiLSTM classify")parser.add_argument("--epochs", type=int, default=10, help="number of training")parser.add_argument("--lr", type=float, default=0.003, help="learning rate")parser.add_argument("--batch_size", type=int, default=64, help="batch size during training")parser.add_argument("--hidden_size", type=int, default=128, help="hidden state size")parser.add_argument("--num_layers", type=int, default=2, help="number of recurrent layers")args = parser.parse_args()return argsdef load_data(batch_size):train_dataset = torchvision.datasets.MNIST(root='../../data/', train=True, transform=transforms.ToTensor(), download=True)test_dataset = torchvision.datasets.MNIST(root='../../data/', train=False, transform=transforms.ToTensor())train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)return train_loader, test_loader# Bidirectional recurrent neural network (many-to-one)
class BiRNN(nn.Module):def __init__(self, input_size, hidden_size, num_layers, num_classes, device):super(BiRNN, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersself.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True, bidirectional=True)self.fc = nn.Linear(hidden_size*2, num_classes) # 2 for bidirectionself.device = devicedef forward(self, x):# Set initial statesh0 = torch.zeros(self.num_layers*2, x.size(0), self.hidden_size).to(self.device) # 2 for bidirection, x.size(0)=batch_sizec0 = torch.zeros(self.num_layers*2, x.size(0), self.hidden_size).to(self.device)# Forward propagate LSTMout, _ = self.lstm(x, (h0, c0)) # out: tensor of shape (batch_size, seq_length, hidden_size*2)# Decode the hidden state of the last time stepout = self.fc(out[:, -1, :]) # out: tensor of shape (batch_size, num_classes)return outdef train(epochs, lr, batch_size, hidden_size, num_layers, device, input_size, sequence_length, num_classes):train_loader, test_loader = load_data(batch_size)model = BiRNN(input_size, hidden_size, num_layers, num_classes, device).to(device)# Loss and optimizercriterion = nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters(), lr=lr)# Train the modeltotal_step = len(train_loader)for epoch in range(epochs):model.train()for i, (images, labels) in enumerate(train_loader):images = images.reshape(-1, sequence_length, input_size).to(device)labels = labels.to(device)# Forward passoutputs = model(images)loss = criterion(outputs, labels)# Backward and optimizeoptimizer.zero_grad()loss.backward()optimizer.step()if (i+1) % 100 == 0:print ("Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}".format(epoch+1, epochs, i+1, total_step, loss.item()))# Test the modelmodel.eval()with torch.no_grad():correct = 0total = 0for images, labels in test_loader:images = images.reshape(-1, sequence_length, input_size).to(device)labels = labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print("Test Accuracy of the model on the 10000 test images: {} %".format(100 * correct / total))# Save the model checkpointtorch.save(model.state_dict(), "model.pth")if __name__ == "__main__":# reference: https://github.com/yunjey/pytorch-tutorial/blob/master/tutorials/02-intermediate/bidirectional_recurrent_neural_network/main.pycolorama.init(autoreset=True)args = parse_args()device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')sequence_length = 28input_size = 28num_classes = 10train(args.epochs, args.lr, args.batch_size, args.hidden_size, args.num_layers, device, input_size, sequence_length, num_classes)print(colorama.Fore.GREEN + "====== execution completed ======")
执行结果如下图所示:
GitHub:https://github.com/fengbingchun/NN_Test
相关文章:
双向长短期记忆(Bi-LSTM)神经网络介绍
长短期记忆(Long Short-Term Memory, LSTM)神经网络: 1.是Hochreiter和Schmidhuber设计的循环神经网络(Recurrent Neural Network, RNN)的改进版本。LSTM模型借鉴了人类大脑的选择性输入和选择性遗忘机制,获取序列中的关键信息,遗忘和当前预测…...
openGauss开源数据库实战十八
文章目录 任务十八 openGauss逻辑结构:构:用户和权眼管理任务目标实施步骤一、准备工作二、用户和角色管理1.使用CREATE USER语句创建用户2.使用CREATE ROLE语句创建用户3.删除用户和角色 三、权限管理1.系统权限清理工作 任务十八 openGauss逻辑结构:构:用户和权眼管理 任务目…...
JVM 性能调优 -- JVM 调优常用网站
前言: 上一篇分享了 JDK 自带的常用的 JVM 调优命令和图形化界面工具,本篇我们分享一下常用的第三方辅助 JVM 调优网站。 JVM 系列文章传送门 初识 JVM(Java 虚拟机) 深入理解 JVM(Java 虚拟机) 一文搞…...
现在的电商风口已经很明显了
随着电商行业的不断发展,直播带货的热潮似乎正逐渐降温,而货架电商正成为新的焦点。抖音等平台越来越重视货架电商,强调搜索功能的重要性,预示着未来的电商中心将转向货架和搜索。 在这一转型期,AI技术与电商的结合为…...
基于AT89C52单片机的电子时钟与温湿度检测系统
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
Wwise SoundBanks内存优化
1.更换音频格式为Vorbis 2.停用多余的音频,如Random Container的随机脚步声数量降为2个 3.背景音乐勾选“Stream”。这样就让音频从硬盘流送到Wwise,而不是保存在内存当中,也就节省了内存 4.设置最大发声数Max Voice Instances 5.设置音频…...
Next.js 独立开发教程(十三):错误处理(Error Handling)
系列文章目录 Next.js 开发教程(一):入门指南-CSDN博客 Next.js 开发教程(二):从零构建仪表盘应用-CSDN博客 Next.js 开发教程(三):CSS 样式的完整指南-CSDN博客 Next.js 独立开发教程&…...
【Halcon】边缘检测算子汇总(一)
frei_amp 功能:使用Frei-Chen算法检测图像的边缘振幅。 参数: 输入图像(Image):待处理的原始图像。输出梯度图像(ImageEdgeAmp):经过Frei-Chen算法处理后的边缘振幅图像。工作原理:frei_amp算子通过计算图像一阶导数的近似值来检测边缘。它使用两个特定的滤波器掩模(…...
前端开发中Token存储:选择Cookie还是localStorage?
在现代前端开发领域,用户身份验证与状态管理不可或缺,而 token 作为身份验证机制的核心要素,对保障用户信息安全至关重要。然而,token 的存储方式对应用安全性和用户体验有着直接影响。本文将从安全性、便捷性和使用场景等维度,深度剖析在 Cookie 和 localStorage 中选择存…...
Scala中的正则表达式01
规则类型具体规则示例说明单字符大多数字符匹配自身正则表达式 abc,文本 abca 匹配 a,b 匹配 b,c 匹配 c方括号 [ ][ ] 定义字符集,匹配其一[abc],文本 a、b 或 c[abc] 匹配 a、b 或者 c排除字符集 [^ ][^ ] 开头加 ^&…...
机器学习——决策树模型
决策树是如何工作的? 假设你在经营一家猫收养中心,并提供了一些功能,你想训练一个分类器来快速告诉你,动物到底是不是猫,这里有10个训练例子,并与这10个例子中的每一个相关联,我们将有关于动物…...
#3003. Jed‘s MEX
刚开始直接硬来,要么TLE要么WA 后面改成另一种思路: 先把ai大于n的全都转换为刚好小于n的数,记录在cnt[i]中,代表ai有多少个 然后从高往低走,把cnt大于1的分到下面去,使数尽可能分布得广一些 然后从低往…...
数据集增强:提升深度学习模型泛化能力的关键技术
在深度学习中,数据是模型性能的基石。大规模、高质量的数据集通常能显著提高模型的泛化能力,帮助模型在真实场景中做出更准确的预测。然而,在很多实际应用中,数据收集困难、昂贵或者受限,尤其是当数据集相对较小或标注…...
JS实现高效导航——A*寻路算法+导航图简化法
一、如何实现两点间路径导航 导航实现的通用步骤,一般是: 1、网格划分 将地图划分为网格,即例如地图是一张图片,其像素为1000*1000,那我们将此图片划分为各个10*10的网格,从而提高寻路算法的计算量。 2、标…...
在wordpress添加自定义文章类型
实现思路 在Once主题中,有文章,页面等编辑的文案类型,文章类型主要做文案输出,而页面类型主要做一些界面菜单的操作。参考文章类型,使用自定义页面模板,实现一个自定义文章类型,例如**笔记(nod…...
[node.js] [HTTP/S] 实现 requests 发起 HTTP/S/1.1/2.0 请求
node.js 使用 V8 引擎来编译运行 javascript 代码,与浏览器中的环境不同的是,node.js 不包含 DOM 和 BOM 模块。 本文使用 node.js 的官方库来实现一个简单的 requests() 函数,可以用来发送 HTTP/1.1 和 HTTP/2.0 的请求。有关 HTTP/1.1 和 …...
基于Java Springboot线上约拍摄影预约微信小程序
一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui uniapp 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信开发者工…...
node.js基础学习-cheerio模块-简单小爬虫(五)
学习cheerio模块,简单做一个爬取图片网站的图片,并且将这些图片下载到本地指定的文件夹下,很多图片网站都有一些反爬取的机制,找的好几个都会报302错误,所以我找了一个小的图片网站,这个没有反爬取机制&…...
吾杯网络安全技能大赛WP(部分)
吾杯网络安全技能大赛WP(部分) MISC Sign 直接16进制解码即可 原神启动 将图片用StegSolve打开 找到了压缩包密码 将解出docx文件改为zip 找到了一张图片和zip 再把图片放到stegSlove里找到了img压缩包的密码 然后在document.xml里找到了text.zip压缩包密码 然后就出来fl…...
【python自动化一】pytest的基础使用
1.pytest简述 pytest 是一个功能强大且灵活的Python测试框架,其主要是用于流程控制,具体用于UI还是接口自动化根据个人需要而定。且其具有丰富插件,使用时较为方便。咱们具体看下方的内容,本文按照使用场景展开,不完…...
使用 CFD 仿真进行阀门性能分析:第 II 部分
了解如何使用 Ansys Discovery 通过优化模式获得准确的阀门性能结果。 第 II 部分:优化模式下的模拟 阀门的模拟可以在 Explore (探索) 模式和 Refine (优化) 模式下执行。Explore 模式允许快速仿真,在长达…...
Node.js实现WebSocket教程
Node.js实现WebSocket教程 1. WebSocket简介 WebSocket是一种在单个TCP连接上提供全双工通信的协议,允许服务器和客户端之间进行实时、双向通信。本教程将详细讲解如何在Node.js中实现WebSocket。 2. 技术选型 我们将使用ws库来实现WebSocket服务器,…...
使用 Statsmodels 进行统计建模与分析
使用 Statsmodels 进行统计建模与分析 Statsmodels 是 Python 中一个功能强大的库,用于执行统计建模和计量经济学分析。它提供了一系列经典的统计模型和评估方法,涵盖线性回归、时间序列分析和广义线性模型等。 本文将带你深入了解 Statsmodels 的功能…...
【Linux】进程间通信
目录 一、管道 (一)概念 (二)匿名管道 1、概念 2、函数介绍 3、示例代码 4、原理 (三)命名管道 1、概念 2、函数介绍 3、示例代码 4、原理 (四)管道的读写规则 &#x…...
Python 网络爬虫高级教程:分布式爬取与大规模数据处理
经过基础爬虫和进阶爬虫的学习,我们已经掌握了爬虫的基本原理、动态内容处理及反爬机制的应对。然而,当我们面对海量数据或需要高效爬取多个站点时,分布式爬虫和数据存储、处理能力就显得尤为重要。本篇博客将带你迈向网络爬虫的高级阶段&…...
猫爪背后的情感密码
当家中那只可爱的猫咪时不时用它的小爪子轻拍我们时,很多人或许只当作是调皮捣蛋,实则背后大有深意。 猫用爪子打,可能是在向我们发出玩耍的邀约。在猫咪的天性里,捕猎本能根深蒂固。它们在幼年时与同伴的嬉戏打闹,便…...
【自用】管材流转项目前端重部署流程 vue2 webpackage4 vuecli4
一、配置 1.下载项目,使用 IDEA 打开,并配置 Nodejs 它提示我,需要 Node.js,因为 nodejs 14 的 installer 已经官网已经找不到了,使用 fnm 又太麻烦, 所以直接采用在 IDEA 中下载的方式就好了。 2.清除缓…...
关于c的子进程 fork()
fork() 是一个非常重要的系统调用,用于在 Unix-like 操作系统中创建一个新的进程。它会将当前进程(父进程)复制成一个新的进程(子进程)。子进程会从父进程的代码处继续执行,但具有不同的进程 ID。 fork() …...
耀圣控制设备有限公司:优质压滤机阀门的引领者
耀圣控制设备有限公司:优质压滤机阀门的引领者 在压滤机阀门领域,耀圣控制设备有限公司以其卓越的品质和领先的技术,成为了行业内备受瞩目的品牌。 耀圣控制设备有限公司专注于压滤机阀门的研发与生产,凭借着先进的工艺和严格的质…...
【C语言】结构体(四)
本篇重点是typedef关键字 一,是什么? typedef用来定义新的数据类型,通常typedef与结构体的定义配合使用。 简单来说就是取别名 ▶ struct 是用来定义新的数据类型——结构体 ▶ typedef是给数据类型取别名。 二,为什么…...
面向源代码的软件可信度量模型 T_{na}
面向源代码的软件可信度量模型 T n a T_{na} Tna 课程:软件质量分析 作业 可编写下面的java程序: package org.example;public class SourceCodeOrientedModel {public static void main(String[] args) {int total 41;int[] m {9, 22, 9, 5, 7, 1…...
Java11使用JVM同一日志框架启用日志记录
你可以使用-Xlog选项配置或启用Java虚拟机同一日志框架的日志记录。 -Xlog:gc*trace:file/Users/xx/gc-%t.log:time,tags,level,pid,tid,hostname,path:filecount3,filesize10K -Xlog:gc*trace:stdout:time,tags,level,pid,tid,hostname:filecount3,filesize10K -Xlog:gc*trac…...
k8s容器存储接口 CSI 相关知识
容器存储接口 CSI 相关知识 参考: https://blog.csdn.net/lovely_nn/article/details/122880876 https://developer.aliyun.com/article/783464 https://www.cnblogs.com/varden/p/15139819.html存储商需实现 CSI 插件的 NodeGetVolumeStats 接口,Kube…...
JDBC相关
请解释一下 JDBC 是什么? JDBC(Java Database Connectivity)是 Java 语言访问数据库的标准 API。它提供了一套统一的接口,使得 Java 程序能够与各种不同的数据库进行交互。 请说明一下 JDBC 连接池的使用方法和优势。 使用方法…...
Github提交Pull Request教程 Git基础扫盲(零基础易懂)
1 PR是什么? PR,全称Pull Request(拉取请求),是一种非常重要的协作机制,它是 Git 和 GitHub 等代码托管平台中常见的功能,被广泛用于参与社区贡献,从而促进项目的发展。 PR的整个过…...
【计算机网络】实验7:默认路由和特定主机路由以及路由环路问题
实验 7:默认路由和特定主机路由以及路由环路问题 一、 实验目的 了解默认路由以及特定主机路由。 了解静态路由配置错误导致的路由环路问题。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、默认路由以及特定主机路由 (1) 第一步ÿ…...
RK3506 PINCTRL学习
引脚命名规则 Rockchip Pin 的 ID 按照 控制器 (bank) 端口 (port) 索引序号 (pin) 组成。 GPIO(通⽤输⼊输出) 控制器和GPIO控制器数量一致;端口固定A/B/C/D索引序号固定为0/1/2/3/4/5/6/7 每个控制器可以控制32个IO,作为GPIO功…...
NS4828 0.8A 线性同步移动电源管理芯片
1 特性 ● 内置固定 0.8A 的线性充电模式 ● 涓流/恒流/恒压三段式充电,支持 0V 电池充电 ● 充电输入端有防反灌功能,不需要防反灌二极管 ● 0.8A同步升压转换器 ● 同步放电固定 5.1V 输出 ● 双灯充放电 LED 灯指示 ● 支持自动负载检测 ● 双灯充电与…...
重生之学C++篇—算术操作符
一、算术操作符 在写代码的时候,一定会涉及到计算。为了方便运算,C提供了一系列的操作符,其中有一组操作符叫做算术操作符。分别是: 、 - 、 * 、 / 、 %,这些操作符都是双目操作符(有两个操作数ÿ…...
人机交互革命,为智能座舱市场激战注入一针「催化剂」
从AIGC到AGI赋能,智能座舱人机交互体验迎来新范式。 不断训练、迭代的大模型,为智能座舱带来了更全面的感知能力、更准确的认知理解,以及更丰富的交互模态,显著提升了其智能化水平。 “AI大模型的快速应用与迭代,推动…...
《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?“找不到mfc140u.dll文件”要怎么解决?教你几招轻松搞定
《只狼》运行时提示“mfc140u.dll文件缺失”的科普与解决方案 作为一名软件开发从业者,在游戏开发和维护过程中,我们经常会遇到各种运行时错误和系统报错。今天,我们就来探讨一下《只狼》这款游戏在运行时提示“mfc140u.dll文件缺失”的原因…...
VTK中矩阵vtkMatrix4x4类的介绍和使用
1、矩阵-齐次坐标介绍 常见的点一般是Pt(X,Y,Z),相当于一个13矩阵,而矩阵相乘的话一般是第一个矩阵的列数要等于第二个矩阵的行数。此处需要引入齐次坐标的概念:从广义上讲,齐次坐标就是用n1维向量表示n 维…...
STM32的OTA
STM32的OTA(Over-The-Air)是一种通过无线通信方式,为设备分发新软件、配置甚至更新加密密钥的技术。以下是对STM32 OTA的详细介绍: 一、OTA升级概述 OTA升级允许中心位置向所有用户发送更新,确保每个接收者都无法拒绝…...
【超图】iClient3D for Cesium 以动静结合方式加载WMTS服务
作者:taco 一、问题来源 在最近支持的项目中,我们面临一个挑战:客户需要在前端动态加载高达3亿级别的白模底面数据。这样做的主要原因是客户的数据库会频繁更新,因此我们需要采用动态加载的方式来确保用户界面能够实时反映最新的…...
2.STM32通信接口之SPI通信---SPI实战《精讲》
SPI仅支持一主多从(无应答机制) 参照:《第十一部分》1.STM32通信接口之SPI通信---SPI介绍《精讲》-CSDN博客 在采用一主多从的模式下。从机未被选中,SN1时,从机的MISO会处于高阻态状态,SN0时,M…...
WangEditor — 一个轻量级富文本编辑器
官网:https://www.wangeditor.com/ 介绍 在现代 Web 开发中,富文本编辑器是一个常见的工具,它允许用户输入、编辑和格式化内容。在众多富文本编辑器中,WangEditor 是一个轻量级、高效且易于使用的选择。它支持 HTML 格式的内容编…...
Redis 之持久化
目录 介绍 RDB RDB生成方式 自动触发 手动触发 AOF(append-only file) Redis 4.0 混合持久化 Redis主从工作原理 总结 介绍 Redis提供了两个持久化数据的能力,RDB Snapshot 和 AOF(Append Only FIle)…...
Scala的模式匹配
package hfdobject Test34 {def main(args: Array[String]): Unit {//身份证val id "429005202023210042"// val id "319005202023210042"// val id "119005202023210042"//val id "339005202023210042"//截取前两位val pre id.sub…...
学习笔记052——Spring Boot 自定义 Starter
文章目录 Spring Boot 自定义 Starter1、自定义一个要装载的项目2、创建属性读取类 ServiceProperties3、创建 Service4、创建自动配置类 AutoConfigration5、创建 spring 工程文件6、将项目打成 jar 包7、jar 打包到本地仓库8、配置application.yml Spring Boot 自定义 Starte…...
react学习记录Day2
Materal UI组件 1、Typography 文字铸排 使用文字铸排可以尽可能清晰、高效地展示您的设计和内容。 2、useTranslation 在React应用程序中,国际化(i18n)通常是通过使用专门的库来实现的,其中一个流行的库是react-i18next。这个…...