新手深入PyTorch中RNN、LSTM和GRU使用和理解

目录

torch.nn子模块Recurrent Layers

nn.RNNBase

RNNBase 类描述

RNNBase 类的功能和作用

flatten_parameters() 方法

示例代码

nn.RNN

RNN 类描述

RNN 类的功能和作用

RNN 类的参数

输入和输出

注意事项

示例代码

nn.LSTM

LSTM 类描述

LSTM 类的功能和作用

LSTM 类的参数

输入和输出

注意事项

示例代码

nn.GRU

GRU 类描述

GRU 类的功能和作用

GRU 类的参数

输入和输出

注意事项

示例代码

nn.RNNCell

RNNCell 类描述

RNNCell 类的功能和作用

RNNCell 类的参数

输入和输出

形状

变量

注意事项

示例代码

nn.LSTMCell

LSTMCell 类描述

LSTMCell 类的功能和作用

LSTMCell 类的参数

输入和输出

变量

注意事项

示例代码

nn.GRUCell

GRUCell 类描述

GRUCell 类的功能和作用

GRUCell 类的参数

输入和输出

形状

变量

注意事项

示例代码

总结


torch.nn子模块Recurrent Layers

nn.RNNBase

RNNBase 类描述

torch.nn.RNNBase 是 PyTorch 中用于构建循环神经网络的基类。它是 RNN、LSTM 和 GRU 等更具体的循环神经网络类的基础。下面将详细描述这个类和它的一个主要方法 flatten_parameters

RNNBase 类的功能和作用
  • 初始化: RNNBase 类提供了 RNN, LSTM, 和 GRU 这些子类的基本初始化参数。这包括输入大小(input_size)、隐藏层大小(hidden_size)、层数(num_layers)、使用偏置(bias)、是否以批处理为主(batch_first)、dropout 比例(dropout)、是否双向(bidirectional)等。

  • 参数管理: RNNBase 还提供了一些用于参数管理的实用方法,如参数的存储和重置。

  • 注意: RNNBase 类本身并不实现 forward 方法。这意味着你不能直接使用 RNNBase 来创建一个模型实例;它只是提供了一个共同的基础结构,用于构建各种类型的循环神经网络。

flatten_parameters() 方法
  • 作用: flatten_parameters 方法用于优化 RNN 的内部参数存储结构,从而使得 RNN 可以使用更快的代码路径进行计算。

  • 技巧: 这个方法尤其在使用 GPU 和启用 cuDNN 时非常有效。在这些条件下,它会重新设置参数数据指针,以优化内存访问模式和提高效率。

  • 注意事项: 当模块不在 GPU 上或者没有启用 cuDNN 时,flatten_parameters 将不起作用,也就是说,它在这种情况下是一个无操作(no-op)。

示例代码

下面是一个示例代码,展示了如何使用 LSTM (继承自 RNNBase)并在其中调用 flatten_parameters 方法。

import torch
import torch.nn as nn# 定义一个简单的 LSTM 网络
class SimpleLSTM(nn.Module):def __init__(self, input_size, hidden_size, num_layers):super(SimpleLSTM, self).__init__()self.lstm = nn.LSTM(input_size, hidden_size, num_layers)def forward(self, x):self.lstm.flatten_parameters()output, (hn, cn) = self.lstm(x)return output, hn, cn# 参数
input_size = 10
hidden_size = 20
num_layers = 2# 创建模型实例
model = SimpleLSTM(input_size, hidden_size, num_layers)# 示例输入
x = torch.randn(5, 3, input_size)  # (seq_length, batch, input_size)# 前向传播
output, hn, cn = model(x)

这段代码展示了如何创建一个简单的 LSTM 网络,它在每次前向传播前调用 flatten_parameters 方法以优化性能。在这里,x 是一个随机生成的输入张量,其维度是序列长度、批大小和输入大小。

nn.RNN

RNN 类描述

torch.nn.RNN 是 PyTorch 中用于构建一个简单的 Elman 循环神经网络(RNN)的类。它可以应用于输入序列,使用 tanhReLU 作为激活函数。下面将详细描述这个类的功能、参数和注意事项。

RNN 类的功能和作用
  • Elman RNN: 这个类实现了基本的 Elman RNN 架构。对于输入序列中的每个元素,每层 RNN 都会计算一个新的隐藏状态,该状态取决于当前输入和前一时间点的隐藏状态。

  • 激活函数: 可以选择使用 tanhReLU 作为非线性激活函数。

