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

【自然语言处理(NLP)】长短期记忆网络(Long - Short Term Memory,LSTM)原理和代码实现(从零实现、Pytorch实现)

文章目录

  • 介绍
  • 长短期记忆网络(Long - Short Term Memory,LSTM)
    • 结构
    • 原理
      • 候选记忆元
        • 符号含义
        • 公式含义
      • 记忆元
        • 符号含义
        • 公式含义
      • 隐状态
        • 符号含义
        • 公式含义
    • 特点
    • 应用
    • 实现 LSTM
      • pytorch实现

个人主页:道友老李
欢迎加入社区:道友老李的学习社区

介绍

**自然语言处理(Natural Language Processing,NLP)**是计算机科学领域与人工智能领域中的一个重要方向。它研究的是人类(自然)语言与计算机之间的交互。NLP的目标是让计算机能够理解、解析、生成人类语言,并且能够以有意义的方式回应和操作这些信息。

NLP的任务可以分为多个层次,包括但不限于:

  1. 词法分析:将文本分解成单词或标记(token),并识别它们的词性(如名词、动词等)。
  2. 句法分析:分析句子结构,理解句子中词语的关系,比如主语、谓语、宾语等。
  3. 语义分析:试图理解句子的实际含义,超越字面意义,捕捉隐含的信息。
  4. 语用分析:考虑上下文和对话背景,理解话语在特定情境下的使用目的。
  5. 情感分析:检测文本中表达的情感倾向,例如正面、负面或中立。
  6. 机器翻译:将一种自然语言转换为另一种自然语言。
  7. 问答系统:构建可以回答用户问题的系统。
  8. 文本摘要:从大量文本中提取关键信息,生成简短的摘要。
  9. 命名实体识别(NER):识别文本中提到的特定实体,如人名、地名、组织名等。
  10. 语音识别:将人类的语音转换为计算机可读的文字格式。

NLP技术的发展依赖于算法的进步、计算能力的提升以及大规模标注数据集的可用性。近年来,深度学习方法,特别是基于神经网络的语言模型,如BERT、GPT系列等,在许多NLP任务上取得了显著的成功。随着技术的进步,NLP正在被应用到越来越多的领域,包括客户服务、智能搜索、内容推荐、医疗健康等。

长短期记忆网络(Long - Short Term Memory,LSTM)

在这里插入图片描述

长短期记忆网络(Long - Short Term Memory,LSTM)是一种特殊的循环神经网络(RNN),专门为解决传统RNN中的长期依赖问题和梯度消失/爆炸问题而设计,在自然语言处理、时间序列分析等领域广泛应用。

结构

LSTM 由记忆单元(Memory Cell)、输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate)构成。

  • 记忆单元:可以看作是LSTM的“记忆体”,它能够保存信息并在不同时间步传递,允许LSTM学习长期依赖关系。
  • 输入门:控制当前输入信息有多少能流入记忆单元。
  • 遗忘门:决定记忆单元中哪些过去的信息将被遗忘。
  • 输出门:确定记忆单元中的哪些信息将作为当前LSTM的输出。

原理

LSTM的设计灵感来源于计算机的逻辑门
在这里插入图片描述
在这里插入图片描述

  1. 遗忘门操作:在时间步 t t t,遗忘门接收上一时刻隐藏状态 h t − 1 h_{t - 1} ht1和当前输入 x t x_t xt,通过一个sigmoid函数输出一个介于0和1之间的值 f t f_t ft,该值表示记忆单元中每个元素的遗忘程度。 f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f\cdot[h_{t - 1}, x_t] + b_f) ft=σ(Wf[ht1,xt]+bf),其中 W f W_f Wf是权重矩阵, b f b_f bf是偏置, [ h t − 1 , x t ] [h_{t - 1}, x_t] [ht1,xt]表示将两者拼接, σ \sigma σ是sigmoid激活函数。
  2. 输入门操作:输入门首先通过sigmoid函数确定哪些新信息将被添加到记忆单元,记为 i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t=\sigma(W_i\cdot[h_{t - 1}, x_t]+b_i) it=σ(Wi[ht1,xt]+bi);同时,通过tanh函数生成一个候选值 C ~ t = tanh ⁡ ( W C ⋅ [ h t − 1 , x t ] + b C ) \tilde{C}_t=\tanh(W_C\cdot[h_{t - 1}, x_t]+b_C) C~t=tanh(WC[ht1,xt]+bC) 。然后,新的记忆单元状态 C t C_t Ct通过遗忘门的输出 f t f_t ft和输入门的相关计算来更新: C t = f t ∗ C t − 1 + i t ∗ C ~ t C_t = f_t * C_{t - 1}+i_t*\tilde{C}_t Ct=ftCt1+itC~t,其中 ∗ * 表示元素相乘。
  3. 输出门操作:输出门通过sigmoid函数确定记忆单元的哪些部分将被输出, o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t=\sigma(W_o\cdot[h_{t - 1}, x_t]+b_o) ot=σ(Wo[ht1,xt]+bo) 。然后,隐藏状态 h t h_t ht通过 h t = o t ∗ tanh ⁡ ( C t ) h_t = o_t * \tanh(C_t) ht=ottanh(Ct)计算得出。

