PyTorch: torch.nn 子模块及其在循环神经网络中的应用

news2024/11/20 8:30:24

目录

torch.nn子模块详解

nn.utils.rnn.PackedSequence

参数说明

注意事项

示例代码

nn.utils.rnn.pack_padded_sequence

参数说明

返回值

注意事项

示例代码

nn.utils.rnn.pad_packed_sequence

参数说明

返回值

注意事项

示例代码

nn.utils.rnn.pad_sequence

参数说明

返回值

注意事项

示例代码

nn.utils.rnn.pack_sequence

参数说明

返回值

注意事项

示例代码

nn.utils.rnn.unpack_sequence

参数说明

返回值

注意事项

示例代码

nn.utils.rnn.unpad_sequence

参数说明

返回值

注意事项

示例代码

nn.Flatten

形状变换

参数

示例

nn.Unflatten

形状变换

参数

示例

总结


torch.nn子模块详解

nn.utils.rnn.PackedSequence

torch.nn 子模块是 PyTorch 框架的一部分,专门用于构建神经网络。这个模块提供了许多预定义的层(例如全连接层、卷积层、循环神经网络层),以及用于构建自定义网络结构的功能。torch.nn 的一个关键特点是它的模块和层是面向对象的,使得神经网络的构建和实验变得更加简洁和直观。

PackedSequence 类是 torch.nn.utils.rnn 模块中的一个重要类,专门用于处理循环神经网络中的变长序列。在处理像自然语言这样的序列数据时,不同的样本可能会有不同的长度。PackedSequence 允许有效地处理这种不等长的序列数据。

参数说明

  • data (Tensor): 包含打包序列的张量。
  • batch_sizes (Tensor): 包含每个序列步骤中批量大小的整数张量。
  • sorted_indices (Tensor, 可选): 包含如何从序列构建此 PackedSequence 的整数张量。
  • unsorted_indices (Tensor, 可选): 包含如何恢复具有正确顺序的原始序列的整数张量。

注意事项

  • 不应手动创建 PackedSequence 实例。它们应该由诸如 pack_padded_sequence() 之类的函数实例化。
  • batch_sizes 应始终是 CPU 上的 torch.int64 张量。
  • data 可以在任意设备上,有任意的数据类型。但 sorted_indicesunsorted_indices 必须是与 data 相同设备上的 torch.int64 张量。

示例代码

import torch
import torch.nn.utils.rnn as rnn_utils

# 假设我们有一些变长的序列数据
sequences = [torch.tensor([1,2,3]), torch.tensor([4,5]), torch.tensor([6])]
# 对序列进行填充并打包
padded_sequences = rnn_utils.pad_sequence(sequences, batch_first=True)
packed_sequences = rnn_utils.pack_padded_sequence(padded_sequences, batch_first=True, lengths=[3, 2, 1])

# 使用RNN处理打包的序列
rnn = torch.nn.RNN(input_size=1, hidden_size=5, batch_first=True)
output, hidden = rnn(packed_sequences.data.unsqueeze(-1))

# 解包序列
output, output_lengths = rnn_utils.pad_packed_sequence(output, batch_first=True)

在这个例子中,首先通过 pad_sequence 将不同长度的序列填充到相同的长度,然后使用 pack_padded_sequence 将填充后的序列打包。之后,使用 RNN 对这个打包后的序列进行处理。最后,通过 pad_packed_sequence 将输出解包。这种方法可以有效处理变长序列,同时提高 RNN 的效率和性能。

nn.utils.rnn.pack_padded_sequence

torch.nn.utils.rnn.pack_padded_sequence 是 PyTorch 中处理循环神经网络(RNN)时非常重要的一个函数。它用于将填充过的、长度不一的序列数据打包成一个 PackedSequence 对象,以便更高效地在 RNN 中使用。这个函数特别适用于处理像自然语言这样的序列数据,其中每个样本(例如一个句子)的长度可能不同。

参数说明

  • input (Tensor): 填充过的变长序列的批次。它可以是 T x B x * 的形状,其中 T 是最长序列的长度(等于 lengths[0]),B 是批量大小,* 是任意数量的维度(包括 0)。如果 batch_first 为 True,则期望输入为 B x T x * 的格式。
  • lengths (Tensor 或 list(int)): 每个批次元素的序列长度列表(如果提供为张量,则必须在 CPU 上)。
  • batch_first (bool, 可选): 如果为 True,则输入预期为 B x T x * 格式。
  • enforce_sorted (bool, 可选): 如果为 True,则输入应包含按长度递减排序的序列。如果为 False,则无条件对输入进行排序。默认值为 True。

