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,断言,…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
