PyTorch: torch.nn 子模块及其在循环神经网络中的应用
目录
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_indices
和unsorted_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_sequence
或pack_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()) # 输出填充后的张量大小
在这个例子中,三个不同长度的张量 a
、b
和 c
被填充至相同的长度(最长序列的长度,即 25)。pad_sequence
函数在一个新的维度上堆叠这些张量,并填充较短的张量以匹配最长的张量。这使得它们可以作为一个批次输入到 RNN 中。
nn.utils.rnn.pack_sequence
torch.nn.utils.rnn.pack_sequence
是 PyTorch 中用于处理循环神经网络(RNN)的一个有用函数。它用于将一系列不同长度的张量(tensors)打包成一个 PackedSequence
对象。这个函数实际上是 pad_sequence
和 pack_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)
在这个例子中,三个不同长度的张量 a
、b
和 c
被打包成一个 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_sequence
是pad_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)的过渡,其中需要将多维特征映射转换为一维特征向量。
形状变换
- 输入: 形状为
的张量,其中
是第 i 维度的大小,∗ 表示包括零在内的任意数量的维度。
- 输出: 形状为
的张量,即从
start_dim
到end_dim
维度的大小相乘得到的展平维度。
参数
start_dim (int)
: 开始展平的维度(默认为 1)。end_dim (int)
: 结束展平的维度(默认为 -1)。
示例
-
默认参数:
import torch
import torch.nn as nninput = 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,∗) 的张量,其中
是在
dim
维度的大小,∗∗ 表示包括零在内的任意数量的维度。 - 输出: 形状为(∗,U1,...,Un,∗) 的张量,其中 U 是
unflattened_size
,且。
参数
dim (Union[int, str])
: 要展开的维度。unflattened_size (Union[torch.Size, Tuple, List, NamedShape])
: 展开维度的新形状。
示例
使用整数元组:
import torch
import torch.nn as nninput = 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
中的几个重要类和函数,如 PackedSequence
、pack_padded_sequence
、pad_packed_sequence
、pad_sequence
、pack_sequence
、unpad_sequence
,它们在处理变长序列时特别有用。此外,还介绍了 Flatten
和 Unflatten
模块,这两个模块在处理多维数据时非常有用,前者将数据展平为一维,而后者则将一维数据还原为多维格式。整体上,本文提供了对 PyTorch 中重要网络构建模块的全面理解,强调了它们在实际应用中的重要性和灵活性。
相关文章:
PyTorch: torch.nn 子模块及其在循环神经网络中的应用
目录 torch.nn子模块详解 nn.utils.rnn.PackedSequence 参数说明 注意事项 示例代码 nn.utils.rnn.pack_padded_sequence 参数说明 返回值 注意事项 示例代码 nn.utils.rnn.pad_packed_sequence 参数说明 返回值 注意事项 示例代码 nn.utils.rnn.pad_sequence …...

【QT】自定义代理类
目录 1 我们为什么要使用自定义代理类? 2 自定义代理类的基本设计要求 3 自定义代理的功能 4 基于QSpinBox的自定义代理类 5 自定义代理类的使用 1 我们为什么要使用自定义代理类? 传统的模型-视图框架可以让我们实现逻辑展示相分离,我们…...

线程休眠、线程让步、线程优先级相关内容学习笔记
1、线程休眠 (1)sleep() 如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态(Timed_Waiting),则可以通过调用Thread类的静态sleep()方法来实现。 static void sleep(long millis):让当前正在执行的线…...

paddle指定运行gpu
在PaddlePaddle中指定使用GPU进行运行非常简单。首先,确保你的机器上已经安装了CUDA和cuDNN,并且正确配置了GPU环境。然后,按照以下步骤进行操作: 导入PaddlePaddle库: import paddle设置使用的设备为GPU:…...

Java异常及网络编程
异常续 throws关键字 当一个方法中使用throw抛出一个非RuntimeException的异常时,就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常,否则编译不通过。 package exception; /*** 测试异常的抛出*/ public clas…...