候选记忆元

在这里插入图片描述
在这里插入图片描述

符号含义
  • 输入与隐藏状态
    • X t \mathbf{X}_t Xt:表示在时间步 t t t的输入矩阵,维度通常为 [ b a t c h _ s i z e , i n p u t _ s i z e ] [batch\_size, input\_size] [batch_size,input_size],其中 b a t c h _ s i z e batch\_size batch_size是批量大小, i n p u t _ s i z e input\_size input_size是每个样本的特征数量。
    • H t − 1 \mathbf{H}_{t - 1} Ht1:时间步 t − 1 t - 1 t1的隐藏层输出矩阵,维度是 [ b a t c h _ s i z e , h i d d e n _ s i z e ] [batch\_size, hidden\_size] [batch_size,hidden_size] h i d d e n _ s i z e hidden\_size hidden_size是隐藏层神经元数量,体现了LSTM的循环特性,即当前计算依赖于前一时刻隐藏状态。
  • 权重矩阵和偏置项
    • W x c \mathbf{W}_{xc} Wxc:输入层到记忆单元的权重矩阵,维度为 [ i n p u t _ s i z e , h i d d e n _ s i z e ] [input\_size, hidden\_size] [input_size,hidden_size],负责将输入特征转换到记忆单元相关的空间。
    • W h c \mathbf{W}_{hc} Whc:隐藏层到记忆单元的权重矩阵,维度是 [ h i d d e n _ s i z e , h i d d e n _ s i z e ] [hidden\_size, hidden\_size] [hidden_size,hidden_size],用于在前一时刻隐藏状态与当前输入共同作用时,对记忆单元相关计算进行变换。
    • b c \mathbf{b}_{c} bc:记忆单元的偏置向量,维度为 [ h i d d e n _ s i z e ] [hidden\_size] [hidden_size] ,给记忆单元的计算增加可学习的偏置值。
  • 激活函数
    • tanh ⁡ \tanh tanh:双曲正切激活函数,将函数值映射到 - 1 到 1 之间,为计算引入非线性。
公式含义

在LSTM中,候选记忆元 C ~ t \tilde{C}_t C~t的计算是记忆单元更新过程的一部分。公式 C ~ t = tanh ⁡ ( X t W x c + H t − 1 W h c + b c ) \tilde{C}_t=\tanh(\mathbf{X}_t\mathbf{W}_{xc}+\mathbf{H}_{t - 1}\mathbf{W}_{hc}+\mathbf{b}_{c}) C~t=tanh(XtWxc+Ht1Whc+bc)表示,先将当前时间步的输入 X t \mathbf{X}_t Xt与权重矩阵 W x c \mathbf{W}_{xc} Wxc相乘,同时将前一时间步的隐藏状态 H t − 1 \mathbf{H}_{t - 1} Ht1与权重矩阵 W h c \mathbf{W}_{hc} Whc相乘,然后将这两个乘积结果相加,再加上偏置 b c \mathbf{b}_{c} bc,最后通过 tanh ⁡ \tanh tanh激活函数对其进行非线性变换,得到候选记忆元 C ~ t \tilde{C}_t C~t

