当前位置: 首页 > news >正文

深度学习框架PyTorch——从入门到精通(YouTube系列 - 4)——使用PyTorch构建模型

这部分是 PyTorch介绍——YouTube系列的内容,每一节都对应一个youtube视频。(可能跟之前的有一定的重复)

  • torch.nn.Module(PyTorch神经网络模块)和torch.nn.Parameter(PyTorch神经网络参数)
  • 常见的层类型
    • 线性层
    • 卷积层
    • 循环层
    • Transformer(变换器)
  • 其他层和函数
    • 数据处理层
      • 最大池化(Max pooling)
      • 归一层(Normalization layers)
      • 随机失活层(Dropout)
      • 激活函数
      • 损失函数

本节YouTube视频地址:点击这里

torch.nn.Module(PyTorch神经网络模块)和torch.nn.Parameter(PyTorch神经网络参数)

在上面的YouTube视频中,我们将讨论一些PyTorch提供的用于构建深度学习网络的工具。

除了Parameter之外,我们在本视频中讨论的类都是torch.nn.Module的子类。torch.nn.Module是PyTorch的基类,旨在封装特定于PyTorch模型及其组件的行为。

torch.nn.Module的一个重要功能或者说用处(原文直译是重要行为)是注册参数。如果某个特定的Module子类具有可学习的权重,这些权重会表示为torch.nn.Parameter的实例。Parameter类是Tensor(张量)类的子类,它具有特殊的行为:当它们被赋值为一个Module的属性时,就会被添加到该Module的参数列表中。这些参数可以通过Module类的parameters()方法来访问。

举个简单的例子,这里有一个非常简单的模型,它包含两个线性层和一个激活函数。我们将创建该模型的一个实例,并让它报告其参数:

import torchclass TinyModel(torch.nn.Module):def __init__(self):super(TinyModel, self).__init__()self.linear1 = torch.nn.Linear(100, 200)self.activation = torch.nn.ReLU()self.linear2 = torch.nn.Linear(200, 10)self.softmax = torch.nn.Softmax()def forward(self, x):x = self.linear1(x)x = self.activation(x)x = self.linear2(x)x = self.softmax(x)return xtinymodel = TinyModel()print('The model:')
print(tinymodel)print('\n\nJust one layer:')
print(tinymodel.linear2)print('\n\nModel params:')
for param in tinymodel.parameters():print(param)print('\n\nLayer params:')
for param in tinymodel.linear2.parameters():print(param)
#输出
The model:
TinyModel((linear1): Linear(in_features=100, out_features=200, bias=True)(activation): ReLU()(linear2): Linear(in_features=200, out_features=10, bias=True)(softmax): Softmax(dim=None)
)Just one layer:
Linear(in_features=200, out_features=10, bias=True)Model params:
Parameter containing:
tensor([[ 0.0765,  0.0830, -0.0234,  ..., -0.0337, -0.0355, -0.0968],[-0.0573,  0.0250, -0.0132,  ..., -0.0060,  0.0240,  0.0280],[-0.0908, -0.0369,  0.0842,  ..., -0.0078, -0.0333, -0.0324],...,[-0.0273, -0.0162, -0.0878,  ...,  0.0451,  0.0297, -0.0722],[ 0.0833, -0.0874, -0.0020,  ..., -0.0215,  0.0356,  0.0405],[-0.0637,  0.0190, -0.0571,  ..., -0.0874,  0.0176,  0.0712]],requires_grad=True)
Parameter containing:
tensor([ 0.0304, -0.0758, -0.0549, -0.0893, -0.0809, -0.0804, -0.0079, -0.0413,-0.0968,  0.0888,  0.0239, -0.0659, -0.0560, -0.0060,  0.0660, -0.0319,-0.0370,  0.0633, -0.0143, -0.0360,  0.0670, -0.0804,  0.0265, -0.0870,0.0039, -0.0174, -0.0680, -0.0531,  0.0643,  0.0794,  0.0209,  0.0419,0.0562, -0.0173, -0.0055,  0.0813,  0.0613, -0.0379,  0.0228,  0.0304,-0.0354,  0.0609, -0.0398,  0.0410,  0.0564, -0.0101, -0.0790, -0.0824,-0.0126,  0.0557,  0.0900,  0.0597,  0.0062, -0.0108,  0.0112, -0.0358,-0.0203,  0.0566, -0.0816, -0.0633, -0.0266, -0.0624, -0.0746,  0.0492,0.0450,  0.0530, -0.0706,  0.0308,  0.0533,  0.0202, -0.0469, -0.0448,0.0548,  0.0331,  0.0257, -0.0764, -0.0892,  0.0783,  0.0062,  0.0844,-0.0959, -0.0468, -0.0926,  0.0925,  0.0147,  0.0391,  0.0765,  0.0059,0.0216, -0.0724,  0.0108,  0.0701, -0.0147, -0.0693, -0.0517,  0.0029,0.0661,  0.0086, -0.0574,  0.0084, -0.0324,  0.0056,  0.0626, -0.0833,-0.0271, -0.0526,  0.0842, -0.0840, -0.0234, -0.0898, -0.0710, -0.0399,0.0183, -0.0883, -0.0102, -0.0545,  0.0706, -0.0646, -0.0841, -0.0095,-0.0823, -0.0385,  0.0327, -0.0810, -0.0404,  0.0570,  0.0740,  0.0829,0.0845,  0.0817, -0.0239, -0.0444, -0.0221,  0.0216,  0.0103, -0.0631,0.0831, -0.0273,  0.0756,  0.0022,  0.0407,  0.0072,  0.0374, -0.0608,0.0424, -0.0585,  0.0505, -0.0455,  0.0268, -0.0950, -0.0642,  0.0843,0.0760, -0.0889, -0.0617, -0.0916,  0.0102, -0.0269, -0.0011,  0.0318,0.0278, -0.0160,  0.0159, -0.0817,  0.0768, -0.0876, -0.0524, -0.0332,-0.0583,  0.0053,  0.0503, -0.0342, -0.0319, -0.0562,  0.0376, -0.0696,0.0735,  0.0222, -0.0775, -0.0072,  0.0294,  0.0994, -0.0355, -0.0809,-0.0539,  0.0245,  0.0670,  0.0032,  0.0891, -0.0694, -0.0994,  0.0126,0.0629,  0.0936,  0.0058, -0.0073,  0.0498,  0.0616, -0.0912, -0.0490],requires_grad=True)
Parameter containing:
tensor([[ 0.0504, -0.0203, -0.0573,  ...,  0.0253,  0.0642, -0.0088],[-0.0078, -0.0608, -0.0626,  ..., -0.0350, -0.0028, -0.0634],[-0.0317, -0.0202, -0.0593,  ..., -0.0280,  0.0571, -0.0114],...,[ 0.0582, -0.0471, -0.0236,  ...,  0.0273,  0.0673,  0.0555],[ 0.0258, -0.0706,  0.0315,  ..., -0.0663, -0.0133,  0.0078],[-0.0062,  0.0544, -0.0280,  ..., -0.0303, -0.0326, -0.0462]],requires_grad=True)
Parameter containing:
tensor([ 0.0385, -0.0116,  0.0703,  0.0407, -0.0346, -0.0178,  0.0308, -0.0502,0.0616,  0.0114], requires_grad=True)Layer params:
Parameter containing:
tensor([[ 0.0504, -0.0203, -0.0573,  ...,  0.0253,  0.0642, -0.0088],[-0.0078, -0.0608, -0.0626,  ..., -0.0350, -0.0028, -0.0634],[-0.0317, -0.0202, -0.0593,  ..., -0.0280,  0.0571, -0.0114],...,[ 0.0582, -0.0471, -0.0236,  ...,  0.0273,  0.0673,  0.0555],[ 0.0258, -0.0706,  0.0315,  ..., -0.0663, -0.0133,  0.0078],[-0.0062,  0.0544, -0.0280,  ..., -0.0303, -0.0326, -0.0462]],requires_grad=True)
Parameter containing:
tensor([ 0.0385, -0.0116,  0.0703,  0.0407, -0.0346, -0.0178,  0.0308, -0.0502,0.0616,  0.0114], requires_grad=True)