RNN 类的参数
  1. input_size: 输入特征的数量。
  2. hidden_size: 隐藏状态的特征数量。
  3. num_layers: RNN层的数量。例如,num_layers=2 表示两个 RNN 层堆叠在一起。
  4. nonlinearity: 使用的非线性激活函数,可以是 'tanh''relu'
  5. bias: 如果为 False,则层不使用偏置权重 b_ihb_hh
  6. batch_first: 如果为 True,则输入和输出张量的格式为 (batch, seq, feature);否则为 (seq, batch, feature)
  7. dropout: 如果非零,将在每个 RNN 层的输出上引入一个 Dropout 层,除了最后一层。
  8. bidirectional: 如果为 True,则变为双向 RNN。
输入和输出
  • 输入: input, h_0

    • input: 形状为 (seq_len, batch, input_size)(batch, seq_len, input_size)(如果 batch_first=True)的张量,包含输入序列的特征。
    • h_0: 形状为 (num_layers * num_directions, batch, hidden_size) 的张量,包含初始隐藏状态。如果未提供,默认为零。
  • 输出: output, h_n

    • output: 包含最后一层 RNN 的输出特征(h_t)的张量。
    • h_n: 形状为 (num_layers * num_directions, batch, hidden_size) 的张量,包含批次中每个元素的最终隐藏状态。
注意事项
  1. 权重和偏置的初始化: 所有权重和偏置都从均匀分布 U(-k, k) 初始化,其中 k = 1 / hidden_size
  2. 双向 RNN: 对于双向 RNN,前向和后向分别为方向 0 和 1。
  3. 非确定性问题: 在某些版本的 cuDNN 和 CUDA 上,RNN 函数可能存在非确定性问题。可以通过设置特定的环境变量来强制确定性行为。
  4. 特定条件下的性能优化: 在特定条件下(如使用 V100 GPU,数据在 GPU 上,数据类型为 torch.float16 等),cudnn 可以选择持久算法来提升性能。

示例代码

import torch
import torch.nn as nn# 创建 RNN 实例
rnn = nn.RNN(input_size=10, hidden_size=20, num_layers=2, nonlinearity='tanh')# 输入数据
input = torch.randn(5, 3, 10)  # (seq_len, batch, input_size)
h0 = torch.randn(2, 3, 20)     # (num_layers, batch, hidden_size)# 前向传播
output, hn = rnn(input, h0)

这段代码展示了如何创建一个简单的 RNN 网络并进行前向传播。在这个例子中,input 是一个随机生成的输入张量,其维度是序列长度、批大小和输入大小。h0 是初始隐藏状态。输出 output 包含了每个时间步的隐藏状态,而 hn 是最终的隐藏状态。

nn.LSTM

LSTM 类描述

torch.nn.LSTM 是 PyTorch 中用于构建长短期记忆(LSTM)网络的类。LSTM 是一种特殊类型的循环神经网络(RNN),特别适合处理和预测时间序列数据中的长期依赖关系。

LSTM 类的功能和作用
  • 长短期记忆: LSTM 通过引入“门”机制(包括输入门、遗忘门、输出门)来控制信息的保留和遗忘,这有助于解决传统 RNN 在长序列上训练时的梯度消失问题。
LSTM 类的参数
  1. input_size: 输入特征的数量。
  2. hidden_size: 隐藏状态的特征数量。
  3. num_layers: RNN层的数量。例如,num_layers=2 表示两个 LSTM 层堆叠在一起。
  4. bias: 如果为 False,则层不使用偏置权重 b_ihb_hh
  5. batch_first: 如果为 True,则输入和输出张量的格式为 (batch, seq, feature);否则为 (seq, batch, feature)
  6. dropout: 如果非零,将在每个 LSTM 层的输出上引入一个 Dropout 层,除了最后一层。
  7. bidirectional: 如果为 True,则变为双向 LSTM。
  8. proj_size: 如果大于 0,则使用带有投影的 LSTM。这将改变 LSTM 单元的输出维度和某些权重矩阵的形状。