候选记忆元 C ~ t \tilde{C}_t C~t后续会与遗忘门、输入门的输出共同作用,用于更新记忆单元的状态,决定哪些新信息将被添加到记忆单元中。

记忆元

在这里插入图片描述
在这里插入图片描述

符号含义
  • 记忆单元状态相关
    • C t \mathbf{C}_t Ct:表示在时间步 t t t的记忆单元状态矩阵,维度为 [ b a t c h _ s i z e , h i d d e n _ s i z e ] [batch\_size, hidden\_size] [batch_size,hidden_size] b a t c h _ s i z e batch\_size batch_size是批量大小, h i d d e n _ s i z e hidden\_size hidden_size是隐藏层神经元数量。它存储了LSTM从过去时间步积累的信息。
    • C t − 1 \mathbf{C}_{t - 1} Ct1:时间步 t − 1 t - 1 t1的记忆单元状态矩阵,维度同样为 [ b a t c h _ s i z e , h i d d e n _ s i z e ] [batch\_size, hidden\_size] [batch_size,hidden_size],代表前一时刻记忆单元保存的信息。
    • C ~ t \tilde{\mathbf{C}}_t C~t:候选记忆元矩阵,维度是 [ b a t c h _ s i z e , h i d d e n _ s i z e ] [batch\_size, hidden\_size] [batch_size,hidden_size],它是通过对当前输入和上一时刻隐藏状态进行变换和非线性激活得到的,包含了可能要添加到记忆单元的新信息。
  • 门控向量
    • F t \mathbf{F}_t Ft:遗忘门向量,维度为 [ b a t c h _ s i z e , h i d d e n _ s i z e ] [batch\_size, hidden\_size] [batch_size,hidden_size],它通过sigmoid函数输出介于0和1之间的值,决定了 C t − 1 \mathbf{C}_{t - 1} Ct1中每个元素的遗忘程度,0表示完全遗忘,1表示完全保留。
    • I t \mathbf{I}_t It:输入门向量,维度是 [ b a t c h _ s i z e , h i d d e n _ s i z e ] [batch\_size, hidden\_size] [batch_size,hidden_size],同样由sigmoid函数生成,用于控制 C ~ t \tilde{\mathbf{C}}_t C~t中每个元素有多少将被添加到记忆单元中。
  • 运算符号
    • ⊙ \odot :表示哈达玛积(Hadamard product),即两个相同维度的矩阵对应元素相乘。
公式含义

公式 C t = F t ⊙ C t − 1 + I t ⊙ C ~ t \mathbf{C}_t = \mathbf{F}_t \odot \mathbf{C}_{t - 1} + \mathbf{I}_t \odot \tilde{\mathbf{C}}_t Ct=FtCt1+ItC~t描述了LSTM中记忆单元状态的更新过程:

  • 首先, F t ⊙ C t − 1 \mathbf{F}_t \odot \mathbf{C}_{t - 1} FtCt1这部分运算,通过遗忘门 F t \mathbf{F}_t Ft对前一时刻记忆单元状态 C t − 1 \mathbf{C}_{t - 1} Ct1进行选择性遗忘,丢弃不需要的历史信息。
  • 然后, I t ⊙ C ~ t \mathbf{I}_t \odot \tilde{\mathbf{C}}_t ItC~t表示利用输入门 I t \mathbf{I}_t It对候选记忆元 C ~ t \tilde{\mathbf{C}}_t C~t进行筛选,确定要添加到记忆单元的新信息。
  • 最后,将上述两部分结果相加,得到更新后的记忆单元状态 C t \mathbf{C}_t Ct,它融合了经过筛选的历史信息和新信息,为后续的隐藏状态计算和输出提供了重要的信息基础。

通过这样的更新机制,LSTM能够有效地处理长期依赖问题,有选择地保存和更新记忆单元中的信息。

隐状态

在这里插入图片描述
在这里插入图片描述