这展示了PyTorch模型的基本结构:存在一个__init__()方法,用于定义模型的层和其他组件;还有一个forward()方法,用于完成计算。请注意,我们可以打印模型或其任何子模块,以了解其结构。

常见的层类型

线性层

神经网络中最基本的层类型是线性层或全连接层。在这种层中,每个输入都会在一定程度上影响该层的每个输出,影响程度由该层的权重来指定。如果一个模型有m个输入和n个输出,那么权重将是一个m×n的矩阵。例如:

lin = torch.nn.Linear(3, 2)
x = torch.rand(1, 3)
print('Input:')
print(x)print('\n\nWeight and Bias parameters:')
for param in lin.parameters():print(param)y = lin(x)
print('\n\nOutput:')
print(y)
# 输出
Input:
tensor([[0.8790, 0.9774, 0.2547]])Weight and Bias parameters:
Parameter containing:
tensor([[ 0.1656,  0.4969, -0.4972],[-0.2035, -0.2579, -0.3780]], requires_grad=True)
Parameter containing:
tensor([0.3768, 0.3781], requires_grad=True)Output:
tensor([[ 0.8814, -0.1492]], grad_fn=<AddmmBackward0>)

如果你将输入向量x与线性层的权重进行矩阵乘法运算,再加上偏置项,就会得到输出向量y。

另外一个需要注意的重要特性是:当我们使用lin.weight查看层的权重时,它显示自己是一个ParameterParameterTensor的子类),并且告知我们它正在通过自动求导机制(autograd)跟踪梯度。这是Parameter不同于Tensor的默认行为。

线性层在深度学习模型中应用广泛。最常见的应用场景之一是分类器模型,这类模型通常在末尾会有一个或多个线性层,其中最后一层会有n个输出,这里的n是分类器所处理的类别数量。

卷积层

卷积层是为处理具有高度空间相关性的数据而设计的。它们在计算机视觉领域应用极为普遍,在该领域中,卷积层会检测特征的紧密组合,并将其组合成更高级别的特征。它们也会出现在其他场景中,例如在自然语言处理应用里,一个单词的紧邻上下文(即序列中相邻的其他单词)会影响句子的含义。

在之前的视频中,我们在LeNet5模型里见识过卷积层的实际应用:

import torch.functional as Fclass LeNet(torch.nn.Module):def __init__(self):super(LeNet, self).__init__()# 1 input image channel (black & white), 6 output channels, 5x5 square convolution# kernelself.conv1 = torch.nn.Conv2d(1, 6, 5)self.conv2 = torch.nn.Conv2d(6, 16, 3)# an affine operation: y = Wx + bself.fc1 = torch.nn.Linear(16 * 6 * 6, 120)  # 6*6 from image dimensionself.fc2 = torch.nn.Linear(120, 84)self.fc3 = torch.nn.Linear(84, 10)def forward(self, x):# Max pooling over a (2, 2) windowx = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))# If the size is a square you can only specify a single numberx = F.max_pool2d(F.relu(self.conv2(x)), 2)x = x.view(-1, self.num_flat_features(x))x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xdef num_flat_features(self, x):size = x.size()[1:]  # all dimensions except the batch dimensionnum_features = 1for s in size:num_features *= sreturn num_features

让我们来剖析一下这个模型中卷积层的具体情况。从conv1开始讲起:

  • LeNet5模型旨在接收一个大小为1x32x32的黑白图像。卷积层构造函数的第一个参数是输入通道数。在这里,输入通道数为1。如果我们构建的这个模型是用于处理三通道彩色图像的,那么这个值就会是3

  • 卷积层就像是一个在图像上滑动扫描的窗口,用来寻找它能够识别的模式。这些模式被称为特征,卷积层的参数之一就是我们希望它学习到的特征数量。这也就是构造函数的第二个参数——输出特征数。在这个例子中,我们要求这一层学习6个特征。

  • 刚才我把卷积层比作一个窗口,那么这个窗口有多大呢?第三个参数就是窗口大小,也就是卷积核的大小。这里的5意味着我们选择了一个5x5的卷积核。(如果你想要一个高度和宽度不同的卷积核,可以为这个参数指定一个元组,比如(3, 5)就表示一个3x5的卷积核。)

卷积层的输出是一个激活图,它是输入张量中特征存在情况的一种空间表示。conv1会给我们一个大小为6x28x28的输出张量;其中6是特征的数量,28是激活图的高度和宽度。(28这个值是因为当在一个32像素的行上滑动一个5像素的窗口时,只有28个有效的滑动位置。)

然后,我们将卷积的输出通过一个ReLU激活函数(稍后会详细介绍激活函数),接着再通过一个最大池化层。最大池化层会把激活图中相邻的特征归为一组。它通过对张量进行降采样来实现这一点,将输出中每2x2的单元格组合并为一个单元格,并将这4个单元格中的最大值赋给这个新单元格。这样就得到了一个分辨率更低的激活图,其维度为6x14x14

我们的下一个卷积层conv2,期望有6个输入通道(这与第一层所寻找的6个特征相对应),有16个输出通道,并且使用一个3x3的卷积核。它输出一个大小为16x12x12的激活图,然后这个激活图又会被一个最大池化层降采样为16x6x6。在将这个输出传递给全连接层之前,它会被重塑为一个有16 * 6 * 6 = 576个元素的向量,以便下一层使用。

存在用于处理一维、二维和三维张量的卷积层。而且卷积层构造函数还有许多更多的可选参数,包括步长(例如,在输入中只每隔一个位置或每隔两个位置进行扫描)、填充(这样你就可以扫描到输入的边缘)等等。更多信息请查看相关文档。

循环层

循环神经网络(简称RNN)用于处理序列数据,这些数据涵盖范围广泛,从科学仪器记录的时间序列测量数据,到自然语言句子,再到DNA核苷酸序列等。RNN通过维护一个隐藏状态来实现对序列数据的处理,这个隐藏状态就像是一种记忆,存储着到目前为止它在序列中所“看到”的信息。

RNN层的内部结构,或者其变体,如长短期记忆网络(LSTM,即Long Short-Term Memory)和门控循环单元(GRU,即Gated Recurrent Unit),结构相对复杂,超出了本视频的讨论范围。不过,我们将通过一个基于LSTM的词性标注器(一种分类器,能够判断一个单词是名词、动词等词性),向你展示循环层在实际应用中的样子:

class LSTMTagger(torch.nn.Module):def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size):super(LSTMTagger, self).__init__()self.hidden_dim = hidden_dimself.word_embeddings = torch.nn.Embedding(vocab_size, embedding_dim)# The LSTM takes word embeddings as inputs, and outputs hidden states# with dimensionality hidden_dim.self.lstm = torch.nn.LSTM(embedding_dim, hidden_dim)# The linear layer that maps from hidden state space to tag spaceself.hidden2tag = torch.nn.Linear(hidden_dim, tagset_size)def forward(self, sentence):embeds = self.word_embeddings(sentence)lstm_out, _ = self.lstm(embeds.view(len(sentence), 1, -1))tag_space = self.hidden2tag(lstm_out.view(len(sentence), -1))tag_scores = F.log_softmax(tag_space, dim=1)return tag_scores