输入和输出
  • 输入: input, (h_0, c_0)

    • input: 形状为 (seq_len, batch, input_size)(batch, seq_len, input_size)(如果 batch_first=True)的张量,包含输入序列的特征。
    • h_0: 形状为 (num_layers * num_directions, batch, hidden_size) 的张量,包含初始隐藏状态。
    • c_0: 形状为 (num_layers * num_directions, batch, hidden_size) 的张量,包含初始细胞状态。
  • 输出: output, (h_n, c_n)

    • output: 包含最后一层 LSTM 的输出特征(h_t)的张量。
    • h_n: 形状为 (num_layers * num_directions, batch, hidden_size) 的张量,包含序列中每个元素的最终隐藏状态。
    • c_n: 形状为 (num_layers * num_directions, batch, hidden_size) 的张量,包含序列中每个元素的最终细胞状态。
注意事项
  1. 权重和偏置的初始化: 所有权重和偏置都从均匀分布 U(-k, k) 初始化,其中 k = 1 / hidden_size
  2. 双向 LSTM: 对于双向 LSTM,h_noutput 的含义有所不同。h_n 包含最终的前向和后向隐藏状态,而 output 包含每个时间步的隐藏状态。
  3. 投影大小: proj_size 应小于 hidden_size
  4. 非确定性问题: 在某些版本的 cuDNN 和 CUDA 上,LSTM 函数可能存在非确定性问题。可以通过设置特定的环境变量来强制确定性行为。

示例代码

import torch
import torch.nn as nn# 创建 LSTM 实例
lstm = nn.LSTM(input_size=10, hidden_size=20, num_layers=2)# 输入数据
input = torch.randn(5, 3, 10)  # (seq_len, batch, input_size)
h0 = torch.randn(2, 3, 20)     # (num_layers, batch, hidden_size)
c0 = torch.randn(2, 3, 20)     # (num_layers, batch, hidden_size)# 前向传播
output, (hn, cn) = lstm(input, (h0, c0))

这段代码展示了如何创建一个 LSTM 网络并进行前向传播。在这个例子中,input 是一个随机生成的输入张量,其维度是序列长度、批大小和输入大小。h0c0 分别是初始隐藏状态和细胞状态。输出 output 包含了每个时间步的隐藏状态,而 (hn, cn) 是最终的隐藏状态和细胞状态。

nn.GRU

GRU 类描述

torch.nn.GRU 是 PyTorch 中用于构建门控循环单元(GRU)网络的类。GRU 是一种循环神经网络,类似于 LSTM,但结构更为简单,用于处理序列数据。

GRU 类的功能和作用
  • 门控机制: GRU 通过引入重置门(reset gate)和更新门(update gate)来控制信息的流动,这有助于捕捉序列数据中的长期依赖关系,并解决传统 RNN 的梯度消失问题。
GRU 类的参数
  1. input_size: 输入特征的数量。
  2. hidden_size: 隐藏状态的特征数量。
  3. num_layers: RNN层的数量。例如,num_layers=2 表示两个 GRU 层堆叠在一起。
  4. bias: 如果为 False,则层不使用偏置权重 b_ihb_hh
  5. batch_first: 如果为 True,则输入和输出张量的格式为 (batch, seq, feature);否则为 (seq, batch, feature)
  6. dropout: 如果非零,将在每个 GRU 层的输出上引入一个 Dropout 层,除了最后一层。
  7. bidirectional: 如果为 True,则变为双向 GRU。
输入和输出
  • 输入: input, h_0

    • input: 形状为 (seq_len, batch, input_size)(batch, seq_len, input_size)(如果 batch_first=True)的张量,包含输入序列的特征。
    • h_0: 形状为 (num_layers * num_directions, batch, hidden_size) 的张量,包含初始隐藏状态。
  • 输出: output, h_n

    • output: 包含最后一层 GRU 的输出特征(h_t)的张量。
    • h_n: 形状为 (num_layers * num_directions, batch, hidden_size) 的张量,包含序列中每个元素的最终隐藏状态。
注意事项
  1. 权重和偏置的初始化: 所有权重和偏置都从均匀分布 U(-k, k) 初始化,其中 k = 1 / hidden_size
  2. 双向 GRU: 对于双向 GRU,h_noutput 的含义有所不同。h_n 包含最终的前向和后向隐藏状态,而 output 包含每个时间步的隐藏状态。
  3. PyTorch中的GRU与原始论文的差异: PyTorch 中 GRU 的实现与原始论文在计算新门(new gate)时略有不同,这种差异是为了提高效率。
  4. 非确定性问题: 在某些版本的 cuDNN 和 CUDA 上,GRU 函数可能存在非确定性问题。可以通过设置特定的环境变量来强制确定性行为。