返回值

  • 返回一个 PackedSequence 对象。

注意事项

  • 这个函数接受至少有两个维度的任何输入。你可以将它应用于打包标签,并将 RNN 的输出与它们一起用来直接计算损失。可以通过访问其 .data 属性从 PackedSequence 对象中检索张量。
  • 如果 enforce_sorted 为 True,则序列应按长度降序排序。这在准备进行 ONNX 导出时是必要的。

示例代码

import torch
import torch.nn.utils.rnn as rnn_utils

# 假设我们有填充过的变长序列和它们的长度
padded_sequences = torch.tensor([[1, 2, 3, 0], [4, 5, 0, 0], [6, 0, 0, 0]])
lengths = [3, 2, 1]

# 将填充过的序列打包
packed_sequences = rnn_utils.pack_padded_sequence(padded_sequences, lengths, batch_first=True)

# 现在可以将 packed_sequences 用于 RNN

在这个例子中,padded_sequences 包含三个序列,长度分别为 3、2 和 1。通过 pack_padded_sequence 函数,这些序列被有效地打包成一个 PackedSequence 对象,然后可以直接传递给 RNN 模块进行处理。这种方法有助于提高 RNN 在处理变长序列时的效率和性能。

nn.utils.rnn.pad_packed_sequence

torch.nn.utils.rnn.pad_packed_sequence 是 PyTorch 中用于处理循环神经网络(RNN)的一个重要函数。这个函数执行的是 pack_padded_sequence() 的逆操作,即它将 PackedSequence 对象解压缩并填充回原始维度的张量中。这在 RNN 处理完变长序列后,需要恢复到原始序列形状以进行进一步操作时非常有用。

参数说明

  • sequence (PackedSequence): 需要填充的打包序列批次。
  • batch_first (bool, 可选): 如果为 True,则输出将以 B x T x * 的格式排列。
  • padding_value (float, 可选): 用于填充元素的值。
  • total_length (int, 可选): 如果非 None,则输出将填充至长度为 total_length。如果 total_length 小于序列中的最大序列长度,则此方法将抛出 ValueError。

返回值

  • 返回一个元组,包含填充后的序列的张量,以及一个包含批次中每个序列长度的张量。批次元素将按照它们最初在 pack_padded_sequencepack_sequence 中被排列的顺序重新排序。

注意事项

  • total_length 参数在将序列打包 -> 通过循环网络处理 -> 解压序列的模式在 DataParallel 包装的模块中非常有用。有关详细信息,请参见相关的 FAQ 部分。

示例代码

from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence
import torch

# 假设有一些填充过的序列和它们的长度
seq = torch.tensor([[1, 2, 0], [3, 0, 0], [4, 5, 6]])
lens = [2, 1, 3]

# 将填充过的序列打包
packed = pack_padded_sequence(seq, lens, batch_first=True, enforce_sorted=False)

# 解压打包的序列
seq_unpacked, lens_unpacked = pad_packed_sequence(packed, batch_first=True)

print(seq_unpacked)  # 输出解压后的序列
print(lens_unpacked) # 输出解压后的序列长度

 在这个例子中,首先使用 pack_padded_sequence 将填充过的序列进行打包,然后通过 pad_packed_sequence 将打包的序列解压回原始的填充形式。这个过程在 RNN 模型处理变长序列后,需要将输出转换回可理解的形式时非常有用。

nn.utils.rnn.pad_sequence

torch.nn.utils.rnn.pad_sequence 是 PyTorch 中的一个用于处理循环神经网络(RNN)的有用函数。这个函数主要用于将长度不同的一系列张量(tensors)填充至相同的长度,从而可以将它们有效地组合成一个批次(batch)并用于 RNN 操作。

参数说明

  • sequences (list[Tensor]): 需要填充的不同长度序列的列表。
  • batch_first (bool, 可选): 如果为 True,则输出将以 B x T x * 的格式排列;如果为 False,则输出将以 T x B x * 的格式排列。默认为 False。
  • padding_value (float, 可选): 用于填充元素的值。默认值为 0。

返回值

  • 返回一个张量(Tensor),其大小为 T x B x *(如果 batch_first 为 False)或 B x T x *(如果 batch_first 为 True),其中 T 是最长序列的长度。

