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

【深度学习】— 多输入多输出通道、多通道输入的卷积、多输出通道、1×1 卷积层、汇聚层、多通道汇聚层

【深度学习】— 多输入多输出通道、多通道输入的卷积、多输出通道、1×1 卷积层、汇聚层、多通道汇聚层

  • 多输入多输出通道
  • 多通道输入的卷积
    • 示例:多通道的二维互相关运算
  • 多输出通道
    • 实现多通道输出的互相关运算
  • 1×1 卷积层
      • 1×1 卷积的作用
  • 使用全连接层实现 1×1 卷积
    • 小结
  • 汇聚层
    • 汇聚层的作用
    • 最大汇聚层和平均汇聚层
  • 汇聚层的实现
    • 实现汇聚层
    • 示例:验证二维最大汇聚和平均汇聚
  • 填充和步幅在汇聚层中的应用
    • 默认步幅与汇聚窗口大小相同
    • 自定义填充和步幅
    • 不同的矩形汇聚窗口与不同的填充和步幅
  • 多通道汇聚层
    • 示例:多通道汇聚操作
    • 小结

多输入多输出通道

在之前的示例中,我们仅展示了单个输入和单个输出通道的卷积操作,这使得我们可以将输入、卷积核和输出视为二维张量。然而,在实际应用中,输入数据和卷积层常常包含多个通道。例如,彩色图像通常具有 RGB 通道,分别表示红、绿和蓝三种颜色。

当我们引入多个通道时,输入和隐藏表示都变成了三维张量。例如,每个 RGB 输入图像的形状通常为 ( channels × height × width ) = ( 3 , h , w ) (\text{channels} \times \text{height} \times \text{width}) = (3, h, w) (channels×height×width)=(3,h,w),其中第一个轴表示通道(channel)维度。

多通道输入的卷积

当输入数据包含多个通道时,卷积核也需要相应地包含与输入通道数相同的通道数,以便对各通道进行互相关运算。假设输入数据的通道数为 c i c_i ci,则卷积核的输入通道数也应为 c i c_i ci

假设卷积核的窗口形状为 ( k h , k w ) (k_h, k_w) (kh,kw),则:

  • c i = 1 c_i = 1 ci=1 时,卷积核是一个形状为 ( k h , k w ) (k_h, k_w) (kh,kw) 的二维张量。
  • c i > 1 c_i > 1 ci>1 时,每个输入通道都需要一个 ( k h , k w ) (k_h, k_w) (kh,kw) 形状的二维卷积核。因此,卷积核的整体形状为 ( c i , k h , k w ) (c_i, k_h, k_w) (ci,kh,kw)

在多通道输入的卷积运算中,对每个输入通道的二维张量与卷积核对应通道的二维张量分别进行互相关运算。然后,将各通道的运算结果相加,得到最终的二维输出张量。

示例:多通道的二维互相关运算

如下图所示(图 6.4.1),我们演示了一个具有两个输入通道的二维互相关运算。阴影部分表示第一个输出元素及其计算所涉及的输入和卷积核张量的元素。

  1. 输入通道:假设输入数据有两个通道,每个通道为一个二维张量。
  2. 卷积核通道:卷积核同样具有两个通道,每个通道包含一个 ( k h , k w ) (k_h, k_w) (kh,kw) 的二维滤波器。
  3. 输出计算:对于每个输出元素,将输入的每个通道与对应的卷积核通道进行互相关操作,并将结果求和。

这种方式允许卷积层在多个输入通道上进行特征学习,从而提取出更丰富的特征。

在这里插入图片描述

为了加深对多输入通道卷积的理解,我们可以实现一个简单的多输入通道互相关运算。基本思想是对每个输入通道执行互相关操作,并将各通道的结果相加,得到最终的输出。

import torch# 定义多输入通道的互相关运算函数
def corr2d_multi_in(X, K):# 对每个通道执行互相关运算,然后将结果相加return sum(d2l.corr2d(x, k) for x, k in zip(X, K))

我们可以使用对应于图 6.4.1 的输入张量 X 和卷积核张量 K 来验证这个多输入通道互相关运算的输出。