示例代码

import torch
import torch.nn as nn# 创建 GRU 实例
gru = nn.GRU(input_size=10, hidden_size=20, num_layers=2)# 输入数据
input = torch.randn(5, 3, 10)  # (seq_len, batch, input_size)
h0 = torch.randn(2, 3, 20)     # (num_layers, batch, hidden_size)# 前向传播
output, hn = gru(input, h0)

 这段代码展示了如何创建一个 GRU 网络并进行前向传播。在这个例子中,input 是一个随机生成的输入张量,其维度是序列长度、批大小和输入大小。h0 是初始隐藏状态。输出 output 包含了每个时间步的隐藏状态,而 hn 是最终的隐藏状态。

nn.RNNCell

RNNCell 类描述

torch.nn.RNNCell 是 PyTorch 中的一个模块,用于实现单个 Elman RNN 单元。这个类比完整的 RNN 类更为基础,它处理的是序列中的单个时间步,而不是整个序列。

RNNCell 类的功能和作用
  • 单时间步处理: RNNCell 适用于在自定义循环中一次处理一个时间步,这提供了对序列处理过程的更细粒度控制。
RNNCell 类的参数
  1. input_size (int): 输入特征的数量。
  2. hidden_size (int): 隐藏状态的特征数量。
  3. bias (bool): 如果为 False,则单元不使用偏置权重 b_ihb_hh。默认为 True
  4. nonlinearity (str): 使用的非线性激活函数,可以是 'tanh''relu'。默认为 'tanh'
输入和输出
  • 输入: input, hidden

    • input: 包含输入特征的张量。
    • hidden: 包含初始隐藏状态的张量。如果未提供,默认为零。
  • 输出: h'

    • h': 形状为 (batch, hidden_size) 的张量,包含批次中每个元素的下一个隐藏状态。
形状
  • input: 形状为 (N, H_in)(H_in) 的张量,其中 H_in = input_size
  • hidden: 形状为 (N, H_out)(H_out) 的张量,其中 H_out = hidden_size。如果未提供,默认为零。
  • output: 形状为 (N, H_out)(H_out) 的张量,包含下一个隐藏状态。
变量
  • weight_ih (torch.Tensor): 学习得到的输入-隐藏权重,形状为 (hidden_size, input_size)
  • weight_hh (torch.Tensor): 学习得到的隐藏-隐藏权重,形状为 (hidden_size, hidden_size)
  • bias_ih: 学习得到的输入-隐藏偏置,形状为 (hidden_size)
  • bias_hh: 学习得到的隐藏-隐藏偏置,形状为 (hidden_size)
注意事项
  • 权重和偏置的初始化: 所有权重和偏置都从均匀分布 U(-k, k) 初始化,其中 k = 1 / hidden_size

示例代码

import torch
import torch.nn as nn# 创建 RNNCell 实例
rnn = nn.RNNCell(10, 20)# 输入数据
input = torch.randn(6, 3, 10)  # (time_steps, batch, input_size)
hx = torch.randn(3, 20)        # (batch, hidden_size)# 模拟时间步循环
output = []
for i in range(6):hx = rnn(input[i], hx)output.append(hx)

这段代码展示了如何使用 RNNCell 来处理一个序列。在这个例子中,input 是一个随机生成的输入张量,其维度是时间步、批大小和输入大小。hx 是初始隐藏状态。循环通过逐个时间步调用 RNNCell 来更新 hx,并将每个时间步的输出收集到 output 列表中。

nn.LSTMCell

LSTMCell 类描述

torch.nn.LSTMCell 是 PyTorch 中用于构建单个长短期记忆(LSTM)单元的类。与 LSTM 类处理整个序列不同,LSTMCell 只处理序列中的单个时间步。

LSTMCell 类的功能和作用
  • 单时间步处理: LSTMCell 适用于在自定义循环中逐个时间步处理数据,这提供了对序列处理过程的更细粒度控制。
  • LSTM机制: 同 LSTM 类似,LSTMCell 使用输入门、遗忘门、输出门和细胞状态来控制和维持长期依赖关系。
LSTMCell 类的参数
  1. input_size (int): 输入特征的数量。
  2. hidden_size (int): 隐藏状态的特征数量。
  3. bias (bool): 如果为 False,则单元不使用偏置权重 b_ihb_hh。默认为 True