注意事项

  • 这个函数假设所有序列中的尾随维度和类型是相同的。
  • 这个函数通过在一个新的维度上堆叠一系列张量,并填充它们以使它们具有相同的长度,来工作。例如,如果输入是一系列大小为 L x * 的序列,并且 batch_first 为 False,则输出的大小为 T x B x *。

示例代码

from torch.nn.utils.rnn import pad_sequence
import torch

# 假设有几个不同长度的张量
a = torch.ones(25, 300)  # 第一个张量
b = torch.ones(22, 300)  # 第二个张量
c = torch.ones(15, 300)  # 第三个张量

# 使用 pad_sequence 来填充这些张量
padded_sequence = pad_sequence([a, b, c])

print(padded_sequence.size())  # 输出填充后的张量大小

 在这个例子中,三个不同长度的张量 abc 被填充至相同的长度(最长序列的长度,即 25)。pad_sequence 函数在一个新的维度上堆叠这些张量,并填充较短的张量以匹配最长的张量。这使得它们可以作为一个批次输入到 RNN 中。

nn.utils.rnn.pack_sequence

torch.nn.utils.rnn.pack_sequence 是 PyTorch 中用于处理循环神经网络(RNN)的一个有用函数。它用于将一系列不同长度的张量(tensors)打包成一个 PackedSequence 对象。这个函数实际上是 pad_sequencepack_padded_sequence 这两个函数的连续调用的简化版本。

参数说明

  • sequences (list[Tensor]): 一系列张量的列表,这些张量应按长度递减的顺序排列。
  • enforce_sorted (bool, 可选): 如果为 True,则检查输入是否包含按长度递减排序的序列。如果为 False,则不检查此条件。默认为 True。

返回值

  • 返回一个 PackedSequence 对象。

注意事项

  • 如果 enforce_sorted 为 True,序列应按长度降序排序。这在准备进行 ONNX 导出时是必要的。
  • 每个张量应该是大小为 L x * 的形状,其中 L 是序列的长度,* 是任意数量的尾随维度(包括零)。

示例代码

from torch.nn.utils.rnn import pack_sequence
import torch

# 创建几个不同长度的张量
a = torch.tensor([1, 2, 3])  # 第一个张量
b = torch.tensor([4, 5])     # 第二个张量
c = torch.tensor([6])        # 第三个张量

# 使用 pack_sequence 将这些张量打包
packed_sequence = pack_sequence([a, b, c])

print(packed_sequence)

在这个例子中,三个不同长度的张量 abc 被打包成一个 PackedSequence 对象。这个过程有助于后续将这些序列有效地输入到 RNN 中进行处理。这种方法特别适用于处理像自然语言这样的序列数据,其中每个样本(例如一个句子)的长度可能不同。 

nn.utils.rnn.unpack_sequence

torch.nn.utils.rnn.unpack_sequence 是 PyTorch 中用于处理循环神经网络(RNN)的一个函数。这个函数的作用是将 PackedSequence 对象解包成一系列不同长度的张量(tensors)。这通常在 RNN 处理完 PackedSequence 后,需要将其转换回原始序列形式时使用。

参数说明

  • packed_sequences (PackedSequence): 需要解包的 PackedSequence 对象。

返回值

  • 返回一个由张量(Tensor)对象组成的列表。

注意事项

  • unpack_sequence 函数是 pack_sequence 的逆过程,用于将经过 RNN 处理的数据转换回其原始序列的形式。
  • 请注意,PyTorch 中截至最后更新(2023年4月)并没有名为 unpack_sequence 的官方函数。通常情况下,使用 pad_packed_sequence 来完成类似的解包操作。如果 unpack_sequence 存在于某个特定版本的 PyTorch 中或是新添加的功能,可能需要查阅最新的官方文档以获取最准确的信息。

示例代码

from torch.nn.utils.rnn import pack_sequence, unpack_sequence
import torch

# 创建几个不同长度的张量
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5])
c = torch.tensor([6])

# 将这些张量打包成一个 PackedSequence
sequences = [a, b, c]
packed_sequences = pack_sequence(sequences)

# 解包 PackedSequence
unpacked_sequences = unpack_sequence(packed_sequences)

print(unpacked_sequences)

在这个例子中,pack_sequence 用于将几个不同长度的张量打包成一个 PackedSequence 对象,然后 unpack_sequence(假设该函数存在)用于将这个打包的对象解包成原始的序列列表。这个过程有助于在 RNN 中处理完数据后,将其恢复到可理解的形式。 

