(九)现代循环神经网络(RNN):从注意力增强到神经架构搜索的深度学习演进

现代循环神经网络的内容,将介绍几种先进的循环神经网络架构,包括门控循环单元(GRU)、长短期记忆网络(LSTM)的变体,以及注意力机制等。这些内容将帮助你更深入地理解循环神经网络的发展和应用。

1 门控循环单元(GRU)

门控循环单元(Gated Recurrent Unit, GRU)是一种高效的循环神经网络架构,旨在解决传统RNN中的梯度消失和爆炸问题。GRU通过引入门控机制来控制信息的流动,使得模型能够更好地捕捉长期依赖关系,同时减少了参数数量,提高了训练效率。

1.1 GRU的核心机制

GRU的核心思想是将遗忘门和输入门合并为一个更新门(Update Gate),并引入重置门(Reset Gate)来控制信息的更新。这种设计使得GRU在保持性能的同时,减少了计算复杂度。

  • 更新门(Update Gate):决定前一时刻的隐藏状态有多少信息传递到当前时刻。
  • 重置门(Reset Gate):决定前一时刻的隐藏状态有多少信息用于计算当前时刻的候选隐藏状态。
1.2 GRU的数学表达

z t = σ ( W z ⋅ [ h t − 1 , x t ] + b z ) z_t = \sigma(W_z \cdot [h_{t-1}, x_t] + b_z) zt=σ(Wz[ht1,xt]+bz)

r t = σ ( W r ⋅ [ h t − 1 , x t ] + b r ) r_t = \sigma(W_r \cdot [h_{t-1}, x_t] + b_r) rt=σ(Wr[ht1,xt]+br)

h ~ t = tanh ⁡ ( W ⋅ [ r t ⋅ h t − 1 , x t ] + b ) \tilde{h}_t = \tanh(W \cdot [r_t \cdot h_{t-1}, x_t] + b) h~t=tanh(W[rtht1,xt]+b)

h t = ( 1 − z t ) ⋅ h t − 1 + z t ⋅ h ~ t h_t = (1 - z_t) \cdot h_{t-1} + z_t \cdot \tilde{h}_t ht=(1zt)ht1+zth~t

其中:

  • (x_t) 是当前时刻的输入。
  • (h_{t-1}) 是前一时刻的隐藏状态。
  • (W_z, W_r, W) 是权重矩阵。
  • (b_z, b_r, b) 是偏置项。
  • (\sigma) 是 sigmoid 激活函数。
  • (\tanh) 是双曲正切激活函数。
1.3 GRU的代码实现
import torch
import torch.nn as nnclass GRU(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(GRU, self).__init__()self.hidden_size = hidden_sizeself.gru_cell = nn.GRUCell(input_size, hidden_size)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x, h=None):batch_size = x.size(1)if h is None:h = torch.zeros(batch_size, self.hidden_size).to(x.device)outputs = []for t in range(x.size(0)):h = self.gru_cell(x[t], h)outputs.append(self.fc(h))return torch.stack(outputs), h# 测试GRU
if __name__ == "__main__":model = GRU(input_size=10, hidden_size=20, output_size=5)input_data = torch.randn(5, 3, 10)  # 序列长度5,批量大小3,输入特征10outputs, h_n = model(input_data)print(outputs.shape)  # 输出应为torch.Size([5, 3, 5])
1.4 GRU的优势
  • 计算效率高:GRU的结构比LSTM简单,训练速度更快。
  • 参数数量少:GRU的参数数量比LSTM少,适合资源受限的环境。
1.5 GRU的应用场景

GRU在多种序列建模任务中表现出色,包括但不限于:

  • 自然语言处理:文本分类、序列生成。
  • 语音识别:语音信号处理。
  • 时间序列预测:预测未来的数据点。

通过GRU的门控机制,模型能够有效地捕捉序列数据中的长期依赖关系,提高模型的性能和稳定性。

2 长短期记忆网络(LSTM)的变体