输入和输出
  • 输入: input, (h_0, c_0)

    • input: 形状为 (batch, input_size)(input_size) 的张量,包含输入特征。
    • h_0: 形状为 (batch, hidden_size)(hidden_size) 的张量,包含初始隐藏状态。
    • c_0: 形状为 (batch, hidden_size)(hidden_size) 的张量,包含初始细胞状态。
  • 输出: (h_1, c_1)

    • h_1: 形状为 (batch, hidden_size)(hidden_size) 的张量,包含下一个隐藏状态。
    • c_1: 形状为 (batch, hidden_size)(hidden_size) 的张量,包含下一个细胞状态。
变量
  • weight_ih (torch.Tensor): 学习得到的输入-隐藏权重,形状为 (4*hidden_size, input_size)
  • weight_hh (torch.Tensor): 学习得到的隐藏-隐藏权重,形状为 (4*hidden_size, hidden_size)
  • bias_ih: 学习得到的输入-隐藏偏置,形状为 (4*hidden_size)
  • bias_hh: 学习得到的隐藏-隐藏偏置,形状为 (4*hidden_size)
注意事项
  • 权重和偏置的初始化: 所有权重和偏置都从均匀分布 U(-k, k) 初始化,其中 k = 1 / hidden_size
  • 不同的设备精度: 在某些 ROCm 设备上,使用 float16 输入时,此模块的反向传播可能使用不同的精度。

示例代码

import torch
import torch.nn as nn# 创建 LSTMCell 实例
lstm_cell = nn.LSTMCell(10, 20)  # (input_size, hidden_size)# 输入数据
input = torch.randn(2, 3, 10)  # (time_steps, batch, input_size)
hx = torch.randn(3, 20)        # (batch, hidden_size)
cx = torch.randn(3, 20)        # (batch, hidden_size)# 模拟时间步循环
output = []
for i in range(input.size()[0]):hx, cx = lstm_cell(input[i], (hx, cx))output.append(hx)# 将输出堆叠起来
output = torch.stack(output, dim=0)

 这段代码展示了如何使用 LSTMCell 来处理一个序列。在这个例子中,input 是一个随机生成的输入张量,其维度是时间步、批大小和输入大小。hxcx 分别是初始隐藏状态和细胞状态。循环通过逐个时间步调用 LSTMCell 来更新 hxcx,并将每个时间步的隐藏状态收集到 output 列表中,最后将这些输出堆叠起来。

nn.GRUCell

GRUCell 类描述

torch.nn.GRUCell 是 PyTorch 中用于构建单个门控循环单元(GRU)的类。与完整的 GRU 类不同,GRUCell 专门处理序列中的单个时间步。

GRUCell 类的功能和作用
  • 单时间步处理: GRUCell 用于在自定义循环中逐步处理数据,允许在每个时间步进行更精细的控制。
  • GRU机制: 与 GRU 类似,GRUCell 使用更新门(update gate)和重置门(reset gate)来控制信息的流动,有效地捕捉序列数据中的长期依赖关系。
GRUCell 类的参数
  1. input_size (int): 输入特征的数量。
  2. hidden_size (int): 隐藏状态的特征数量。
  3. bias (bool): 如果为 False,则单元不使用偏置权重 b_ihb_hh。默认为 True
输入和输出
  • 输入: input, hidden

    • input: 包含输入特征的张量。
    • hidden: 包含初始隐藏状态的张量。如果未提供,默认为零。
  • 输出: h'

    • h': 包含批次中每个元素的下一个隐藏状态的张量。
形状
  • input: 形状为 (N, H_in)(H_in) 的张量,其中 H_in = input_size
  • hidden: 形状为 (N, H_out)(H_out) 的张量,其中 H_out = hidden_size。如果未提供,默认为零。
  • output: 形状为 (N, H_out)(H_out) 的张量,包含下一个隐藏状态。
变量
  • weight_ih (torch.Tensor): 学习得到的输入-隐藏权重,形状为 (3*hidden_size, input_size)
  • weight_hh (torch.Tensor): 学习得到的隐藏-隐藏权重,形状为 (3*hidden_size, hidden_size)
  • bias_ih: 学习得到的输入-隐藏偏置,形状为 (3*hidden_size)
  • bias_hh: 学习得到的隐藏-隐藏偏置,形状为 (3*hidden_size)