# 构造输入张量 X 和卷积核张量 K
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]], [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])# 计算多通道互相关的结果
output = corr2d_multi_in(X, K)
print(output)

输出:

tensor([[ 56.,  72.],[104., 120.]])

通过这个示例,我们可以看到,对于多输入通道的互相关运算,每个通道的互相关结果相加后得到的输出符合预期。这一方法有效地组合了多输入通道的信息,有助于提取更丰富的特征。

多输出通道

到目前为止,无论输入通道有多少,我们在卷积层中都只有一个输出通道。然而,在实际的神经网络中,每一层通常包含多个输出通道,这对于深度学习模型来说至关重要。随着神经网络层数的加深,输出通道的数量常常增加,而空间分辨率则逐步降低,以换取更大的通道深度。

每个输出通道可以视为对不同特征的响应,但这些通道并非独立学习的,而是通过优化以共同使用。因此,多输出通道不仅仅是多个单通道检测器的简单组合。

假设输入通道数为 c i c_i ci,输出通道数为 c o c_o co,卷积核的高度和宽度分别为 k h k_h kh k w k_w kw。为了获得多个通道的输出,我们为每个输出通道创建一个形状为 ( c i , k h , k w ) (c_i, k_h, k_w) (ci,kh,kw) 的卷积核张量,这样卷积核的形状为 ( c o , c i , k h , k w ) (c_o, c_i, k_h, k_w) (co,ci,kh,kw)。在互相关运算中,每个输出通道使用对应的卷积核与所有输入通道进行运算,然后汇总结果。

实现多通道输出的互相关运算

我们可以实现一个函数来计算多个输出通道的卷积操作:

import torch# 定义多输入多输出通道的互相关运算函数
def corr2d_multi_in_out(X, K):# 迭代卷积核 K 的第0个维度,每次对输入 X 进行互相关运算# 最后将结果堆叠成一个输出张量return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

接下来,通过将核张量 KK+1(每个元素加1)和 K+2 连接起来,构造一个具有 3 个输出通道的卷积核。

# 构造一个具有 3 个输出通道的卷积核张量
K = torch.stack((K, K + 1, K + 2), 0)
print(K.shape)

输出:

torch.Size([3, 2, 2, 2])

这表示我们有 3 个输出通道,每个输出通道的卷积核有 2 个输入通道,且每个输入通道的卷积核大小为 2x2。

现在,我们对输入张量 X 和卷积核张量 K 执行互相关运算,输出包含 3 个通道。第一个通道的结果应与之前多输入单输出通道的结果一致:

# 计算多输入多输出通道的卷积结果
output = corr2d_multi_in_out(X, K)
print(output)

输出

tensor([[[ 56., 72.],[104., 120.]],[[ 76., 100.],[148., 172.]],[[ 96., 128.],[192., 224.]]])

1×1 卷积层

1×1 卷积层,即卷积核大小为 ( 1 , 1 ) (1, 1) (1,1) 的卷积层,表面上看起来似乎没有多大意义。卷积的本质通常在于提取相邻像素间的相关特征,而 1×1 卷积显然无法做到这一点。然而,1×1 卷积在许多深层网络的设计中十分流行,并有着独特的作用。

由于采用了最小的窗口,1×1 卷积失去了在高度和宽度维度上捕捉相邻元素相互作用的能力。事实上,1×1 卷积的唯一计算发生在通道维度上。图 6.4.2 展示了使用 1×1 卷积核的多输入多输出通道的互相关计算,其中输入和输出具有相同的高度和宽度。输出中的每个元素都是从输入图像中同一位置的多个通道元素的线性组合。

在这里插入图片描述

在这种情况下,可以将 1×1 卷积视为一个在每个像素位置应用的全连接层,即将输入的多个通道值映射为输出的多个通道值。由于 1×1 卷积仍然是一个卷积层,跨像素位置的权重是一致的。这种卷积层需要的权重维度为 ( c o , c i , 1 , 1 ) (c_o, c_i, 1, 1) (co,ci,1,1),外加一个偏置项。

1×1 卷积的作用