nn.utils.rnn.unpad_sequence

torch.nn.utils.rnn.unpad_sequence 是 PyTorch 中用于处理循环神经网络(RNN)的一个函数。它的作用是将填充过的张量(Tensor)解压缩成一系列原始长度的张量。这个函数在处理经过填充以适应批次处理要求的序列数据后,需要恢复到其原始长度的场景中非常有用。

参数说明

  • padded_sequences (Tensor): 已填充的序列。
  • lengths (Tensor): 原始(未填充)序列的长度。
  • batch_first (bool, 可选): 批次维度是否在前。默认为 False。

返回值

  • 返回一个由张量(Tensor)对象组成的列表。

注意事项

  • unpad_sequencepad_sequence 的逆过程,用于将填充后的序列恢复到其原始长度。
  • 这个函数对于处理那些因为批次处理要求而被填充过的序列数据特别有用,尤其是在序列数据处理完毕后需要还原到它们的原始形式时。

示例代码

from torch.nn.utils.rnn import pad_sequence, unpad_sequence
import torch

# 创建几个不同长度的张量
a = torch.ones(25, 300)
b = torch.ones(22, 300)
c = torch.ones(15, 300)
sequences = [a, b, c]

# 将这些张量填充成相同长度
padded_sequences = pad_sequence(sequences)
lengths = torch.as_tensor([v.size(0) for v in sequences])

# 将填充过的序列解压缩回原始长度
unpadded_sequences = unpad_sequence(padded_sequences, lengths)

# 验证解压缩是否正确
assert torch.allclose(sequences[0], unpadded_sequences[0])
assert torch.allclose(sequences[1], unpadded_sequences[1])
assert torch.allclose(sequences[2], unpadded_sequences[2])

在这个例子中,pad_sequence 用于将几个不同长度的张量填充至相同的长度,然后 unpad_sequence 用于将这些填充过的序列恢复到它们的原始长度。通过这样的处理,可以确保在批次处理中的序列数据能够在处理完毕后被正确地还原。 

nn.Flatten

torch.nn.Flatten 是 PyTorch 中的一个神经网络模块,用于将张量中指定范围的连续维度展平。它常用于卷积神经网络(CNN)到全连接层(Dense layer)的过渡,其中需要将多维特征映射转换为一维特征向量。

形状变换

  • 输入: 形状为 \left ( *,S_{start},...,S_{i},...,S_{end},* \right ) 的张量,其中 S_{i} 是第 i 维度的大小,∗ 表示包括零在内的任意数量的维度。
  • 输出: 形状为(*,\prod _{o=start}^{end}S_{i},*)的张量,即从 start_dimend_dim 维度的大小相乘得到的展平维度。

参数

  • start_dim (int): 开始展平的维度(默认为 1)。
  • end_dim (int): 结束展平的维度(默认为 -1)。

示例

  1. 默认参数:

import torch
import torch.nn as nn

input = torch.randn(32, 1, 5, 5)
m = nn.Flatten()
output = m(input)
print(output.size())  # 输出: torch.Size([32, 25])

 在这个例子中,Flatten 默认从第 1 维(第一个 1)开始,展平到最后一维,将 5×55×5 的二维特征映射转换为一维的 25 个特征。

    2. 非默认参数:

m = nn.Flatten(0, 2)
output = m(input)
print(output.size())  # 输出: torch.Size([160, 5])

在这个例子中,Flatten 从第 0 维开始,展平到第 2 维,即将原始的 32×1×532×1×5 形状的张量转换为 160×5160×5 的形状。

Flatten 模块在神经网络中非常有用,尤其是在需要处理多维数据并将其转换为一维数据以输入到全连接层的场景中。

nn.Unflatten

torch.nn.Unflatten 是 PyTorch 中的一个神经网络模块,用于将一个张量的指定维度展开为所需的形状。它通常用于神经网络中,尤其是在序列化的数据需要被还原为多维数据时,例如在将一维特征向量转换回原始的多维图像或序列格式。

形状变换

  • 输入: 形状为(∗,Sdim​,∗) 的张量,其中 S_{dim} 是在 dim 维度的大小,∗∗ 表示包括零在内的任意数量的维度。
  • 输出: 形状为(∗,U1​,...,Un​,∗) 的张量,其中 U 是 unflattened_size,且 \prod _{i=1}^{n}U_{i}=S_{dim}​。

参数

  • dim (Union[int, str]): 要展开的维度。
  • unflattened_size (Union[torch.Size, Tuple, List, NamedShape]): 展开维度的新形状。