符号含义
  • LSTM组件输出
    • H t \mathbf{H}_t Ht:表示在时间步 t t t的隐藏状态矩阵,维度为 [ b a t c h _ s i z e , h i d d e n _ s i z e ] [batch\_size, hidden\_size] [batch_size,hidden_size] b a t c h _ s i z e batch\_size batch_size是批量大小, h i d d e n _ s i z e hidden\_size hidden_size是隐藏层神经元数量。它是LSTM在当前时间步的输出之一,会传递到下一时间步,也用于模型最终输出的计算等。
    • O t \mathbf{O}_t Ot:输出门向量,维度为 [ b a t c h _ s i z e , h i d d e n _ s i z e ] [batch\_size, hidden\_size] [batch_size,hidden_size],由sigmoid函数生成,取值介于0和1之间,用于控制记忆单元状态 C t \mathbf{C}_t Ct中信息有多少将被输出到隐藏状态。
    • C t \mathbf{C}_t Ct:时间步 t t t的记忆单元状态矩阵,维度同样为 [ b a t c h _ s i z e , h i d d e n _ s i z e ] [batch\_size, hidden\_size] [batch_size,hidden_size],存储了LSTM从过去时间步积累的信息。
  • 激活函数
    • tanh ⁡ \tanh tanh:双曲正切激活函数,将函数值映射到 - 1 到 1 之间,对记忆单元状态进行非线性变换。
  • 运算符号
    • ⊙ \odot :哈达玛积(Hadamard product),即两个相同维度的矩阵对应元素相乘。
公式含义

在LSTM中,隐藏状态 H t \mathbf{H}_t Ht的计算过程为:
首先,对记忆单元状态 C t \mathbf{C}_t Ct使用 tanh ⁡ \tanh tanh激活函数进行非线性变换,将其值映射到 - 1 到 1 的范围,突出记忆单元中重要的信息特征。
然后,输出门向量 O t \mathbf{O}_t Ot与经过 tanh ⁡ \tanh tanh变换后的记忆单元状态 tanh ⁡ ( C t ) \tanh(\mathbf{C}_t) tanh(Ct)进行哈达玛积运算。由于 O t \mathbf{O}_t Ot的值介于0和1之间,这一运算过程实现了对 tanh ⁡ ( C t ) \tanh(\mathbf{C}_t) tanh(Ct)中各元素的选择性输出,使得隐藏状态 H t \mathbf{H}_t Ht只包含记忆单元中被输出门允许输出的信息。

通过这样的计算方式,LSTM的隐藏状态能够根据当前任务需求,从记忆单元中筛选出合适的信息,为后续的预测、分类等任务提供有效的特征表示。

特点

  • 有效处理长期依赖:通过门控机制,LSTM能选择性地保留或遗忘信息,缓解了传统RNN的长期依赖问题。
  • 缓解梯度消失/爆炸:门控机制使得梯度在反向传播过程中更稳定,减少了梯度消失或爆炸的影响。

应用

  • 自然语言处理:如机器翻译、文本生成、情感分析等任务,利用LSTM处理文本序列中的语义依赖。
  • 语音识别:处理语音信号的时间序列信息,将语音转换为文本。
  • 时间序列预测:例如股票价格预测、电力负荷预测等,挖掘时间序列中的长期模式和趋势。

实现 LSTM

有了前面的RNN实现经验,这里就直接上完整代码了