1×1 卷积主要用于以下几种情况:

  1. 增加或减少通道维度:通过调整输出通道数,1×1 卷积可以增加或减少通道数,帮助控制模型复杂度。
  2. 跨通道特征融合:在不改变空间分辨率的前提下,通过线性组合各通道的信息,使得不同通道的特征得以融合。
  3. 非线性特征映射:配合非线性激活函数,1×1 卷积能够在网络中实现跨通道的非线性映射。

因此,尽管 1×1 卷积不会改变输入的空间维度,它在深层网络中起到了连接通道特征、调控模型复杂度的关键作用。

使用全连接层实现 1×1 卷积

在 1×1 卷积中,每个输出像素仅与输入中相同位置的像素相关。因此,我们可以通过将 1×1 卷积转化为全连接层来实现,这需要对输入和输出的数据形状进行调整。

import torch# 使用全连接层实现 1×1 卷积
def corr2d_multi_in_out_1x1(X, K):c_i, h, w = X.shape  # 输入的通道数和空间维度c_o = K.shape[0]     # 输出通道数X = X.reshape((c_i, h * w))  # 调整输入的形状K = K.reshape((c_o, c_i))    # 调整卷积核的形状# 全连接层中的矩阵乘法Y = torch.matmul(K, X)return Y.reshape((c_o, h, w))  # 调整输出的形状

当执行 1×1 卷积时,该函数等效于我们之前实现的多输入多输出通道的互相关函数 corr2d_multi_in_out。以下示例验证了两者的结果一致性:

# 生成样本数据进行验证
X = torch.normal(0, 1, (3, 3, 3))  # 输入数据 (3 个通道,3x3 大小)
K = torch.normal(0, 1, (2, 3, 1, 1))  # 卷积核 (2 个输出通道,3 个输入通道,1x1 大小)# 使用两种方法计算卷积
Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)# 验证两者输出一致
assert float(torch.abs(Y1 - Y2).sum()) < 1e-6

以上代码验证了使用全连接层实现的 1×1 卷积与直接使用互相关运算的结果相同。

小结

  • 多输入多输出通道扩展了卷积层的建模能力。
  • 当在每个像素位置独立应用时,卷积层等效于全连接层。
  • 卷积层通常用于调整网络层的通道数量,从而控制模型的复杂性。

汇聚层

在图像处理任务中,我们希望逐渐降低隐藏表示的空间分辨率,并聚集信息。随着神经网络层数的增加,网络的感受野会扩大,每个神经元对输入的敏感区域增大。对于全局图像分类问题(例如“图像是否包含一只猫?”),网络的最后一层需要能够感知整个输入。因此,通过逐步聚合信息,网络可以生成更加粗糙、全局化的特征表示。

此外,在检测较低层次的特征(例如边缘)时,我们通常希望这些特征具有某种平移不变性。现实中,物体几乎不可能始终出现在同一像素位置上,即使相机稳定地拍摄物体,细微的抖动也可能导致图像中元素左右移动一两个像素。因此,保持平移不变性对提高模型的鲁棒性尤为重要。

汇聚层的作用

汇聚层(Pooling Layer)的作用包括:

  1. 降低卷积层对位置的敏感性;
  2. 降低对空间降采样表示的敏感性。

最大汇聚层和平均汇聚层

汇聚层类似于卷积层,由一个固定形状的窗口组成。该窗口根据步幅大小在输入的各个区域上滑动,并在每个位置计算一个输出值。与卷积层不同,汇聚层没有需要学习的参数,它的计算是确定性的,通常是计算汇聚窗口中元素的最大值或平均值。

  • 最大汇聚层(Max Pooling):输出汇聚窗口中元素的最大值。
  • 平均汇聚层(Average Pooling):输出汇聚窗口中元素的平均值。

汇聚窗口从输入张量的左上角开始,按从左到右、从上到下的顺序在输入张量内滑动。在汇聚窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值,这取决于我们选择了最大汇聚层还是平均汇聚层。
在这里插入图片描述
在这里插入图片描述

这种汇聚操作能够有效地降低特征的空间分辨率,同时保留重要的统计信息,有助于网络对特征的平移不变性和降采样表示的适应性。

汇聚层的实现