通过 Elastic Stack 充分利用电信领域生成式 AI 的力量
作者:Elastic Piotr Kobziakowski, Jrgen Obermann 在瞬息万变的电信领域,Elastic Stack 与生成式 AI 的集成正在开创运营效率和创新的新时代。 这些技术不仅增强了网络运营,而且还彻底改变了各个部门的内部流程。 下面,我们将深入…...

Redis:原理速成+项目实战——Redis实战8(基于Redis的分布式锁及优化)
👨🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战7(优惠券秒杀细节解决超卖、一人一单问题) Ὅ…...

江山易改本性难移之ZYNQ SDK QSPI固化bug及其解决方法
之前在Vivado2018.3通过QSPI方式固化程序时出现问题,显示flash擦除成功,但最后总是不能写入到flash中。 查资料发现从VIVADO 2017.3版本开始,Xilinx官方为了使Zynq-7000和Zynq UltraScale 实现流程相同,在QSPI FLASH使用上做了变化…...

系列三十六、注解版Spring、SpringMVC配置文件
一、注解版Spring、SpringMVC配置文件 1.1、pom <dependencies><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.5.RELEASE</version><…...

爬虫你需要知道的:什么是http请求
1. 什么是http请求 我们将通过发送http请求来获取网页内容。http是HyperText Transfer Protocol的缩写,意思是超文本传输协议,它是一种客户端和服务器之间的请求响应协议。 浏览器就可以看作是一个客户端,当我们在浏览器地址栏输入想访问的…...

MCU FT61F14x入门
目录 前言一、CMIDE的使用二、系统时钟与睡眠2.1 上电复位 (POR)与系统复位2.2 振荡器和系统时钟2.3 SLEEP睡眠模式 (POWER-DOWN)2.4 低电压检测/比较器 (LVD) 三、I/O端口与中断四、串口USART五、定时器六、ADC七、EEPROM 前言 FT61F14x是辉芒微电子的微控制器,是一…...

星火大模型——多模态API调用(图像+文本)
参考文档 图片理解 API 文档 环境配置 pip3 install websocket-client核心代码 import _thread as thread import base64 import datetime import hashlib import hmac import json from urllib.parse import urlparse import ssl from datetime import datetime from time…...

计算机基础面试题 |22.精选计算机基础面试题
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...

kafka连接失败时springboot项目启动停机问题
问题:springboot整合kafka,作为消费端,对端的kafka系统是在生产环境,在本地开发测试时配置了对端的生产环境的kafka地址。因为开发环境和对端生产环境是不通的,所以连接肯定是失败的,kafka的连接失败导致sp…...

【算法题】46. 全排列
题目 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2: 输入࿱…...

可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上
OpenCV能够处理图像、视频、深度图像等各种类型的视觉数据,在某些情况下,尽管OpenCV可以显示窗口,但PyQt5可能更适合用于创建复杂的交互式应用程序,而自带GPU的H618就成为了这些图像显示的最佳载体。 这里分享一个代码࿰…...