注意事项
  • 权重和偏置的初始化: 所有权重和偏置都从均匀分布 U(-k, k) 初始化,其中 k = 1 / hidden_size
  • 不同的设备精度: 在某些 ROCm 设备上,使用 float16 输入时,此模块的反向传播可能使用不同的精度。

示例代码

import torch
import torch.nn as nn# 创建 GRUCell 实例
gru_cell = nn.GRUCell(10, 20)  # (input_size, hidden_size)# 输入数据
input = torch.randn(6, 3, 10)  # (time_steps, batch, input_size)
hx = torch.randn(3, 20)        # (batch, hidden_size)# 模拟时间步循环
output = []
for i in range(6):hx = gru_cell(input[i], hx)output.append(hx)

这段代码展示了如何使用 GRUCell 来处理一个序列。在这个例子中,input 是一个随机生成的输入张量,其维度是时间步、批大小和输入大小。hx 是初始隐藏状态。循环通过逐个时间步调用 GRUCell 来更新 hx,并将每个时间步的输出收集到 output 列表中。

总结

         在这篇博客中,我们深入探索了 PyTorch 中的循环神经网络(RNN)相关的几个关键类:RNNBase, RNN, LSTM, GRU 及其对应的单元格版本 RNNCell, LSTMCell, GRUCell。每个类的功能、作用、参数和使用方法都得到了详细的解释和示例代码的支持。从基础的 RNN 架构到更复杂的 LSTM 和 GRU 结构,本文提供了深入了解这些强大的序列模型工具的机会,同时也展示了如何在实际场景中应用这些模型。这些类不仅对于理解序列数据的基本动态至关重要,而且在许多先进的深度学习应用中发挥着核心作用。

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

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

相关文章

05、Kafka ------ CMAK 各个功能的作用解释(主题和分区 详解,用命令行和图形界面创建主题和查看主题)

目录 CMAK 各个功能的作用解释(主题)★ 主题★ 分区★ 创建主题:★ 列出和查看主题 CMAK 各个功能的作用解释(主题) ★ 主题 Kafka 主题虽然也叫 topic,但它和 Pub-Sub 消息模型中 topic 主题及 AMQP 的 t…