汇聚层使用固定大小的窗口在输入数据上滑动,并在每个位置计算窗口内元素的最大值或平均值。这些操作分别称为最大汇聚平均汇聚。汇聚层的窗口形状为 ( p h , p w ) (p_h, p_w) (ph,pw),且步幅一般与窗口大小相同。

在对象边缘检测的示例中,最大汇聚层可以帮助保持卷积层对某些模式的识别能力,即使输入在高度或宽度方向上移动了一个像素,卷积层仍能识别出模式。这种特性使得汇聚层能够有效地增强卷积神经网络的平移不变性。

实现汇聚层

下面的 pool2d 函数实现了汇聚层的前向传播,类似于 6.2 节中的 corr2d 函数。与卷积层不同,汇聚层没有卷积核,输出仅为输入中每个区域的最大值或平均值。

import torch# 定义汇聚层的实现函数
def pool2d(X, pool_size, mode='max'):p_h, p_w = pool_sizeY = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w + 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):if mode == 'max':Y[i, j] = X[i: i + p_h, j: j + p_w].max()  # 最大汇聚elif mode == 'avg':Y[i, j] = X[i: i + p_h, j: j + p_w].mean()  # 平均汇聚return Y

示例:验证二维最大汇聚和平均汇聚

我们可以使用输入张量 X 来验证二维最大汇聚和平均汇聚的输出:

# 构建示例输入张量
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])# 验证二维最大汇聚层
print(pool2d(X, (2, 2)))

输出:

tensor([[4., 5.],[7., 8.]])

对于平均汇聚层:

# 验证二维平均汇聚层
print(pool2d(X, (2, 2), 'avg'))

输出:

tensor([[2., 3.],[5., 6.]])

在此示例中,最大汇聚输出了每个汇聚窗口内的最大值,而平均汇聚输出了每个汇聚窗口内的平均值。这种汇聚操作可以有效地降低卷积层对位置的敏感性,同时帮助进行空间降采样。

填充和步幅在汇聚层中的应用

与卷积层类似,汇聚层也可以通过设置填充和步幅来改变输出的形状。在深度学习框架中,我们可以通过内置的二维最大汇聚层来演示填充和步幅的效果。

首先,构造一个输入张量 X,其形状为 (1, 1, 4, 4),即一个样本数和通道数均为 1 的 4x4 矩阵。

import torch
from torch import nn# 构造输入张量 X
X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
print(X)

输出:

tensor([[[[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[12., 13., 14., 15.]]]])

默认步幅与汇聚窗口大小相同

默认情况下,深度学习框架中的步幅与汇聚窗口的大小相同。例如,如果我们使用一个形状为 (3, 3) 的汇聚窗口,默认步幅为 (3, 3)

# 使用 (3, 3) 汇聚窗口,步幅默认为 (3, 3)
pool2d = nn.MaxPool2d(3)
print(pool2d(X))

输出:

tensor([[[[10.]]]])

自定义填充和步幅

我们也可以手动设置填充和步幅。例如,使用汇聚窗口 (3, 3),填充为 1,步幅为 2

# 设置 (3, 3) 汇聚窗口,填充为 1,步幅为 2
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X))

输出:

tensor([[[[ 5., 7.],[13., 15.]]]])

不同的矩形汇聚窗口与不同的填充和步幅

我们还可以使用矩形汇聚窗口,并分别设置填充和步幅的高度和宽度。例如,使用汇聚窗口大小 (2, 3),步幅为 (2, 3),填充为 (0, 1)

# 使用 (2, 3) 的矩形汇聚窗口,步幅为 (2, 3),填充为 (0, 1)
pool2d = nn.MaxPool2d((2, 3), stride=(2, 3), padding=(0, 1))
print(pool2d(X))

输出:

tensor([[[[ 5., 7.],[13., 15.]]]])

通过设定汇聚窗口、填充和步幅的大小,我们可以灵活地控制汇聚层的输出形状。汇聚层通过降低特征图的空间分辨率,帮助模型逐步聚合特征,并增强平移不变性。

多通道汇聚层

在处理多通道输入数据时,汇聚层会在每个输入通道上独立进行操作,而不像卷积层那样对通道维度进行汇总。这意味着汇聚层的输出通道数与输入通道数一致。