示例

使用整数元组:

import torch
import torch.nn as nn

input = torch.randn(2, 50)
m = nn.Sequential(
    nn.Linear(50, 50),
    nn.Unflatten(1, (2, 5, 5))
)
output = m(input)
print(output.size())  # 输出: torch.Size([2, 2, 5, 5])

在这个例子中,Unflatten 将第 1 维展开为形状 (2, 5, 5)。

使用 torch.Size:

m = nn.Sequential(
    nn.Linear(50, 50),
    nn.Unflatten(1, torch.Size([2, 5, 5]))
)
output = m(input)
print(output.size())  # 输出: torch.Size([2, 2, 5, 5])

 使用命名形状(NamedShape):

input = torch.randn(2, 50, names=('N', 'features'))
unflatten = nn.Unflatten('features', (('C', 2), ('H', 5), ('W', 5)))
output = unflatten(input)
print(output.size())  # 输出: torch.Size([2, 2, 5, 5])

Unflatten 在需要对数据维度进行灵活操作的神经网络设计中非常有用,特别是在需要从平展的特征向量恢复到多维空间表示的情况下。

总结

本文介绍了 PyTorch 框架中 torch.nn 子模块的关键组成部分及其功能。这个模块提供了多种用于构建神经网络的预定义层,如全连接层、卷积层和循环神经网络层。特别强调了 torch.nn.utils.rnn 中的几个重要类和函数,如 PackedSequencepack_padded_sequencepad_packed_sequencepad_sequencepack_sequenceunpad_sequence,它们在处理变长序列时特别有用。此外,还介绍了 FlattenUnflatten 模块,这两个模块在处理多维数据时非常有用,前者将数据展平为一维,而后者则将一维数据还原为多维格式。整体上,本文提供了对 PyTorch 中重要网络构建模块的全面理解,强调了它们在实际应用中的重要性和灵活性。

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

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

相关文章

FPGA之按键消抖

目录 1.原理 2.代码 2.1 key_filter.v 2.2 tb_key_filter.v 1.原理 按键分为自锁式按键和机械按键,图左边为自锁式按键 上图为RS触发器硬件消抖,当按键的个数比较多时常常使用软件消抖。硬件消抖会使用额外的器件占用电路板上的空间。 思路就是使用延…

XS5018B是一款针对 CMOS 图像传感器的高性价比图像信号处理芯片

产品概述 XS5018B 是一款针对 CMOS 图像传感器的高性价比图像信号处理芯片,支持 1M/2M 像素 图像传感器,一组 10-bit DVP 输入接口, ISP 具备优异的 3D 降噪功能,标清模拟输出支持 960H , 高清模拟输出支…

NR cell配置带宽时,如何设置carrierBandwidth?

NR中带宽在38.101中有规定。 如上是FR1 38.101-1中与带宽设定有关的table,协议中根据SCS规定的传输带宽和可以配置的RB 数如上表,也就是说在实网下或者lab测试配置带宽时要根据上表内容去配置,举例如下。 如上图分别是几种带宽的配置参数&…

设备管理系统建设方案书

1.设备管理系统 1.1.系统概述 需求描述 建立设备信息库,对设备相关档案的登录、整理。通过建立完善的设备档案,将设备的各类原始信息进行信息化统一管理,使设备档案查询工作方便快捷,维修管理,针对维修计划、维修工单…

2024律师课程推荐:iCourt律师执行实务集训营(赠《执行实务大礼包》)

律师行业竞争激烈,想要突破困境,就一定要把握蓝海机遇,实现提早布局。 如今,还有哪些业务是尚未被“卷起来”的“蓝海业务”? 从数据来看,执行业务一定是其中之一。 在 Alpha 系统中,以“执行…

JAVA静态引擎企业网站源码带文档

JAVA静态引擎企业网站源码带文档 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站前台采用freemaker静态化模版引擎生成html5 2.因为是生成的html,无需重复读取数据库,所以访问速度快,轻便,对服务器…

Pytorch张量通过索引获取指定数据

import torch x torch.tensor([1,2,3])x Out[3]: tensor([1, 2, 3])x[0] # 索引操作:取单个数字 Out[4]: tensor(1)x[0:1] # 切片操作:可以保持维度不变 Out[5]: tensor([1])x[torch.tensor([True,False,True])] # 布尔值索引,通过条件筛…

程序员面试技巧:成为HR心动的程序猿