【AI视野·今日NLP 自然语言处理论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 31 Oct 2023 (showing first 100 of 141 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers The Eval4NLP 2023 Shared Task on Prompting Large Language Models a…

nginx下日志配置和排查错误

目录 一:配置 二:排查日志 一:配置 在Nginx中,日志配置是记录服务器活动和排查问题的重要环节。以下是一些常见的Nginx日志配置选项: 日志级别:通过设置日志级别,可以控制日志的详细程度。常…

【心得杂记】简单聊聊限制高速面阵相机性能的因素

研究了限制高速面阵相机发展的因素,感觉就是揭开了薄雾面纱之后的复杂。 个人观点,不保证全对~ 欢迎讨论~ 高速相机是一个整体,涉及的各个零部件和模组很多,每个环节都会影响相机指标的提高。 高速相机主要包括的核心部件有&#…

什么是低代码开发平台(Low Code Platform) 有什么优势特点

低代码平台(Low Code Platform)是一种用于快速开发应用程序的软件开发平台。它通过可视化的界面和简化的开发工具,使开发人员能够使用少量的编码和配置来构建复杂的应用程序。 白码低代码平台是一种高效、灵活的软件开发工具,通过可视化的界面和少量的编…

vue3(十二)-基础入门之反向代理

一、反向代理 当遇到跨域问题时,可以通过反向代理解决跨域问题 1、创建一个与 package.json 同级的文件 vue.config.js vue.config.js : 代理以 /ajax 为开头的地址。代理服务器为 :https://www.xxxx.com const { defineConfig } requi…

普中STM32-PZ6806L开发板(HAL库函数实现-按键扫描)

简介 实现按键扫描, 实现四个按键按下控制灯的亮灭 电路原理图 按键电路原理图 按键与主芯片引脚原理图 其他知识 原理图分析 Key_UP按下会有高电平输入, 所以电路设置应该是默认低电平, 初始化为下拉输入 Key_Left/Right/Down按下会有低电平, 初始化为下拉输…

OpenHarmony从入门到放弃(四)

设计一款使用Harmony开发的App 接下来我会通过设计并开发一款资讯类的App来入门OpenHarmony; 以下是我对App的设计想法; 一、模块划分 内容模块:App的核心模块,负责管理和展示资讯内容,具体包括内容获取与处理&…

Winform、WPF如何解决前端卡死问题

在WinForms和WPF中,前端卡死问题通常是由于长时间的计算或阻塞操作导致的。以下是一些解决前端卡死问题的常见方法: 使用异步操作:将长时间的计算或阻塞操作放在后台线程中执行,以避免阻塞UI线程。可以使用Task、async/await等异步…

CSS 使用技巧

CSS 使用技巧 引入苹方字体 苹方提供了六个字重,font-family 定义如下:苹方-简 常规体font-family: PingFangSC-Regular, sans-serif;苹方-简 极细体font-family: PingFangSC-Ultralight, sans-serif;苹方-简 细体font-family: PingFangSC-Light, sans…

uniapp vue2 车牌号输入组件记录

uniapp vue2 车牌号输入案例记录 组件如图 直接上代码 1.html <template><view><view class"plate" :class"{show: show}"><view class"itemFirst flex-d"><view class"item item1" click"handl…

Ubuntu不能挂载移动硬盘

我有一个2T 的移动硬盘&#xff0c;分了两个区 不知道为啥突然之间一个分区老无法挂载&#xff0c;万能的重启也无法解决。 经查资料&#xff0c;这种情况一般是在使用时&#xff08;如看电影或者拷贝文件过程中&#xff09;将移动硬盘异常拔出再插入时&#xff0c;就提示不能…

学习录

概述 这几年在迷茫中看了不少资料&#xff0c;有觉得写得很棒的&#xff0c;也有写的很糟糕的。所以一直想写这块的总结来进行归纳&#xff0c;同时也希望能给其他处于迷茫中的朋友提供一份高质量的资料列表(也许一个读者也没有)&#xff0c;以下清单个人觉得值得反复看以及思…

Redis 教程

Redis 简介 Redis 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次…

Android低功耗蓝牙开发总结

基础使用 权限申请 蓝牙权限在各个版本中略有不同 Android 12 及以上版本&#xff0c;如果不需要通过蓝牙来推断位置的话&#xff0c;蓝牙扫描不需要开启位置权Android 11 及以下版本&#xff0c;蓝牙扫描必须开启位置权限Android 9 及以下版本&#xff0c;蓝牙扫描可开启粗…

【Turtle库】圣诞树

在寒冷的冬季&#xff0c;没有什么比一棵亮丽的圣诞树更能带给我们温暖和快乐。而现在&#xff0c;我们将使用Python编程语言来绘制这样一棵美丽的圣诞树。 首先&#xff0c;我们需要导入Python的turtle模块&#xff0c;它可以帮助我们绘制图形。然后&#xff0c;我们可以定义一…

《数字图像处理》 第11章 表示和描述 学习笔记附部分例子代码(c++opencv)

表示和描述 0. 前言1. 表示1.1 边界追踪1.2 链码1.3 使用最小周长多边形的多边形近似 2. 边界描绘子2.1 一些简单的描绘子![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/45dddc76217e4fde93a11e2631b2a71a.png#pic_center 500x)2.2 形状数2.3 傅里叶描绘子2.4 统计…

第11章 GUI Page462~476 步骤二十三 步骤二十四 Undo/Redo ①为Undo/Redo做准备工作,弹出日志窗口

step23和step24合起来学习 工程一 1.主窗口类中添加新的私有成员数据&#xff1a; 2 主窗口构造函数中&#xff0c;最后一行加入&#xff0c;用于调试的Log功能 3 鼠标弹起函数&#xff0c;添加Undo动作 4 编译之后报错&#xff1a;ActionLink不是一个类型 5 新增一个头文件…

Fast DDS 官方--C++ API Reference

Fast DDS 官方--C API Reference 1 介绍2 接口2.1 DDS DCPS PIM2.1.1 Core2.1.1.1 Entity 【基类】2.1.1.2 DomainEntity2.1.1.3 Policy 【枚举】2.1.1.3.1 DataRepresentationId2.1.1.3.2 DataRepresentationQosPolicy2.1.1.3.3 DataSharingQosPolicy2.1.1.3.4 DataSharingKin…

nginx连接数和性能优化

目录 一&#xff1a;介绍 二&#xff1a;优化配置 三&#xff1a;其他优化策略 一&#xff1a;介绍 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;具有许多用于优化连接数和性能的配置选项。以下是一些关键的配置和优化建议&#xff1a; 1&#xff1a;worker_proc…