import torch
from torch import nn
import dltoolsbatch_size, num_steps = 32, 35
train_iter, vocab = dltools.load_data_time_machine(batch_size, num_steps)# 初始化模型参数
def get_lstm_params(vocab_size, num_hiddens, device):num_inputs = num_outputs = vocab_sizedef normal(shape):return torch.randn(size=shape, device=device) * 0.01def three():return (normal((num_inputs, num_hiddens)),normal((num_hiddens, num_hiddens)),torch.zeros(num_hiddens, device=device))W_xi, W_hi, b_i = three() # 输入门参数W_xf, W_hf, b_f = three() # 遗忘门参数W_xo, W_ho, b_o = three() # 输出门参数W_xc, W_hc, b_c = three() # 候选记忆元参数# 输出层W_hq = normal((num_hiddens, num_outputs))b_q = torch.zeros(num_outputs, device=device)# 附加梯度params = [W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q]for param in params:param.requires_grad_(True)return params# 初始化隐藏状态和记忆
def init_lstm_state(batch_size, num_hiddens, device):return (torch.zeros((batch_size, num_hiddens), device=device),torch.zeros((batch_size, num_hiddens), device=device))# 定义lstm主体结构
def lstm(inputs, state, params):[W_xi, W_hi, b_i, W_xf, W_hf, b_f, W_xo, W_ho, b_o, W_xc, W_hc, b_c, W_hq, b_q] = params(H, C) = stateoutputs = []# 准备开始进行前向传播计算. for X in inputs:I = torch.sigmoid((X @ W_xi) + (H @ W_hi) + b_i)F = torch.sigmoid((X @ W_xf) + (H @ W_hf) + b_f)O = torch.sigmoid((X @ W_xo) + (H @ W_ho) + b_o)C_tilda = torch.tanh((X @ W_xc) + (H @ W_hc) + b_c)C = F * C + I * C_tildaH = O * torch.tanh(C)Y = (H @ W_hq) + b_qoutputs.append(Y)return torch.cat(outputs, dim=0), (H, C)# 训练和预测
vocab_size, num_hiddens, device =  len(vocab), 256, dltools.try_gpu()
# 可自己调整epoch和学习率
num_epochs, lr = 500, 1
model = dltools.RNNModelScratch(len(vocab), num_hiddens, device, get_lstm_params, init_lstm_state, lstm)
dltools.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

pytorch实现

num_inputs = vocab_size
lstm_layer = nn.LSTM(num_inputs, num_hiddens)
model = dltools.RNNModel(lstm_layer, len(vocab))
model = model.to(device)
dltools.train_ch8(model, train_iter, vocab, lr, num_epochs, device)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

【自然语言处理(NLP)】长短期记忆网络(Long - Short Term Memory,LSTM)原理和代码实现(从零实现、Pytorch实现)

文章目录 介绍长短期记忆网络(Long - Short Term Memory,LSTM)结构原理候选记忆元符号含义公式含义 记忆元符号含义公式含义 隐状态符号含义公式含义 特点应用实现 LSTMpytorch实现 个人主页:道友老李 欢迎加入社区:道…...

八股学习 微服务篇

微服务篇 常见面试内容Spring Cloud 常见组件注册中心Ribbon负载均衡策略服务雪崩 常见面试内容 Spring Cloud 常见组件 Spring Cloud有5个常见组件: Eureka/Nacos:注册中心;Ribbon:负载均衡;Feign:远程调用;Hystrix/Sentinel:服…...

TCP协议:互联网数据传输的守护者

在互联网的浩瀚海洋中,数据如同涓涓细流,无时无刻不在流动。而这些数据的稳定、可靠传输,离不开一个重要的协议——TCP(Transmission Control Protocol,传输控制协议)。TCP协议作为互联网协议族中的核心成员…...

协助工具-任意门导航

任意门导航网址:随意门导航-最全的实用导航网站,好用简洁宝藏网址神器...

【MCAL实战】MCU模块配置实践

目录 前言 正文 1.硬件分析 1.1 MCU系统模式分析 1.2MCU晶振使用分析 2.MCU通用配置 2.1 McuGeneralConfiguration 2.2 McuModuleConfiguration 2.3 McuResetSettingConf 2.4 McuTrapSettingConf 2.4 其他 3.MCU模式配置 3.1 McuModeSettingConf_0 3.2 McuModeSe…...

OpenAI 发布首个 AI 智能体

OpenAI 发布首个 AI 智能体 当地时间 1 月 23 日,OpenAI 发布了首个 AI 智能体 Operator124。以下是关于它的详细介绍2: 功能用途 操作网页:可模拟人类操作网页浏览器,能进行点击、滚动、输入等操作,例如在 OpenTable…...

【Python】导入类

随着不断给类添加功能,文件可能变得很长,即便妥善地使用了继承亦如此。为遵循Python的总体理念,应让文件尽可能整洁。 Python在这方面提供了帮助,允许将类存储在模块中,然后在主程序中导入所需的模块。 导入单个类 下…...

Deepseek实现本地电影文件批量重命名为infuse格式,可匹配IMDB

import os from openai import OpenAI# 初始化DeepSeek客户端 client OpenAI(api_key"<DeepSeek API Key>", base_url"https://api.deepseek.com")def parse_filename_with_deepseek(filename):"""使用DeepSeek API解析文件名并生成…...