长短期记忆网络(LSTM)是一种强大的循环神经网络架构,能够有效处理序列数据中的长期依赖问题。在实际应用中,研究者们提出了多种LSTM的变体,以进一步提高模型的性能和效率。以下是几种常见的LSTM变体及其特点。

2.1 深度LSTM(Deep LSTM)

深度LSTM通过堆叠多个LSTM层来构建更深层次的模型。每一层的输出作为下一层的输入,从而增强模型的表示能力。

代码实现

import torch
import torch.nn as nnclass DeepLSTM(nn.Module):def __init__(self, input_size, hidden_size, output_size, num_layers):super(DeepLSTM, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersself.lstm = nn.LSTM(input_size, hidden_size, num_layers=num_layers, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)out, _ = self.lstm(x, (h0, c0))out = self.fc(out[:, -1, :])return out# 测试深度LSTM
if __name__ == "__main__":model = DeepLSTM(input_size=10, hidden_size=20, output_size=5, num_layers=2)input_data = torch.randn(3, 10, 10)  # 批量大小3,序列长度10,输入特征10output = model(input_data)print(output.shape)  # 输出应为torch.Size([3, 5])

特点

  • 增强表示能力:通过堆叠多个LSTM层,模型能够学习更复杂的特征层次。
  • 适合复杂任务:适用于需要强大表示能力的任务,如机器翻译、语音识别。
2.2 双向LSTM(Bidirectional LSTM)

双向LSTM包含两个LSTM层,一个处理正向序列,另一个处理反向序列。这种设计使得模型能够同时利用过去和未来的上下文信息。

代码实现

class BidirectionalLSTM(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(BidirectionalLSTM, self).__init__()self.hidden_size = hidden_sizeself.lstm = nn.LSTM(input_size, hidden_size, batch_first=True, bidirectional=True)self.fc = nn.Linear(hidden_size * 2, output_size)  # 两个方向的隐藏状态拼接def forward(self, x):out, _ = self.lstm(x)out = self.fc(out[:, -1, :])return out# 测试双向LSTM
if __name__ == "__main__":model = BidirectionalLSTM(input_size=10, hidden_size=20, output_size=5)input_data = torch.randn(3, 10, 10)  # 批量大小3,序列长度10,输入特征10output = model(input_data)print(output.shape)  # 输出应为torch.Size([3, 5])

特点

  • 利用双向信息:能够同时利用序列的过去和未来信息,提高模型的上下文理解能力。
  • 适合上下文相关任务:适用于需要上下文信息的任务,如情感分析、命名实体识别。
2.3 卷积LSTM(ConvLSTM)

卷积LSTM将卷积操作引入LSTM架构,适用于处理空间序列数据,如视频分析和气象数据预测。

数学表达
卷积LSTM的更新公式与标准LSTM类似,但使用卷积操作代替全连接操作。例如,遗忘门的更新公式为:
f t = σ ( W f ∗ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f \ast [h_{t-1}, x_t] + b_f) ft=σ(Wf[ht1,xt]+bf)
其中, ∗ \ast 表示卷积操作。

代码实现

import torch
import torch.nn as nnclass ConvLSTMCell(nn.Module):def __init__(self, input_size, hidden_size, kernel_size):super(ConvLSTMCell, self).__init__()self.hidden_size = hidden_sizeself.conv = nn.Conv2d(input_size + hidden_size, hidden_size * 4, kernel_size, padding=kernel_size // 2)def forward(self, x, state):h_prev, c_prev = statecombined = torch.cat([x, h_prev], dim=1)gates = self.conv(combined)gates = gates.chunk(4, 1)i = torch.sigmoid(gates[0])f = torch.sigmoid(gates[1])o = torch.sigmoid(gates[2])g = torch.tanh(gates[3])c_next = f * c_prev + i * gh_next = o * torch.tanh(c_next)return h_next, c_nextclass ConvLSTM(nn.Module):def __init__(self, input_size, hidden_size, kernel_size, num_layers):super(ConvLSTM, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersself.cells = nn.ModuleList([ConvLSTMCell(input_size if i == 0 else hidden_size, hidden_size, kernel_size)for i in range(num_layers)])def forward(self, x, states=None):if states is None:states = [None] * self.num_layersoutputs = []for t in range(x.size(1)):x_t = x[:, t, :, :, :]for i in range(self.num_layers):if states[i] is None:states[i] = (torch.zeros(x_t.size(0), self.hidden_size, x_t.size(2), x_t.size(3)).to(x.device),torch.zeros(x_t.size(0), self.hidden_size, x_t.size(2), x_t.size(3)).to(x.device))x_t, states[i] = self.cells[i](x_t, states[i])outputs.append(x_t)return torch.stack(outputs, dim=1), states# 测试ConvLSTM
if __name__ == "__main__":model = ConvLSTM(input_size=3, hidden_size=64, kernel_size=3, num_layers=2)input_data = torch.randn(2, 10, 3, 64, 64)  # 批量大小2,序列长度10,通道3,高度64,宽度64output, _ = model(input_data)print(output.shape)  # 输出应为torch.Size([2, 10, 64, 64, 64])

特点

  • 处理空间序列数据:适用于视频分析、气象数据等空间序列任务。
  • 保留空间信息:通过卷积操作保留空间特征。
2.4 注意力LSTM(Attention LSTM)

注意力LSTM通过引入注意力机制,使得模型能够动态地关注序列中的重要部分,提高模型对关键信息的捕捉能力。

代码实现

class AttentionLSTM(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(AttentionLSTM, self).__init__()self.hidden_size = hidden_sizeself.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.attention = nn.Linear(hidden_size, hidden_size)self.v = nn.Parameter(torch.rand(hidden_size))self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, (h_n, c_n) = self.lstm(x)# 计算注意力权重attention_scores = torch.bmm(out, self.v.repeat(out.size(0), 1, 1).permute(0, 2, 1))attention_weights = torch.softmax(attention_scores, dim=1)# 加权求和context = torch.bmm(attention_weights.permute(0, 2, 1), out)out = self.fc(context[:, -1, :])return out# 测试注意力LSTM
if __name__ == "__main__":model = AttentionLSTM(input_size=10, hidden_size=20, output_size=5)input_data = torch.randn(3, 10, 10)  # 批量大小3,序列长度10,输入特征10output = model(input_data)print(output.shape)  # 输出应为torch.Size([3, 5])

特点

  • 动态关注关键信息:通过注意力机制动态调整对序列中不同位置的关注程度。
  • 提升关键信息捕捉能力:适用于需要关注序列中关键部分的任务,如机器翻译、文本生成。
2.5 LayerNorm LSTM

LayerNorm LSTM通过在LSTM内部应用层归一化(Layer Normalization),提高模型的训练稳定性和收敛速度。

代码实现

class LayerNormLSTM(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(LayerNormLSTM, self).__init__()self.hidden_size = hidden_sizeself.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.layernorm = nn.LayerNorm(hidden_size)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.lstm(x)out = self.layernorm(out)out = self.fc(out[:, -1, :])return out# 测试LayerNorm LSTM
if __name__ == "__main__":model = LayerNormLSTM(input_size=10, hidden_size=20, output_size=5)input_data = torch.randn(3, 10, 10)  # 批量大小3,序列长度10,输入特征10output = model(input_data)print(output.shape)  # 输出应为torch.Size([3, 5])

特点

  • 提高训练稳定性:通过层归一化稳定隐藏状态的分布。
  • 加速收敛:归一化操作有助于加快模型的收敛速度。

这些LSTM的变体在不同的应用场景中各有优势。深度LSTM增强了模型的表示能力,双向LSTM利用了双向上下文信息,卷积LSTM适用于空间序列数据,注意力LSTM提升了对关键信息的捕捉能力,而LayerNorm LSTM提高了训练的稳定性和速度。根据具体任务的需求,可以选择合适的LSTM变体来构建模型。

3 注意力机制

注意力机制(Attention Mechanism)是一种允许模型在处理输入序列时动态关注不同部分的机制。它在自然语言处理、计算机视觉等多个领域取得了显著的成果。注意力机制通过计算输入序列中各个位置的重要性权重,使模型能够更好地捕捉关键信息。

3.1 注意力机制的核心思想

注意力机制的核心思想是让模型在处理每个时间步时,能够动态地关注输入序列中与当前任务最相关的部分。这种机制特别适用于处理长序列数据,因为它能够缓解长期依赖问题,使模型能够有效地捕捉序列中的重要信息。

3.2 注意力机制的类型
  1. Bahdanau Attention:这是最常用的注意力机制之一,通过计算隐藏状态与编码器输出的点积来得到注意力分数。
  2. 多头注意力(Multi-Head Attention):在变压器(Transformer)模型中广泛使用,通过多个注意力头来捕捉不同维度的信息。
  3. 自注意力(Self-Attention):用于捕捉序列内部不同位置之间的依赖关系。
3.3 Bahdanau Attention 的实现

以下是一个使用 Bahdanau Attention 的循环神经网络实现示例:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass BahdanauAttention(nn.Module):def __init__(self, hidden_size):super(BahdanauAttention, self).__init__()self.Wa = nn.Linear(hidden_size, hidden_size)self.Ua = nn.Linear(hidden_size, hidden_size)self(va) = nn.Parameter(torch.FloatTensor(hidden_size))def forward(self, decoder_hidden, encoder_outputs):# decoder_hidden: [batch_size, hidden_size]# encoder_outputs: [sequence_length, batch_size, hidden_size]sequence_length = encoder_outputs.size(0)batch_size = encoder_outputs.size(1)# 将解码器隐藏状态扩展到与编码器输出相同的序列长度decoder_hidden_expanded = self.Wa(decoder_hidden).unsqueeze(0).expand(sequence_length, -1, -1)# 计算注意力分数attention_scores = torch.tanh(self.Ua(encoder_outputs) + decoder_hidden_expanded)attention_scores = torch.matmul(attention_scores, self.va)# 计算注意力权重attention_weights = F.softmax(attention_scores, dim=0)# 加权求和得到上下文向量context_vector = torch.sum(attention_weights * encoder_outputs, dim=0)return context_vector, attention_weightsclass AttentionRNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(AttentionRNN, self).__init__()self.hidden_size = hidden_sizeself.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.attention = BahdanauAttention(hidden_size)self.fc = nn.Linear(hidden_size * 2, output_size)def forward(self, inputs, encoder_outputs):# inputs: [batch_size, sequence_length, input_size]# encoder_outputs: [sequence_length, batch_size, hidden_size]batch_size = inputs.size(0)sequence_length = inputs.size(1)# 初始化隐藏状态h0 = torch.zeros(1, batch_size, self.hidden_size).to(inputs.device)c0 = torch.zeros(1, batch_size, self.hidden_size).to(inputs.device)# LSTM编码器encoder_outputs, (hn, cn) = self.lstm(inputs, (h0, c0))# 初始化解码器隐藏状态decoder_hidden = hn.squeeze(0)# 解码器输入decoder_input = inputs[:, -1, :]# 计算注意力context_vector, attention_weights = self.attention(decoder_hidden, encoder_outputs)# 拼接解码器输入和上下文向量combined = torch.cat((decoder_hidden, context_vector), dim=1)# 全连接层output = self.fc(combined)return output, attention_weights# 测试注意力机制
if __name__ == "__main__":model = AttentionRNN(input_size=10, hidden_size=20, output_size=5)inputs = torch.randn(3, 10, 10)  # 批量大小3,序列长度10,输入特征10outputs, attention_weights = model(inputs, inputs.permute(1, 0, 2))print(outputs.shape)  # 输出应为torch.Size([3, 5])
3.4 注意力机制的应用场景
  • 自然语言处理:机器翻译、文本生成、问答系统。
  • 计算机视觉:图像描述生成、目标检测。
  • 语音识别:语音到文本的转换。
3.5 注意力机制的优势
  • 动态关注关键信息:注意力机制能够动态调整对序列中不同位置的关注程度,使模型更好地捕捉关键信息。
  • 提高模型性能:通过关注重要信息,注意力机制能够提高模型在多种任务上的性能。
  • 解释模型决策:注意力权重可以用于可视化模型的关注点,帮助理解模型的决策过程。

通过注意力机制,模型能够更有效地处理序列数据,捕捉长期依赖关系,提高任务性能。

4 循环神经网络的应用

循环神经网络(RNN)及其变体(如LSTM和GRU)在许多领域都有广泛的应用,尤其在处理序列数据方面表现出色。以下是一些典型的应用场景:

4.1 机器翻译

机器翻译是自然语言处理中的一个重要任务,目标是将一种语言的文本自动翻译成另一种语言。循环神经网络可以用于构建序列到序列(Seq2Seq)模型,该模型包含一个编码器和一个解码器,分别用于处理输入序列和生成输出序列。

import torch
import torch.nn as nn
import torch.nn.functional as Fclass Seq2Seq(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(Seq2Seq, self).__init__()self.encoder = nn.LSTM(input_size, hidden_size, batch_first=True)self.decoder = nn.LSTM(hidden_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, src, trg):# 编码器encoder_out, (hidden, cell) = self.encoder(src)# 解码器decoder_out, _ = self.decoder(trg, (hidden, cell))# 全连接层output = self.fc(decoder_out)return output# 测试机器翻译模型
if __name__ == "__main__":model = Seq2Seq(input_size=10, hidden_size=20, output_size=10)src = torch.randn(3, 10, 10)  # 源语言序列trg = torch.randn(3, 10, 10)  # 目标语言序列output = model(src, trg)print(output.shape)  # 输出应为torch.Size([3, 10, 10])
4.2 文本生成

文本生成任务的目标是生成与训练数据风格相似的新文本。循环神经网络可以通过学习文本的特征来生成新的文本序列。

class TextGenerator(nn.Module):def __init__(self, vocab_size, embedding_dim, hidden_size):super(TextGenerator, self).__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)self.gru = nn.GRU(embedding_dim, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, vocab_size)def forward(self, x, h=None):x = self.embedding(x)out, h = self.gru(x, h)out = self.fc(out)return out, h# 测试文本生成模型
if __name__ == "__main__":model = TextGenerator(vocab_size=1000, embedding_dim=128, hidden_size=256)input_data = torch.randint(0, 1000, (3, 10))  # 批量大小3,序列长度10output, _ = model(input_data)print(output.shape)  # 输出应为torch.Size([3, 10, 1000])
4.3 情感分析

情感分析是自然语言处理中的另一个重要任务,目标是确定文本表达的情感倾向(如积极、消极或中性)。循环神经网络可以用于处理文本序列并进行分类。

class SentimentAnalyzer(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SentimentAnalyzer, self).__init__()self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.lstm(x)out = self.fc(out[:, -1, :])return out# 测试情感分析模型
if __name__ == "__main__":model = SentimentAnalyzer(input_size=10, hidden_size=20, output_size=2)input_data = torch.randn(3, 10, 10)  # 批量大小3,序列长度10,输入特征10output = model(input_data)print(output.shape)  # 输出应为torch.Size([3, 2])
4.4 语音识别

语音识别任务的目标是将语音信号转换为文本。循环神经网络可以用于处理语音信号的特征序列并生成对应的文本。

class SpeechRecognizer(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SpeechRecognizer, self).__init__()self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.lstm(x)out = self.fc(out[:, -1, :])return out# 测试语音识别模型
if __name__ == "__main__":model = SpeechRecognizer(input_size=40, hidden_size=20, output_size=1000)input_data = torch.randn(3, 100, 40)  # 批量大小3,序列长度100,输入特征40output = model(input_data)print(output.shape)  # 输出应为torch.Size([3, 1000])
4.5 时间序列预测

时间序列预测任务的目标是根据历史数据预测未来的值。循环神经网络可以用于处理时间序列数据并进行预测。

class TimeSeriesPredictor(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(TimeSeriesPredictor, self).__init__()self.gru = nn.GRU(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.gru(x)out = self.fc(out[:, -1, :])return out# 测试时间序列预测模型
if __name__ == "__main__":model = TimeSeriesPredictor(input_size=1, hidden_size=20, output_size=1)input_data = torch.randn(3, 10, 1)  # 批量大小3,序列长度10,输入特征1output = model(input_data)print(output.shape)  # 输出应为torch.Size([3, 1])

循环神经网络在这些应用场景中发挥了重要作用,通过捕捉序列数据中的时间依赖关系,提高了模型的性能和准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛市与熊市:市场周期的双面镜

牛市推动资产增值与风险积累,熊市挤压泡沫并孕育机会,两者交替循环,构成市场自我调节机制。 1、概念对比:情绪与趋势的博弈 牛市(Bull Market):指资产价格持续上涨(通常涨幅超20%&a…

web程序设计期末复习-填空题

常用标签 块级标记 行内标记等 一、块级元素 特点&#xff1a; 独占一行可以设置宽度、高度、内外边距默认情况下会从上到下垂直排列 常见标签&#xff1a; 标签 含义 <div> 最常用的通用块级容器 <p> 段落 <h1>到<h6> 标题&#xff08;一级…

go全局配置redis,全局只需要连接一次,然后全局可以引用使用

创建redis文件夹、创建dadeRedis.go package redisimport ("context""github.com/go-redis/redis/v8""log""time" )var (client *redis.Clientctx context.Background() )// 初始化Redis连接&#xff08;建议在程序启动时调用&am…

缓冲区(C语言缓冲区+内核缓冲区)一个例子解释他们的关系和作用!!!

首先提出问题&#xff1a; 为什么以下代码是先sleep三秒后&#xff0c;屏幕才显示"XXXXXXX"。 #include<stdio.h> #include<unistd.h>int main() {printf("XXXXXXX");sleep(3);return 0; } 为什么以下代码是先显示"XXXXXXX"&#xf…

【2025版】Java 工程师学习路线图 —— 掌握程度描述版

✅【2025版】Java 工程师学习路线图 &#x1f4a1; 目标&#xff1a;成为合格的 Java 工程师&#xff08;前后端都要会&#xff09; &#x1f4dd; 结构清晰 | 阶段明确 | 掌握程度分级 | 适合自学或转行 &#x1f539; 阶段一&#xff1a;编程基础 计算机通识 模块内容推荐掌…

从零实现一个红队智能体

从零实现一个红队智能体(持续更新) 2025-06-09 背景&#xff1a;最近学了基础些东西和工具基础使用&#xff0c;发现一套流程下来太多需要手工要做的&#xff0c;就像自己能不能结合自己的技术栈实现小工具 &#x1f947; 第一步&#xff1a;从实用性开始分析 目标场景 希望…

Uniapp实现多选下拉框

文章目录 前言一、效果展示1.1 下拉效果图1.2 下拉选择效果图1.3 选择显示效果图 二、组件源码2.1.CustomCheckbox.vue源码2.2.niceui-popup-select.vue源码 三、demo.vue代码演示 前言 之前在使用Uniapp时&#xff0c;一直都是下拉框单选。今天某个项目需求需要使用Uniapp实现…

JavaScript-Array.from

Array.from() 是 JavaScript 中用于将类数组对象&#xff08;array-like&#xff09;或可迭代对象&#xff08;iterable&#xff09;转换为真实数组的一个非常有用的方法。 &#x1f4cc; 一、基本语法 Array.from(arrayLike, mapFn?, thisArg?)参数说明&#xff1a; 参数类…

二刷苍穹外卖 day02

新增员工 DTO 将前端传递的参数列表通过对应的实体类接收 当前端提交的数据和实体类中对应的属性差别较大时&#xff0c;使用DTO来封装数据 Data public class EmployeeDTO implements Serializable {private Long id;private String username;private String name;private…

通过Heron Handoff 插件我们在figma设计中可以像sketch导出离线标注

一、设计交付的历史困境与破局契机 在数字产品开发的全流程中&#xff0c;设计标注的高效传递始终是连接创意与实现的关键纽带。传统设计工具如 Sketch 凭借 Bluebeam、Sketch Measure 等插件构建了成熟的离线标注体系&#xff0c;设计师可将标注文件打包交付&#xff0c;开发…

SSE 数据的传输无法流式获取

问题 调试过程中发现SSE数据返回的时间都是一样的&#xff0c;怀疑是接口问题。 参考 EventSource数据一次性出来&#xff0c;并未流式输出的原因_sourceevent为什么结果一下全部返回了-CSDN博客 处理 EventStream 不能流式返回的问题&#xff1a;Nginx 配置优化 解决方案 …

markdown文本转换时序图

好久没更新了~这篇是markdown文本转换时序图的常用方法 文章目录 前言一、Mermaid语法示例二、PlantUML语法示例三、在线工具快速转换总结 前言 使用专业工具如Mermaid或PlantUML可以直接在Markdown中绘制时序图。这些工具支持简洁的语法&#xff0c;生成可嵌入文档的图表&…

谷粒商城-分布式微服务 -集群部署篇[一]

十九、k8s 集群部署 19.1 k8s 快速入门 19.1.1 简介 Kubernetes 简称 k8s。是用于自动部署&#xff0c;扩展和管理容器化应用程序的开源系统。 中文官网 中文社区 官方文档 社区文档 概述 | Kubernetes 传统部署时代&#xff1a; 早期&#xff0c;各个组织是在物理服务器上…

微信小程序- 用canvas生成排行榜

设计功能不是很复杂&#xff0c;也不想用插件&#xff0c;最终出现现在版本&#xff0c;主要用到微信小程序 wx.canvasToTempFilePath方法 // 直接调用改方法 createQRCode() {const qrCodeCanvasId "qrcodeCanvas";drawQrcode({width: 200,height: 200,canvasId: …

深度剖析:UI 设计怎样为小程序构建极致轻量体验

内容摘要 在小程序的世界里&#xff0c;用户都追求快速、便捷的轻量体验。但你是否好奇&#xff0c;为啥有些小程序能让人轻松上手&#xff0c;快速达成目标&#xff0c;而有些却让人感觉繁琐、卡顿&#xff1f;这里的关键差异&#xff0c;往往就藏在 UI 设计中。UI 设计到底施…

【网络安全】Qt免杀样本分析

初步研判 SHA256&#xff1a;9090807bfc569bc8dd42941841e296745e8eb18b208942b3c826b42b97ea67ff 我们可以看到引擎0检出&#xff0c;是个免杀样本&#xff0c;不过通过微步云沙箱的行为分析&#xff0c;已经被判为恶意 行为分析 进程行为 可以看到demo显示调用了winver获…

window 显示驱动开发-如何查询视频处理功能(六)

D3DDDICAPS_FILTERPROPERTYRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针&#xff0c;该结构包含传递D3DDDICAPS_FILTERPROPERTYRANGE请求类型时特定视频流上特定筛选器设置允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视…

Oracle线上故障问题解决

----重启电脑找不到sid Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor Could not open connection sqlplus "/as sysdba" SQL> shutdown immediate 数据库…

语音信号处理三十——高效多相抽取器(Polyphase+Noble)

文章目录 前言一、Polyphase 多项分解1.定义2.拆分公式3.推导过程1&#xff09;按模 M M M拆分求和项2&#xff09;提取因子 4.总结 二、Noble恒等式1. 定义2.Noble恒等式表达方式1&#xff09;抽取系统的 Noble 恒等式2&#xff09;插值系统的 Noble 恒等式 2.Nodble恒等式推导…

广告推荐系统中模型训练中模型的结构信息、Dense数据、Sparse数据

下面结合广告推荐系统常见的深度学习模型(比如 Wide & Deep、DeepFM、Two-Tower 等),介绍一下“模型的结构信息”、Dense 数据和 Sparse 数据在训练过程中的角色及处理方式。 模型结构信息 输入层(Input Layer) • Sparse 输入:各类离散高维特征(用户 ID、广告 ID、…