示例:多通道汇聚操作

我们先在通道维度上将张量 XX + 1 连接起来,以构造一个具有 2 个通道的输入:

import torch
from torch import nn# 创建一个 4x4 的输入张量 X
X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))# 将 X 和 X+1 在通道维度上拼接,形成一个具有 2 个通道的输入张量
X = torch.cat((X, X + 1), 1)
print(X)

输出:

tensor([[[[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[12., 13., 14., 15.]],[[ 1., 2., 3., 4.],[ 5., 6., 7., 8.],[ 9., 10., 11., 12.],[13., 14., 15., 16.]]]])

使用 3x3 的最大汇聚窗口,填充为 1,步幅为 2。在每个通道上,汇聚层将独立进行操作:

# 使用 3x3 的最大汇聚层,填充为 1,步幅为 2
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X))

输出:

tensor([[[[ 5., 7.],[13., 15.]],[[ 6., 8.],[14., 16.]]]])

可以看到,输出仍然包含 2 个通道,每个通道的汇聚结果对应于输入张量的每个通道的汇聚操作。

小结

  • 最大汇聚层输出该窗口内的最大值,而平均汇聚层输出窗口内的平均值。
  • 汇聚层的主要优势之一是减轻卷积层对位置的敏感性。
  • 可以在汇聚层中指定填充和步幅,以控制输出形状。
  • 使用最大汇聚层及大于 1 的步幅,可减少空间维度(如高度和宽度)。
  • 汇聚层的输出通道数与输入通道数相同。

相关文章:

【深度学习】— 多输入多输出通道、多通道输入的卷积、多输出通道、1×1 卷积层、汇聚层、多通道汇聚层

【深度学习】— 多输入多输出通道、多通道输入的卷积、多输出通道、11 卷积层、汇聚层、多通道汇聚层 多输入多输出通道多通道输入的卷积示例&#xff1a;多通道的二维互相关运算 多输出通道实现多通道输出的互相关运算 11 卷积层11 卷积的作用 使用全连接层实现 11 卷积小结 …...

java mapper 的 xml讲解

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.bnc.s12.mapper.GoodaCateDT…...

全面解析:区块链技术及其应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 全面解析&#xff1a;区块链技术及其应用 文章目录 全面解析&#xff1a;区块链技术及其应用什么是区块链区块链的工作原理1. 分…...

python基础学习笔记

本文类比c语言讲解python 一.变量和类型 前缀小知识&#xff1a; 注意&#xff1a;1.python写每一行代码时&#xff0c;结尾不需要 ; 这点是和c语言有很大区别的 2.代码的缩进&#xff08;就是每行代码前面的空格&#xff09;是非常重要的后文会提到 1.定义变量 注意: 和C/C …...

【dvwa靶场:XSS系列】XSS (DOM) 低-中-高级别,通关啦

一、低级low 拼接的url样式&#xff1a;​​​​​​​ http://127.0.0.1/dvwa/vulnerabilities/xss_d/?default 拼接的新内容 <script>alert("假客套")</script> 二、中级middle 拼接的url样式&#xff1a;​​​​​​​ http://127.0.0.1/dvwa/vuln…...

ONLYOFFICE 8.2深度体验:高效协作与卓越性能的完美融合

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ONLYOFFICE 8.2 &#x1f50d;引言&#x1f4d2;1. ONLYOFFICE 产品简介&#x1f4da;2. 功能与特点&#x1f341;协作编辑 PDF&#x1f342;…...

Mac如何将多个pdf文件归并到一个

电脑&#xff1a;MacBook Pro M1 操作方式&#xff1a; very easy 选中想要归并的所有pdf文件&#xff0c;然后 右键 -> quick actions -> Create PDF 然后就可以看到将所选pdf文件归并为一个pdf的文件了...

LINUX下的Mysql:Mysql基础

目录 1.为什要有数据库 2.什么是数据库 3.LINUX下创建数据库的操作 4.LINUX创建表的操作 5.SQL语句的分类 6.Mysql的架构 1.为什要有数据库 直接用文件直接存储数据难道不行吗&#xff1f;非得搞个数据库呢&#xff1f; 首先用文件存储数据是没错&#xff0c;但是文件不方…...