Nginx部署的前端项目刷新404问题

1&#xff0c;查看问题 我部署的81端口是监听tlias项目的&#xff0c;我直接访问端口页面可以出现内容。 我在浏览器舒服端口之后回车&#xff0c;会重定向页面。但是我在重定向之后的页面刷新浏览器就会出现404的问题。 下面是刷新浏览器后的效果 2&#xff0c;在nginx.cnf …...

Boot 系统选择U启动

1.进入Boot 系统 F2 或 Del Boot --->Boot 0ption Priorities #4 KingstwongDataTravele 是U盘 调整搭到#1 2.保持重启就好...

XSLT 编辑 XML:深度解析与实际应用

XSLT 编辑 XML&#xff1a;深度解析与实际应用 引言 XML&#xff08;可扩展标记语言&#xff09;和XSLT&#xff08;可扩展样式表语言转换&#xff09;是处理和转换XML数据的重要工具。本文将深入探讨XSLT在编辑XML文档中的应用&#xff0c;包括其基本概念、语法结构、以及实…...

项目文章 | PNAS 斑马鱼转录因子ChIP-seq助力解析GATA6突变相关的肝脏疾病机制

近日&#xff0c;西南大学阮华/黄红辉团队联合重庆大学邱菊辉/王贵学团队在PNAS发表了题为“An animal model recapitulates human hepatic diseases associated with GATA6 mutations”的研究论文。该研究构建了一个gata6敲除斑马鱼模型&#xff0c;它重现了gata6突变患者的大…...

easyexcel-导入(读取)(read)-示例及核心部件

文章目录 导入(读取)(read)-示例及核心部件导入(读取)(read)-核心部件EasyExcel(EasyExcelFactory) # 入口read() # read()方法用于构建workbook(工作簿)对象&#xff0c;new ExcelReaderBuilder()doReadAll()这里选XlsxSaxAnalyser这个实现类吧然后到这个类XlsxRowHandler&…...

作业day3

请使用dup2 fgets printf 实现文件拷贝功能、 文件1&#xff1a; 复后文件&#xff1a; #define BUFFER_SIZE 1024 void file_copy(const char* src_file, const char* dest_file) { int src_fd, dest_fd; char buffer[BUFFER_SIZE]; // 打开源文件 src_fd open(s…...

第五节 MATLAB命令

本节的内容将提供常用的一些MATLAB命令。 在之前的篇章中我们已经知道了MATLAB数值计算和数据可视化是一个交互式程序&#xff0c;在它的命令窗口中您可以在MATLAB提示符“>>”下键入命令。 MATLAB管理会话的命令 MATLAB提供管理会话的各种命令。如下表所示&#xff1a;…...

Oracle 普通用户连接hang住处理方法

一、现象说明 $ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Wed Dec 18 16:49:19 2024 Version 19.11.0.0.0Copyright (c) 1982, 2020, Oracle. All rights reserved.Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Pro…...

理解C++中的右值引用

右值引用&#xff0c;顾名思义&#xff0c;就是对一个右值进行引用&#xff0c;或者说给右值一个别名。右值引用的规则和左值一用一模一样&#xff0c;都是对一个值或者对象起个别名。 1. 右值引用和左值引用一样&#xff0c;在定义的同时必须立即赋值&#xff0c;如果不立即赋…...

02-机器学习-核心概念

以下是机器学习核心概念的详细梳理。 1. 机器学习三大范式 类型定义典型应用监督学习使用带标签的数据训练模型&#xff0c;预测未知数据的标签。分类&#xff08;邮件垃圾过滤&#xff09;、回归&#xff08;房价预测&#xff09;无监督学习从无标签的数据中发现隐藏模式或结…...

1.26 实现文件拷贝的功能

使用dup2fgetsprintf实现文件拷贝的功能。 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #in…...

ES6+新特性,var、let 和 const 的区别

在 JavaScript 中&#xff0c;var、let 和 const 都用于声明变量&#xff0c;但它们有一些重要的区别&#xff0c;主要体现在 作用域、可变性和提升机制 等方面。 1. 作用域&#xff08;Scope&#xff09; var: var 声明的变量是 函数作用域&#xff0c;也就是说&#xff0c;它…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...