现代密码学 补充1:两种窃听不可区分实验的区别
两种窃听不可区分实验 写在最前面两种窃听不可区分实验1. 完美保密中的窃听不可区分实验2. 窃听不可区分实验(对称加密算法)主要区别 写在最前面 两种窃听不可区分实验 两种窃听不可区分实验(Eavesdropping Indistinguishability Experimen…...

多功能号卡推广分销管理系统 流量卡推广分销网站源码-目前市面上最优雅的号卡系统
一套完善,多功能,的号卡分销系统,多接口,包括运营商接口,无限三级代理,最简单易用的PHP~ 目前市面上最优雅的号卡系统!没有之一 软件架构说明 环境要求php7.3以上(建议低于8.0),MySQL5.6以上,Nginx1.16(无要求) 产品特性 自动安装向导 易于安装使用部署 多个第…...

MySQL语法及IDEA使用MySQL大全
在项目中我们时常需要写SQL语句,或简单的使用注解直接开发,或使用XML进行动态SQL之类的相对困难的SQL,并在IDEA中操控我们的SQL,但网上大都图方便或者觉得太简单了,完全没一个涵盖两个方面的讲解。 单表: …...

分布式系统网关和sentinel
1.网关 作用:网关是给分布式系统进行请求路由分配的服务 功能: 请求路由 请求过滤 请求鉴权 流量控制 统一日志 2.搭建网关(微服务) 2.1依赖、配置文件、启动类 2.2配置路由(id,断言,…...

无法访问Bing网站 - 解决方案
问题 Bing官方网址:https://www.bing.com/ 电脑无法访问Bing网站,但手机等移动设备可以访问Bing网站,此时可尝试以下方案。 以下方案适用于各种系统,如Win/Linux系统。 解决方案 方案1 修改Bing网址为:https://www4…...

Spring Boot 自动装配原理
Java面试题目录 Spring Boot自动装配原理 Spring Boot启动类上的SpringBootApplication注解中包含EnableAutoConfiguration注解,表示开启自动装配。在EnableAutoConfiguration注解中使用Import注解引入AutoConfigurationImportSelector组件,此类中通过S…...

golang如何生成csv文件
在Go语言中,可以使用标准库中的"encoding/csv"包来生成CSV文件。下面是一个简单的示例代码,演示如何使用Go生成CSV文件: package mainimport ("encoding/csv""os" )func main() {// 创建一个新的CSV文件file,…...

你真的掌握了“C语言分支循环”吗
目录 前言 1. if语句 1.1 if 1.2 else 1.3 分支中包含多条语句 1.4 嵌套if 1.5 悬空else问题 2. 关系操作符 3. 条件操作符 4. 逻辑操作符:&& , || , ! 4.1 逻辑取反运算符 4.2 与运算符 4.3 或运算符 4.4 练习:闰年的判…...

Apollo计算几何算法(一)
Planning模块,路径和速度曲线抽象成折线(Polyline),障碍物抽象成多边形(Polygon)。在碰撞检测、投影计算距离、平滑曲线等方面应用广泛。 1 几何算法 1.1 线段 moudles/common/math/line_segment2d.h n…...

计算机网络、浏览器相关高频面试题
为什么使用CDN 会更快? 没有使用CDN的情况下,用户从浏览器输入地址,依次经过浏览器缓存、操作系统缓存(如本地host文件)、域名解析服务器、根域名解析服务器、顶级域名服务器直到找到对应的ip地址返回给用户ÿ…...

遥感单通道图像保存为彩色图像
系列文章目录 第一章PIL单通道图像处理 文章目录 系列文章目录前言一、代码实现二、问题记录在这里插入图片描述 总结 前言 将单通道图像以彩色图像的形式进行保存主要使用了PIL库 一、代码实现 palette_data [***]:可以进行自定义设置 代码如下: fr…...

如何将字符串转换为整数
将字符串转换为整数是常见的编程需求。以下是几种常见编程语言的示例: Python str_num "123" num int(str_num) print(num) # 输出: 123 JavaScript let str_num "123"; let num parseInt(str_num); console.log(num); // 输…...

如何在Linux上安装使用达芬奇DaVinci-Resolve视频剪辑|附带格式转换脚本
如何在openSUSE-Linux上安装DaVinci-Resolve 您是否还在等待Adobe套件在Linux上的到来?您是否曾多次尝试通过Wine使用Premiere?您是否还在想苹果为什么不以Linux本机版本发布Final Cut Pro? 如果您对所有这些问题中的一个或全部回答是&…...

FlinkAPI开发之数据合流
案例用到的测试数据请参考文章: Flink自定义Source模拟数据流 原文链接:https://blog.csdn.net/m0_52606060/article/details/135436048 概述 在实际应用中,我们经常会遇到来源不同的多条流,需要将它们的数据进行联合处理。所以…...