自然语言处理方向学习建议

自然语言处理方向学习建议 自然语言处理&#xff08;NLP&#xff09;作为人工智能的一个重要分支&#xff0c;近年来在学术界和工业界都取得了显著的发展。作为即将或正在攻读博士学位的你&#xff0c;投身于NLP领域无疑是一个充满挑战与机遇的选择。以下是一些针对NLP方向学习…...

介绍一下如何生成随机数(c基础)

适合对象 c语言初学者 总结语言用色&#xff0c;个人强调用红色&#xff0c;注意为易错点&#xff0c;若有问题请告诉我谢谢。(建议通过目录观看)。一定要自己动手打代码。 rand函数 是生成随机数的函数&#xff0c;但实则是伪随机数。(即是同一个值) 格式 #include<st…...

24-11-1-读书笔记(三十一)-《契诃夫文集》(五)下([俄] 契诃夫 [译] 汝龙)生活乏味但不乏魅力。

文章目录 《契诃夫文集》&#xff08;五&#xff09;下&#xff08;[俄] 契诃夫 [译] 汝龙&#xff09;生活乏味但不乏魅力。目录阅读笔记总结 《契诃夫文集》&#xff08;五&#xff09;下&#xff08;[俄] 契诃夫 [译] 汝龙&#xff09;生活乏味但不乏魅力。 休息&#xff0c…...

从“点”到“面”,热成像防爆手机如何为安全织就“透视网”?

市场上测温产品让人眼花缭乱&#xff0c;通过调研分析&#xff0c;小编发现测温枪占很高比重。但是&#xff0c;测温枪局限于显示单一数值信息&#xff0c;无法直观地展示物体的整体温度分布情况&#xff0c;而且几乎没有功能拓展能力。以AORO A23为代表的热成像防爆手机改变了…...