该构造函数有四个参数:

  • vocab_size(词汇表大小)是输入词汇表中的单词数量。每个单词在一个vocab_size维的空间中是一个独热向量(或单位向量)。

  • tagset_size(标签集大小)是输出标签集中的标签数量。

  • embedding_dim(嵌入维度)是词汇表嵌入空间的大小。嵌入操作将词汇表映射到一个低维空间,在这个空间中,语义相近的单词彼此靠近。

  • hidden_dim(隐藏层维度)是LSTM记忆单元的大小。

输入将是一个句子,其中的单词用独热向量的索引来表示。然后,嵌入层会将这些索引映射到一个embedding_dim维的空间中。LSTM接收这个嵌入向量序列,并对其进行迭代处理,输出一个长度为hidden_dim的输出向量。最后的全连接层充当分类器;对最后一层的输出应用log_softmax()函数,会将输出转换为一组归一化的估计概率,这些概率表示给定单词对应于给定标签的可能性。

如果你想了解这个网络的实际运行情况,可以查看pytorch.org上的“序列模型和LSTM网络”教程。

Transformer(变换器)

Transformer 是一种多用途的网络架构,像 BERT 这样的模型凭借它在自然语言处理(NLP)领域占据了领先地位。

关于 Transformer 架构的讨论超出了本视频的范畴,不过 PyTorch 提供了一个 Transformer 类,借助这个类你能够定义一个 Transformer 模型的整体参数,比如注意力头的数量、编码器和解码器的层数、 dropout(随机失活)参数以及激活函数等等。(只要参数设置得当,你甚至可以仅通过这一个类构建出 BERT 模型!)

torch.nn.Transformer 类还包含了用于封装各个独立组件的类(TransformerEncoder 编码器类、TransformerDecoder 解码器类)以及子组件类(TransformerEncoderLayer 编码器层类、TransformerDecoderLayer 解码器层类)。想要了解详细信息,可以查阅关于 Transformer 类的文档。

其他层和函数

数据处理层

在模型中还有其他类型的层,它们执行着重要的功能,但自身并不参与学习过程。

最大池化(Max pooling)

最大池化(以及与之相对的最小池化)通过合并单元格并将输入单元格中的最大值赋给输出单元格来对张量进行降维处理(我们之前已经见识过了)。例如:

my_tensor = torch.rand(1, 6, 6)
print(my_tensor)maxpool_layer = torch.nn.MaxPool2d(3)
print(maxpool_layer(my_tensor))
#输出
tensor([[[0.5036, 0.6285, 0.3460, 0.7817, 0.9876, 0.0074],[0.3969, 0.7950, 0.1449, 0.4110, 0.8216, 0.6235],[0.2347, 0.3741, 0.4997, 0.9737, 0.1741, 0.4616],[0.3962, 0.9970, 0.8778, 0.4292, 0.2772, 0.9926],[0.4406, 0.3624, 0.8960, 0.6484, 0.5544, 0.9501],[0.2489, 0.8971, 0.7499, 0.1803, 0.9571, 0.6733]]])
tensor([[[0.7950, 0.9876],[0.9970, 0.9926]]])

如果你仔细观察上面的值,就会发现最大池化输出中的每个值,都是 6x6 输入中每个象限的最大值。

归一层(Normalization layers)

归一化层会在将一层的输出传递到下一层之前,对该输出重新进行中心化处理并归一化。对中间张量进行中心化和缩放有许多好处,例如,它能让你在使用较高学习率的情况下,避免梯度爆炸或梯度消失的问题。

my_tensor = torch.rand(1, 6, 6)
print(my_tensor)maxpool_layer = torch.nn.MaxPool2d(3)
print(maxpool_layer(my_tensor))
# 输出
tensor([[[0.5036, 0.6285, 0.3460, 0.7817, 0.9876, 0.0074],[0.3969, 0.7950, 0.1449, 0.4110, 0.8216, 0.6235],[0.2347, 0.3741, 0.4997, 0.9737, 0.1741, 0.4616],[0.3962, 0.9970, 0.8778, 0.4292, 0.2772, 0.9926],[0.4406, 0.3624, 0.8960, 0.6484, 0.5544, 0.9501],[0.2489, 0.8971, 0.7499, 0.1803, 0.9571, 0.6733]]])
tensor([[[0.7950, 0.9876],[0.9970, 0.9926]]])

运行上面的代码单元,我们给一个输入张量添加了一个较大的缩放因子和偏移量;你会发现输入张量的均值(mean())大概在 15 左右。在将其通过归一化层后,你可以看到数值变小了,并且集中在零附近——实际上,均值应该非常小(大于 1 × 1 0 − 8 1\times10^{-8} 1×108)。

这是很有益处的,因为许多激活函数(下面会讨论)在接近 0 的地方具有最强的梯度,但对于那些使输入值远离 0 的情况,有时会出现梯度消失或梯度爆炸的问题。让数据集中在梯度最陡的区域附近,往往意味着可以实现更快、更好的学习效果,并且能够使用更高的可行学习率。

随机失活层(Dropout)

随机失活(Dropout)层是一种用于促使模型生成稀疏表示的工具——也就是说,推动模型在数据量较少的情况下进行推理。

随机失活层的工作原理是在训练过程中随机将输入张量的某些部分设置为零——在推理阶段,随机失活层总是处于关闭状态。这就迫使模型针对这种被屏蔽或减少了的数据进行学习。例如:

my_tensor = torch.rand(1, 4, 4)dropout = torch.nn.Dropout(p=0.4)
print(dropout(my_tensor))
print(dropout(my_tensor))
# 输出
tensor([[[0.0000, 0.0000, 0.0000, 0.2878],[0.0000, 0.6824, 0.0000, 0.5920],[0.0000, 0.0000, 1.3319, 0.5738],[0.5676, 0.8335, 0.9647, 0.2928]]])
tensor([[[0.0000, 0.0000, 0.2098, 0.0000],[0.0000, 0.6824, 0.0000, 0.0000],[0.0000, 0.0000, 0.0000, 0.5738],[0.0000, 0.8335, 0.0000, 0.2928]]])

在上面的内容里,你可以看到随机失活对一个样本张量产生的影响。你可以使用可选参数p来设置单个权重被随机置零的概率;若不设置,该概率默认是 0.5。

激活函数

激活函数让深度学习成为可能。神经网络本质上是一个拥有众多参数的程序,它模拟的是一个数学函数。要是我们仅仅反复用各层的权重去乘张量,那么就只能模拟线性函数;而且,设置多个层也毫无意义,因为整个网络最终会简化为一次矩阵乘法。而在各层之间插入非线性激活函数,能让深度学习模型模拟任意函数,而非仅仅是线性函数。

torch.nn.Module封装了所有主要的激活函数,其中有 ReLU 及其众多变体、Tanh、Hardtanh、Sigmoid 等等。它还包含了其他函数,像 Softmax 这类在模型输出阶段极为有用的函数。

损失函数

损失函数能告诉我们模型的预测结果与正确答案之间的偏差程度。PyTorch 涵盖了各种各样的损失函数,常见的有均方误差(MSE,即 Mean Squared Error,也就是 L2 范数)、交叉熵损失以及负对数似然损失(在分类器中很有用)等。

相关文章:

深度学习框架PyTorch——从入门到精通(YouTube系列 - 4)——使用PyTorch构建模型

这部分是 PyTorch介绍——YouTube系列的内容&#xff0c;每一节都对应一个youtube视频。&#xff08;可能跟之前的有一定的重复&#xff09; torch.nn.Module&#xff08;PyTorch神经网络模块&#xff09;和torch.nn.Parameter&#xff08;PyTorch神经网络参数&#xff09;常见…...

通过组策略使能长路径

打开组策略编辑器&#xff0c;依次展开&#xff1a; 计算机配置 > 管理模板然后双击 所有设置 右侧就会出现列表。接着在列表中找到 启用 win32 长路径 &#xff0c;双击 改成 已启用 &#xff0c;然后点击确定。最后重启计算机。...

Dubbo(90)如何设计一个支持多协议的Dubbo服务?

设计一个支持多协议的Dubbo服务需要考虑以下几个方面&#xff1a; 服务接口设计&#xff1a;确保服务接口的定义可以被不同协议实现。多协议配置&#xff1a;配置不同的协议&#xff0c;例如 Dubbo、HTTP、gRPC 等。服务注册与发现&#xff1a;确保服务能够在多个协议下注册和…...

JavaScript常规解密技术解析指南

第一章&#xff1a;密码学基础铺垫 逆向思维提示框 逆向思维在密码学中至关重要。当面对加密数据时&#xff0c;不要局限于常规的加密过程&#xff0c;而是要从解密的角度去思考。例如&#xff0c;在看到Base64编码的数据时&#xff0c;要立刻联想到它是如何从原始数据转换而…...

字符串的相关方法