文章目录 程序员必备的面试技巧导语一、准备充分二、突出亮点三、展示解决问题的能力四、良好的沟通能力五、积极展示学习态度示例结语😶 写在结尾 程序员必备的面试技巧 “程序员必备的面试技巧,就像是编写一段完美的代码一样重要。在面试战场上&#…

探索Shadowsocks-Android:保护你的网络隐私

探索Shadowsocks-Android:保护你的网络隐私 I. 引言 在数字时代,网络隐私和安全变得愈发重要。我们越来越依赖互联网,但同时也面临着各种网络限制和监控。在这个背景下,Shadowsocks-Android应用程序应运而生,为用户提…

2024PMP考试新考纲-【过程领域】近期典型真题和超详细解析

前面的文章,华研荟讲解了三十多道PMP新考纲下的【人员People领域】的近年真题,这篇文章开始为大家分享【过程Process领域】的新考纲下的真题,进一步帮助大家体会和理解新考纲下PMP的考试特点和如何应用知识来解题,并且举一反三&am…

基于ZU19EG的100G-UDP解决方案

概述 本文档介绍ZU19EG与Mellanox CX6 100G网卡通信解决方案。 环境配置 FPGA硬件:519-ZU19EG的4路100G光纤PCIe加上计算卡 电脑:国产国鑫主板(双PCU):Gooxi G2DA-B CPU:Intel Xeon Silver 2.2GHz 内存&#xff1…

React入门 - 04(从编写一个简单的 TodoList 说起)

继上一节我们已经对 React组件和 ”JSX语法“有了大概的了解,这一节我们继续在 react-demo这个工程里编写代码。这一节我们来简单实现一个 TodoList来更加了解编写组件的一些细节。 1、在编辑器中打开 react-demo这个工程 2、打开 index.js文件,将组件 …

Mysql判断一个表中的数据是否在另一个表存在

方式一: 判断A表中有多少条数据在B表中【存在】,并且显示这些数据–EXISTS语句 select A.ID, A.NAME from 表A where EXISTS(select * from 表B where A.IDB.ID) 判断A表中有多少条数据在B表中【不存在】,并且显示这些数据–NOT EXISTS语句 select …

Zookeeper系列(一)集群搭建(非容器)

系列文章 Zookeeper系列(一)集群搭建(非容器) 目录 前言 下载 搭建 Data目录 Conf目录 集群复制和修改 启动 配置示例 测试 总结 前言 Zookeeper是一个开源的分布式协调服务,其设计目标是将那些复杂的且容易出错的分…

flex布局(3)

九、骰子 *{margin:0;padding: 0;box-sizing: border-box; } .flex{display: flex;flex-flow: row wrap;justify-content: space-between;align-items: center;align-content: space-between;padding:20px; } .touzi{width: 120px;height: 120px;background-color: aliceblue;…

Rabbitmq 消息可靠性保证

1、简介 消息的可靠性投递就是要保证消息投递过程中每一个环节都要成功,本文详细介绍两个环节的消息可靠性传递方式:1)、消息传递到交换机的 confirm 模式;2)、消息传递到队列的 Return 模式。 消息从 producer 到 ex…

智能化输电线路定位技术:提升电网运行效率的未来发展方向

随着科技的不断发展,电力行业也在逐步引入智能化技术,以提高输电线路的运行效率和安全性。在这篇文章中,恒峰智慧科技将探讨一种新的输电线路定位技术——分布式行波测量技术,它如何帮助我们实现这一目标。 一、分布式故障定位及隐…

STM32-创建工程模板

STM32 工程模板没有统一的格式,可以参考 ST 官方的示例模板或者根据自己的开发经验和使用习惯总结。 Project Template 文档以库函数工程模板为例,HAL 库工程模板对应参考即可。 Official Project Template ST 发布的标准外设库 (STM32 Standard Per…

docker搭建部署mysql并挂载指定目录

Docker是一种轻量级、可移植的容器化平台,可以简化应用程序的部署和管理。在本文中,我们将探讨如何使用Docker来搭建和部署MySQL数据库,并将数据和配置文件挂载到外部目录,以实现数据持久化和方便的配置管理。 1: 安装Docker 首…

git撤销提交到本地的commit

有些时候,当我们提交代码到本地后,突然发现因为某些原因需要撤销提交本地的代码。 就比如我,因为代码写错了分支,已经提交到本地了,而我需要取消,并且还要把代码搞得另外的分支上。 提交前: …