基于vue框架的的奶茶店预约订单系统3fb55(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,奶茶分类,奶茶信息 开题报告内容 开题报告 题目&#xff1a;基于Vue框架的奶茶店预约订单系统开发 一、研究背景与意义 背景 随着饮品市场的蓬勃发展&#xff0c;奶茶店作为其中的重要组成部分&#xff0c;其业务量和顾客需求持…...

项目实战使用gitee

1.创建本地仓库 2.进行提交到本地仓库 创建仓库后在idea中会显示图标&#xff0c;点击绿色的√进行快速提交 3.绑定远程仓库 4.番外篇-创建gitee仓库 注意不要勾选其他...

数据结构--二叉树_链式(下)

实现链式结构二叉树 链式结构就是由一个一个的节点组成。 ⽤链表来表⽰⼀棵⼆叉树&#xff0c;即⽤链来指⽰元素的逻辑关系。 通常的⽅法是链表中每个结点由三个域组成&#xff0c;数据域和左右指针域&#xff0c;左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储…...

unity游戏开发之--人物打怪爆材料--拾进背包的实现思路

unity游戏开发之–人物打怪爆材料–拾进背包的实现思路 游戏实现&#xff1a;unity c# 1、敌人&#xff08;怪物&#xff09;的生命值和伤害系统 using UnityEngine; using System.Collections.Generic;public class Enemy : MonoBehaviour {[Header("基础属性")]…...

AWTK文件系统适配器更新-支持RT-Thread DFS POSIX接口

介绍 AWTK 文件系统适配器。 在嵌入式平台中&#xff0c;有时没有 POSIX 兼容的文件系统 API&#xff0c;需要把一些文件系统实现&#xff0c;包装成 AWTK 的 fs 接口。本项目提供一些常见文件系统的适配&#xff0c;目前支持的文件系统有&#xff1a; FATFS 主要用于访问 TF…...

C#如何快速获取P/Invoke方法签名

使用API函数已经好几年了&#xff0c;封装函数签名基本是参照MSDN上的文档&#xff0c;然后再做数据类型对应。 虽然有 pinvoke.net 这个网站&#xff0c;但基本很少使用。一方面是想多动手&#xff0c;另一方面是因为各种数据类型基本都用过了&#xff0c;都能自己在C#中 对应…...

CqEngine添加联合索引和复合唯一索引

一.实体类 Data public class CategoryT {private Integer id;private String oneCategory;private String twoCategory;private String createTime;private String updateTime;public String uniKey() {return oneCategory "/" twoCategory;} }二.集合 Suppress…...

基于matlab的SVPWM逆变器死区补偿算法仿真研究

背景介绍&#xff1a; 三相脉宽调制(pulse width modulation&#xff0c;PWM)电压源逆变器(voltage source inverter&#xff0c;VSI)的死区效应可导致电机相电压和相电流畸变、零电流钳位效应以及转矩和转速脉动&#xff0c;系统性能降低。为提高系统运行性能&#xff0c;对V…...

【网页设计】CSS 定位

目标 能够说出为什么要用定位能够说出定位的4种分类能够说出4种定位各自的特点能够说出为什么常用子绝父相布局能够写出淘宝轮播图布局能够说出显示隐藏的2种方式以及区别 1. 定位 1.1 为什么需要定位 提问&#xff1a; 以下情况使用标准流或者浮动能实现吗&#xff1f;1. …...

scala的属性访问权限

scala的属性访问权限有四种&#xff1a; 默认访问权限&#xff1b;protected访问权限&#xff1b;private访问权限&#xff1b;private[this]访问权限 package Test1104 //访问控制权限// 类的内部方法 伴生对象中的方法 类的外部(对象&#xff0c;访问)…...

QGIS:HCMGIS插件

插件GitHub地址&#xff1a;https://github.com/thangqd/HCMGIS。 以下对HCMGIS插件进行简单介绍&#xff0c;并演示如何进行地图数据下载。 插件简介 HCMGIS - Basemaps, Download OpenData, Batch Converter, VN-2000 Projections, and Field Calculation Utilities for QGI…...

Melty 主体流程图

┌───────────┐ │ 用户输入 │ └─────┬─────┘ │&#xff08;自然语言或指令&#xff09; │ ▼ ┌───────────┐ │ 自然语言处理 │ │ &#xff08;NLU 模块&#xff09;│ └─────┬─────┘ │ │ 解析用户意图 │ ▼ ┌─…...

【图像与点云融合教程(五)】海康相机 ROS2 多机分布式实时通信功能包

0. 前言 Github 仓库链接&#xff1a;Hikvision Camera ROS2 package 0.1 问题背景 上一篇[博客](【图像与点云融合教程&#xff08;四&#xff09;】海康相机 ROS2 功能包 - 古月居 (guyuehome.com))介绍了我开源的海康相机 ROS2 功能包&#xff0c;在本地机器上可以实时订…...

正则截取字符窜数字,字母,符号部分

Testvoid test20() {String str "BJRabG11325F9**0**";// 提取字母部分String letterPart str.replaceAll("[^a-zA-Z]", "");String noLetterPart str.replaceAll("[a-zA-Z]", "");System.out.println("字母部分&am…...

【ChatGPT】让ChatGPT生成跨语言翻译的精确提示

让ChatGPT生成跨语言翻译的精确提示 在跨语言交流中&#xff0c;为了确保翻译的准确性&#xff0c;生成精确的提示&#xff08;Prompt&#xff09;来指导ChatGPT翻译内容是至关重要的。无论是要处理复杂的技术术语、俚语&#xff0c;还是保持特定的语言风格&#xff0c;使用有…...

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…...

使用VBA宏合并多个Excel文件的Sheet页

使用VBA宏合并多个Excel文件的Sheet页 在日常的Excel数据处理工作中&#xff0c;我们经常需要将多个Excel文件中的工作表合并到一个Excel文件中。这种操作可以极大地提高数据处理效率&#xff0c;但如果文件数量较多&#xff0c;手动合并会非常繁琐。本文将介绍如何使用VBA宏来…...

Anolis8防火墙安全设置

一、账号安全 1、禁止root远程登录 首先创建一个普通用户&#xff0c;然后修改系统配置禁止root登录&#xff0c;因为root作为系统默认的超级管理员&#xff0c;权限过大&#xff0c;日常操作使用易导致安全风险。 1.1、首先要建立一个新的登录用户 useradd username #增…...