1. equals方法的作用 方法介绍 public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写 示例代码 public class StringDemo02 {public static void main(String[] args) {//构造方法的方式得到对象char[] chs {a, b, c};String s1 new String(chs);…...

云原生后端架构的实践与挑战:探索现代后端开发的未来

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 随着云计算的普及,云原生架构已经逐渐成为现代软件开发的主流方式。云原生后端架构通过容器化、微服务、自动化运维等技术,帮助企业构建具有高度可扩展性和可靠性的系统。在本文中,我们将深入探讨…...

MySQL基础关键_005_DQL(四)

目 录 一、分组函数 1.说明 2.max/min 3.sum/avg/count 二、分组查询 1.说明 2.实例 &#xff08;1&#xff09;查询岗位和平均薪资 &#xff08;2&#xff09;查询每个部门编号的不同岗位的最低薪资 3.having &#xff08;1&#xff09;说明 &#xff08;2&#xff…...

Gradio全解20——Streaming:流式传输的多媒体应用(3)——实时语音识别技术

Gradio全解20——Streaming&#xff1a;流式传输的多媒体应用&#xff08;3&#xff09;——实时语音识别技术 本篇摘要20. Streaming&#xff1a;流式传输的多媒体应用20.3 实时语音识别技术20.3.1 环境准备和开发步骤1. 环境准备2. ASR应用开发步骤&#xff08;基于Transform…...

[android]MT6835 Android 关闭selinux方法

Selinux SELinux is an optional feature of the Linux kernel that provides support to enforce access control security policies to enforce MAC. It is based on the LSM framework. Working with SELinux on Android – LineageOS Android 关闭selinux MT6835 Android…...

GitHub 趋势日报 (2025年05月01日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image⭐ 1311⭐ 56231Python2day…...

对称加密算法(AES、ChaCha20和SM4)Python实现——密码学基础(Python出现No module named “Crypto” 解决方案)

文章目录 一、对称加密算法基础1.1 对称加密算法的基本原理1.2 对称加密的主要工作模式 二、AES加密算法详解2.1 AES基本介绍2.2 AES加密过程2.3 Python中实现AES加密Python出现No module named “Crypto” 解决方案 2.4 AES的安全考量 三、ChaCha20加密算法3.1 ChaCha20基本介…...

n8n 键盘快捷键和控制键

n8n 键盘快捷键和控制键 工作流控制键画布操作移动画布画布缩放画布上的节点操作选中一个或多个节点时的快捷键 节点面板操作节点面板分类操作 节点内部操作 n8n 为部分操作提供了键盘快捷键。 工作流控制键 Ctrl Alt n&#xff1a;创建新工作流Ctrl o&#xff1a;打开工作…...

部署Superset BI(二)再战Superset

上次安装没有成功&#xff0c;这次把superset的安装说明好好看了一下。 rootNocobase:/usr# cd superset rootNocobase:/usr/superset# git clone https://github.com/apache/superset.git Cloning into superset... remote: Enumerating objects: 425644, done. remote: Count…...

生日快乐祝福网页制作教程

原文&#xff1a;https://www.w3cschool.cn/article/88229685.html &#xff08;本文非我原创&#xff0c;请标记为付费文章&#xff0c;也请勿将我标记为原创&#xff09; 一、引言 生日是每个人一年中最特别的日子之一。在这个特别的日子里&#xff0c;我们都希望能够给亲…...

Spring MVC @RequestHeader 注解怎么用?

我们来详细解释一下 Spring MVC 中的 RequestHeader 注解。 RequestHeader 注解的作用 RequestHeader 注解用于将 HTTP 请求中的**请求头&#xff08;Request Headers&#xff09;**的值绑定到 Controller 方法的参数上。 请求头是 HTTP 请求的一部分&#xff0c;包含了关于…...

【Linux深入浅出】之全连接队列及抓包介绍

【Linux深入浅出】之全连接队列及抓包介绍 理解listen系统调用函数的第二个参数简单实验实验目的实验设备实验代码实验现象 全连接队列简单理解什么是全连接队列全连接队列的大小 从Linux内核的角度理解虚拟文件、sock、网络三方的关系回顾虚拟文件部分的知识struct socket结构…...

Linux C++ JNI封装、打包成jar包供Java调用详细介绍

在前面 Android专栏 中详细介绍了如何在Android Studio中调用通过jni封装的c库。 在Android使用 opencv c代码&#xff0c;需要准备opencv4android&#xff0c;也就是c的任何代码&#xff0c;是使用Android NDK编译的&#xff0c;相当于在windows/mac上使用Android stdido交叉…...

CPO-BP+NSGA,豪冠猪优化BP神经网络+多目标遗传算法!(Matlab完整源码和数据)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CPO-BPNSGA&#xff0c;豪冠猪优化BP神经网络多目标遗传算法&#xff01;&#xff08;Matlab完整源码和数据&#xff09;&#xff0c;豪冠猪算法优化BP神经网络的权值和阈值&#xff0c;运行环境Matlab2020b及以上…...

组件通信-v-model

概述&#xff1a;实现 父↔子 之间相互通信。 前序知识 —— v-model的本质 <!-- 使用v-model指令 --> <input type"text" v-model"userName"><!-- v-model的本质是下面这行代码 --> <input type"text" :value"use…...

使用PyMongo连接MongoDB的基本操作

MongoDB是由C语言编写的非关系型数据库&#xff0c;是一个基于分布式文件存储的开源数据库系统&#xff0c;其内容存储形式类似JSON对象&#xff0c;它的字段值可以包含其他文档、数组及文档数组。在这一节中&#xff0c;我们就来回顾Python 3下MongoDB的存储操作。 常用命令:…...

010302-oss_反向代理_负载均衡-web扩展2-基础入门-网络安全

文章目录 1 OSS1.1 什么是 OSS 存储&#xff1f;1.2 OSS 核心功能1.3 OSS 的优势1.4 典型使用场景1.5 如何接入 OSS&#xff1f;1.6 注意事项1.7 cloudreve实战演示1.7.1 配置cloudreve连接阿里云oss1.7.2 常见错误1.7.3 安全测试影响 2 反向代理2.1 正向代理和反向代理2.2 演示…...

PyQt 或 PySide6 进行 GUI 开发文档与教程

一、官网文档 Qt 官方文档&#xff1a;Porting to Qt 6 | Qt 6.9Qt 维基&#xff1a;​​​​​​​Qt WikiQt for Python (PySide6) &#xff1a;​​​​​​​Qt for Python - Qt WikiPySide6 快速上手指南&#xff1a;​​​​​​​Getting Started - Qt for Python PyS…...

【东枫科技】AMD / Xilinx Alveo™ V80计算加速器卡

AMD / Xilinx Alveo™ V80计算加速器卡 AMD/Xilinx Alveo ™ V80计算加速器卡是一款功能强大的计算加速器&#xff0c;基于7nm Versal™ 自适应SoC架构而打造。 AMD/Xilinx Alveo V80卡设计用于内存密集型任务。 这些任务包括HPC、数据分析、网络安全、传感器处理、计算存储和…...

C++ 动态内存管理

operator new和operator delete函数是两个全局函数&#xff0c;编译器在编译new和delete时会调用这两个函数&#xff0c;其底层分别是封装malloc和free 1.new new 内置类型 内置类型没有构造函数&#xff0c;所以使用new就是调operator new函数开空间&#xff0c;如果要初始化…...

(11)Vue-Router路由的详细使用

本系列教程目录&#xff1a;Vue3Element Plus全套学习笔记-目录大纲 文章目录 第2章 路由 Vue-Router2.1 Vue路由快速入门2.1.1 创建项目2.1.2 路由运行流程 2.2 传递参数-useRoute2.2.1 路径参数-params1&#xff09;普通传参2&#xff09;传递多个参数3&#xff09;对象方式传…...

RISCV的smstateen-ssstateen扩展

RISC-V 的 Smstateen / Ssstateen 扩展是为了解决安全性和资源隔离性问题而设计的&#xff0c;尤其是针对在多个上下文&#xff08;如用户线程、多个虚拟机&#xff09;之间 潜在的隐蔽信道(covert channel) 风险。 &#x1f310; 背景&#xff1a;隐蔽信道与上下文切换问题 当…...

C++ 与 Lua 联合编程

在软件开发的广阔天地里&#xff0c;不同编程语言各有所长。C 以其卓越的性能、强大的功能和对硬件的直接操控能力&#xff0c;在系统开发、游戏引擎、服务器等底层领域占据重要地位&#xff0c;但c编写的程序需要编译&#xff0c;这往往是一个耗时操作&#xff0c;特别对于大型…...

瑞萨 EZ-CUBE2 调试器

瑞萨 EZ-CUBE2 调试器 本文介绍了瑞萨 EZ-CUBE2 调试器的基本信息、调试方式、环境搭建、硬件连接、软件测试等。 包装展示 调试器展示 开关选项 详见&#xff1a;EZ-CUBE2 | Renesas 瑞萨电子 . 环境搭建 使用 Renesas 公司的 e2 studio 开发工具&#xff0c;下载 并安装该…...

MATLAB滤波工具箱演示——自定义维度、滤波方法的例程演示与绘图、数据输出

使用 M A T L A B MATLAB MATLAB的界面做了一个 M A T L A B MATLAB MATLAB滤波工具箱 d e m o demo demo&#xff0c;本文章给出演示&#xff1a;自定义维度、滤波方法的例程演示与绘图、数据输出 文章目录 编辑界面使用方法优势待改进点部分代码 编辑界面 使用 M A T L A B …...

数据库索引优化实战: 如何设计高效的数据库索引

数据库索引优化实战: 如何设计高效的数据库索引 一、理解数据库索引的核心原理 1.1 B树索引的结构特性 数据库索引&#xff08;Database Index&#xff09;的本质是通过特定数据结构加速数据检索。现代关系型数据库普遍采用B树&#xff08;B Tree&#xff09;作为默认索引结构&…...

TS 安装

TS较JS优势 1 TS静态类型编程语言。编译时发现错误 2 类型系统 强化变量类型概念 3 支持新语法 4 类型推断机制 可以和React框架中的各种hook配合 5 任何地方都有代码提示 tsc 命令 将TS转为JS 1 tsc 文件.ts 生成 js文件 2 执行JS代码...

CMake separate_arguments用法详解

separate_arguments 是 CMake 中用于将字符串分割成参数列表的命令&#xff0c;适用于处理包含空格的参数或复杂命令行参数。以下是其用法详解&#xff1a; 基本语法 separate_arguments(<variable> [UNIX|WINDOWS_COMMAND] [PROGRAM <program>] [ARGS <args&…...

【AI科技】AMD ROCm 6.4 新功能:突破性推理、即插即用容器和模块化部署,可在 AMD Instinct GPU 上实现可扩展 AI

AMD ROCm 6.4 新功能&#xff1a;突破性推理、即插即用容器和模块化部署&#xff0c;可在 AMD Instinct GPU 上实现可扩展 AI 现代 AI 工作负载的规模和复杂性不断增长&#xff0c;而人们对性能和部署便捷性的期望也日益提升。对于在 AMD Instinct™ GPU 上构建 AI 和 HPC 未来…...

2025年- H20-Lc128-240. 搜索二维矩阵 II(矩阵)---java版

1.题目描述 2.思路 遍历矩阵&#xff0c;然后如果遇到矩阵中的值正好等于target&#xff0c;输出true。否则&#xff0c;输出false。 3.代码 public class H240 {public boolean searchMatrix(int[][] matrix, int target) {//1.计算出总的行值&#xff0c;总的列值。int mm…...

LearningFlow:大语言模型城市驾驶的自动化策略学习工作流程

《LearningFlow: Automated Policy Learning Workflow for Urban Driving with Large Language Models》2025年1月发表&#xff0c;来自香港科技大学广州分校的论文。 强化学习&#xff08;RL&#xff09;的最新进展表明了自动驾驶的巨大潜力。尽管有这一前景&#xff0c;但奖励…...

C语言数据类型与内存布局

C语言数据类型内存占用 类型32位系统64位系统格式说明符char1字节1字节%cint4字节4字节%dfloat4字节4字节%fdouble8字节8字节%lflong long8字节8字节%lld...

从原理到实战讲解回归算法!!!

哈喽&#xff0c;大家好&#xff0c;我是我不是小upper, 今天系统梳理了线性回归的核心知识&#xff0c;从模型的基本原理、参数估计方法&#xff0c;到模型评估指标与实际应用场景&#xff0c;帮助大家深入理解这一经典的机器学习算法&#xff0c;助力数据分析与预测工作。 …...

linux指令中的竖线(“|”)是干啥的?【含实例展示】

文章目录 一、管道符的基本概念二、管道符的核心作用三、常用实例展示四、进阶技巧五、注意事项总结 实操展示**案例1&#xff1a;统计日志中特定错误的数量****案例2&#xff1a;查找当前运行的进程****案例3&#xff1a;合并排序并去重****案例4&#xff1a;实时监控CPU占用前…...

[HOT 100] 0124. 二叉树中的最大路径和

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 124. 二叉树中的最大路径和 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一…...

[SoC]AXI总线Performance验证方案

AXI总线Performance验证方案 测试 AXI (Advanced eXtensible Interface) 的性能是 SoC 验证中的重要任务,旨在评估其在不同负载和配置下的表现是否满足设计要求。以下详细说明如何测试 AXI 的性能、需要统计的变量、计算方法、在验证环境中动态计算性能的方法,以及如何…...

EMC PowerStore存储学习之一NVMe磁盘的命名规则

PowerStore的日志中经常会看到类似于/dev/nvme1n1的磁盘&#xff0c;在svc_diag list --show_drives中也可以看到类似这样的输出&#xff0c;如下图&#xff1a; 这里的Drives的显示都是 /dev/nvmeXnY的形式&#xff0c;那么这个磁盘命名规则怎么解读呢&#xff1f; 在Linux系…...

apt-mirror搭建ubuntu本地离线源

参考资料 4 Steps to Setup Local Repository in Ubuntu using APT-mirror 使用 APT-mirror 四步配置 Ubuntu 本地软件仓库 ubuntu下的apt-get内网本地源的搭建...

【记录】新Ubuntu20配置voxelmap的环境安装

因为系统总出问题&#xff0c;仅用于个人纪录。 1. 升级CMake到3.28及以上版本&#xff08;Sophus依赖&#xff09; wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.sh chmod x cmake-3.28.3-linux-x86_64.sh sudo ./cmake-3.2…...

Python全流程开发实战:基于IMAP协议安全下载个人Gmail邮箱内所有PDF附件

在日常办公场景中&#xff0c;面对成百上千封携带PDF附件的邮件&#xff0c;手动逐一下载往往耗时耗力&#xff0c;成为效率瓶颈。如何通过代码实现“一键批量下载”&#xff1f;本文将以**“Gmail全量PDF附件下载工具”**开发为例&#xff0c;完整拆解从需求分析到落地交付的P…...

CPU:AMD的线程撕裂者(Threadripper)和霄龙(EPYC)的区别

AMD的**线程撕裂者&#xff08;Threadripper&#xff09;和霄龙&#xff08;EPYC&#xff09;**虽然都是面向高性能市场的处理器&#xff0c;但它们在定位、功能和技术规格上有显著区别。以下是两者的主要差异&#xff1a; 1. 目标市场 线程撕裂者&#xff08;Threadripper&…...

【五一培训】Day 2

注&#xff1a; 1. 本次培训内容的记录将以“Topic”的方式来呈现&#xff0c;用于记录个人对知识点的理解。 2. 由于培训期间&#xff0c;作者受限于一些现实条件&#xff0c;本文的排版及图片等相关优化&#xff0c;需要过一段时间才能完成。 3. 关于老板点评的一些思考 你…...

shell_plus

python manage.py shell_plus 是由 django-extensions 提供的一个增强版的 Django shell&#xff0c;它自动导入你的所有模型和其他一些便捷功能&#xff0c;使得交互式开发更加方便。 如果你遇到配置或运行问题&#xff0c;特别是与 RQ_SHOW_ADMIN_LINK 相关的 ImproperlyCon…...

基于C++、JsonCpp、Muduo库实现的分布式RPC通信框架

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;RPC框架 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 项目介绍JsonCpp库简单介绍Muduo库简单介绍C11异步操作——std::future1. 使用 std::async 关联异步任务2. std::packaged_task…...

Redis TLS 加密对性能的影响分析

Redis TLS 加密对性能的影响分析 是的&#xff0c;Redis 启用 TLS 加密确实会对性能产生一定影响&#xff0c;但影响程度取决于多种因素。以下是详细分析&#xff1a; 一、性能影响的主要来源 加密/解密开销‌&#xff1a; TLS 握手过程中的非对称加密&#xff08;如 RSA、…...

树与二叉树完全解析:从基础到应用

目录 一、树形结构的基础认知 1.1 树的定义与特点 1.2 核心术语解析 二、二叉树的深度解析 2.1 二叉树定义 2.2 特殊二叉树类型 2.3 重要性质总结 三、二叉树的存储与遍历 3.1 存储方式对比 3.2 遍历算法精讲 四、经典题型训练 4.1 相同树判断&#xff08;LeetCode…...