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

5.2 参数管理

目标

  • 访问参数,用于调试、诊断和可视化;
  • 参数初始化;
  • 在不同模型组件间共享参数。

模型:单隐藏层的MLP

import torch
from torch import nnnet = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1))
X = torch.rand(size=(2, 4))
net(X)
tensor([[-0.0970],[-0.0827]], grad_fn=<AddmmBackward0>)

1 参数访问

从已有模型中访问参数: 检查第二个全连接层的参数

print(net[2].state_dict())
OrderedDict([('weight', tensor([[-0.0427, -0.2939, -0.1894,  0.0220, -0.1709, -0.1522, -0.0334, -0.2263]])), ('bias', tensor([0.0887]))])

结果信息:

  • 这个全连接层包含两个参数,分别是该层的权重和偏置
  • 两者都存储为单精度浮点数(float32)

note:参数名称允许唯一标识每个参数

1.1 访问目标参数

从第二个全连接层(即第三个神经网络层,第三层)提取偏置

print(type(net[2].bias))
print(net[2].bias)
print(net[2].bias.data)
<class 'torch.nn.parameter.Parameter'>
Parameter containing:
tensor([0.0887], requires_grad=True)
tensor([0.0887])
net[2].weight.grad == None

1.2 一次性访问所有参数

print(*[(name, param.shape) for name, param in net[0].named_parameters()])
print(*[(name, param.shape) for name, param in net.named_parameters()])

(‘weight’, torch.Size([8, 4])) (‘bias’, torch.Size([8]))
(‘0.weight’, torch.Size([8, 4])) (‘0.bias’, torch.Size([8])) (‘2.weight’, torch.Size([1, 8])) (‘2.bias’, torch.Size([1]))

net.state_dict()['2.bias'].data

tensor([0.0887])

解读

列表推导式
  1. 列表推导式
  • 列表推导式 [(name, param.shape) for name, param in net[0].named_parameters()] 遍历该层的所有参数,提取参数的名称和形状。
    print(*… ) 中的 * 用于解包列表,将列表中的元素作为多个参数传递给 print 函数,从而将每个参数的名称和形状单独打印出来。

注:列表推导式(List Comprehension)是 Python 中一种简洁、高效创建列表的方式。它允许你使用一行代码快速生成列表,而无需使用传统的循环结构。列表推导式的基本语法结构如:[表达式 for 变量 in 可迭代对象 if 条件]
示例:

squares = [x ** 2 for x in range(10)]

输出print(squares) # 输出:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  1. 带条件的列表推导式
    • 示例 :生成一个包含 0 到 9 之间的偶数的平方的列表。
    • 代码

squares_of_evens = [x ** 2 for x in range(10) if x % 2 == 0]
print(squares_of_evens) # 输出:[0, 4, 16, 36, 64]

  1. 嵌套循环的列表推导式
  • 示例 :生成两个列表元素的组合。
combinations = [(x, y) for x in [1, 2, 3] for y in ['a', 'b', 'c']]
print(combinations) 

输出:[(1, ‘a’), (1, ‘b’), (1, ‘c’), (2, ‘a’), (2, ‘b’), (2, ‘c’), (3, ‘a’), (3, ‘b’), (3, ‘c’)]

print(*… ) 中的 *

print(*… ) 中的 * 用于解包列表,将列表中的元素作为多个参数传递给 print 函数,从而将每个参数的名称和形状单独打印出来。

1.3 从嵌套块收集参数

1.3.1 在 PyTorch 中构建嵌套的神经网络块

#将输入数据通过两个全连接层和激活函数进行处理,最终输出维度为 4
def block1():return nn.Sequential(nn.Linear(4, 8), nn.ReLU(),nn.Linear(8, 4), nn.ReLU())#将输入数据通过两个全连接层和激活函数进行处理,最终输出维度为 4
def block2():# 创建一个空的 `nn.Sequential` 容器 `net`net = nn.Sequential()# 使用 `for` 循环迭代 4 次,每次调用 `block1()` 函数创建一个新的 `block1` 块for i in range(4):# 在这里嵌套# `add_module` 方法将创建的块添加到 `net` 中,并指定模块的名称为 `'block i'`(其中 `i` 是循环索引)net.add_module(f'block {i}', block1())# `block2` 返回一个包含 4 个 `block1` 块的序列容器return net# 构建一个完整的神经网络模型,包含 block2 返回的块和一个最终的全连接层#`block2()` 返回一个包含 4 个 `block1` 块的序列容器。
# `nn.Linear(4, 1)` 是一个全连接层,输入维度为 4,输出维度为 1。
# `nn.Sequential` 将这两个部分按顺序组合成一个完整的模型。
rgnet = nn.Sequential(block2(), nn.Linear(4, 1))#对输入数据 `X` 进行前向传播,通过整个网络计算输出
#输入数据首先通过 4 个 `block1` 块,每个块包含两个全连接层和激活函数,处理后的数据最终通过最后一个全连接层 `nn.Linear(4, 1)` 得到输出
rgnet(X)

tensor([[0.2596],
[0.2596]], grad_fn=)

1.3.2 执行过程

执行过程

假设输入数据 X 的形状为 (batch_size, 4),前向传播的具体执行过程如下:

  1. 第一个 block1

    • 输入:X(形状 (batch_size, 4)
    • 第一层全连接层:nn.Linear(4, 8),输出形状为 (batch_size, 8)
    • ReLU 激活函数:对输出应用 ReLU 激活,输出形状仍为 (batch_size, 8)
    • 第二层全连接层:nn.Linear(8, 4),输出形状为 (batch_size, 4)
    • ReLU 激活函数:对输出应用 ReLU 激活,输出形状仍为 (batch_size, 4)
  2. 第二个 block1

    • 输入:上一个块的输出(形状 (batch_size, 4)
    • 重复第一个块的处理过程,输出形状仍为 (batch_size, 4)
  3. 第三个 block1

    • 输入:上一个块的输出(形状 (batch_size, 4)
    • 重复第一个块的处理过程,输出形状仍为 (batch_size, 4)
  4. 第四个 block1

    • 输入:上一个块的输出(形状 (batch_size, 4)
    • 重复第一个块的处理过程,输出形状仍为 (batch_size, 4)
  5. 最终全连接层

    • 输入:最后一个 block1 块的输出(形状 (batch_size, 4)
    • 全连接层:nn.Linear(4, 1),输出形状为 (batch_size, 1)
向前传播流程
rgnet((0): block2((block 0): block1((0): Linear(4 -> 8)(1): ReLU()(2): Linear(8 -> 4)(3): ReLU())(block 1): block1((0): Linear(4 -> 8)(1): ReLU()(2): Linear(8 -> 4)(3): ReLU())(block 2): block1((0): Linear(4 -> 8)(1): ReLU()(2): Linear(8 -> 4)(3): ReLU())(block 3): block1((0): Linear(4 -> 8)(1): ReLU()(2): Linear(8 -> 4)(3): ReLU()))(1): Linear(4 -> 1)
)

最终构建的网络 rgnet 是一个由多个嵌套块组成的复杂神经网络。以下是其结构的详细说明:

网络结构
  1. block2

    • 包含 4 个 block1 块,每个 block1 块的结构如下:
      • nn.Linear(4, 8):输入维度 4,输出维度 8 的全连接层。
      • nn.ReLU():ReLU 激活函数。
      • nn.Linear(8, 4):输入维度 8,输出维度 4 的全连接层。
      • nn.ReLU():ReLU 激活函数。
  2. 最终的全连接层

    • nn.Linear(4, 1):输入维度 4,输出维度 1 的全连接层。
层级关系
  • rgnet 是一个 nn.Sequential 容器,包含两个主要部分:block2 和一个最终的全连接层。
  • block2 本身也是一个 nn.Sequential 容器,包含 4 个 block1 块。
  • 每个 block1 块是一个 nn.Sequential 容器,包含两个全连接层和两个 ReLU 激活函数。
具体结构

以下是 rgnet 的具体结构示意图:

rgnet((0): block2((block 0): block1((0): Linear(4 -> 8)(1): ReLU()(2): Linear(8 -> 4)(3): ReLU())(block 1): block1((0): Linear(4 -> 8)(1): ReLU()(2): Linear(8 -> 4)(3): ReLU())(block 2): block1((0): Linear(4 -> 8)(1): ReLU()(2): Linear(8 -> 4)(3): ReLU())(block 3): block1((0): Linear(4 -> 8)(1): ReLU()(2): Linear(8 -> 4)(3): ReLU()))(1): Linear(4 -> 1)
)
前向传播流程

假设输入数据 X 的形状为 (batch_size, 4),以下是前向传播的具体流程:

  1. 第一个 block1

    • 输入:X(形状 (batch_size, 4)
    • 第一层全连接层:nn.Linear(4, 8),输出形状为 (batch_size, 8)
    • ReLU 激活函数:对输出应用 ReLU 激活,输出形状仍为 (batch_size, 8)
    • 第二层全连接层:nn.Linear(8, 4),输出形状为 (batch_size, 4)
    • ReLU 激活函数:对输出应用 ReLU 激活,输出形状仍为 (batch_size, 4)
  2. 第二个 block1

    • 输入:上一个块的输出(形状 (batch_size, 4)
    • 重复第一个块的处理过程,输出形状仍为 (batch_size, 4)
  3. 第三个 block1

    • 输入:上一个块的输出(形状 (batch_size, 4)
    • 重复第一个块的处理过程,输出形状仍为 (batch_size, 4)
  4. 第四个 block1

    • 输入:上一个块的输出(形状 (batch_size, 4)
    • 重复第一个块的处理过程,输出形状仍为 (batch_size, 4)
  5. 最终的全连接层

    • 输入:最后一个 block1 块的输出(形状 (batch_size, 4)
    • 全连接层:nn.Linear(4, 1),输出形状为 (batch_size, 1)

1.3.3 输出

print(rgnet)

输出

Sequential((0): Sequential((block 0): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU())(block 1): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU())(block 2): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU())(block 3): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU()))(1): Linear(in_features=4, out_features=1, bias=True)
)

1.3.4 参数访问

rgnet[0][1][0].bias.data

tensor([ 0.1999, -0.4073, -0.1200, -0.2033, -0.1573, 0.3546, -0.2141, -0.2483])

2. 参数初始化

深度学习框架提供默认随机初始化, 也允许我们创建自定义初始化方法, 满足我们通过其他规则实现初始化权重。

2.1 内置初始化

将所有权重参数初始化为标准差为0.01的高斯随机变量, 且将偏置参数设置为0。

def init_normal(m):if type(m) == nn.Linear:nn.init.normal_(m.weight, mean=0, std=0.01)nn.init.zeros_(m.bias)
net.apply(init_normal)
net[0].weight.data[0], net[0].bias.data[0]

(tensor([1., 1., 1., 1.]), tensor(0.))

Xavier初始化方法初始化第一个神经网络层, 然后将第三个神经网络层初始化为常量值42

def init_xavier(m):if type(m) == nn.Linear:nn.init.xavier_uniform_(m.weight)
def init_42(m):if type(m) == nn.Linear:nn.init.constant_(m.weight, 42)net[0].apply(init_xavier)
net[2].apply(init_42)
print(net[0].weight.data[0])
print(net[2].weight.data)

tensor([ 0.5236, 0.0516, -0.3236, 0.3794])
tensor([[42., 42., 42., 42., 42., 42., 42., 42.]])

2.2 自定义初始化

def my_init(m):if type(m) == nn.Linear:print("Init", *[(name, param.shape)for name, param in m.named_parameters()][0])# nn.init.uniform_将张量的值填充为从均匀分布中采样的随机数nn.init.uniform_(m.weight, -10, 10)# 对权重参数进行筛选和调整。具体来说,它会将权重参数矩阵 m.weight.data 中绝对值大于等于 5 的元素保留,而将绝对值小于 5 的元素设置为 0 m.weight.data *= m.weight.data.abs() >= 5# 由于 weight 为均匀分布,所以数值在[-5,5]的概率为1/2,[-10,-5]的概率为1/4,[5,10]的概率为1/4;net.apply(my_init)
net[0].weight[:2]

Init weight torch.Size([8, 4])
Init weight torch.Size([1, 8])

tensor([[5.4079, 9.3334, 5.0616, 8.3095],
[0.0000, 7.2788, -0.0000, -0.0000]], grad_fn=)

net[0].weight.data[:] += 1
net[0].weight.data[0, 0] = 42
net[0].weight.data[0]

tensor([42.0000, 10.3334, 6.0616, 9.3095])

实现特定的初始化分布 :在前面的例子中,定义的初始化分布要求权重值以 1/4 的概率从 U(5,10) 中取值,以 1/2 的概率取 0,以 1/4 的概率从 U(−10,−5) 中取值。通过将权重初始化为 U(−10,10) 内的随机数,然后再执行 m.weight.data *= m.weight.data.abs() >=5,可以筛选出绝对值大于等于 5 的权重值(来自 U(5,10) 或 U(−10,−5) 的分布),而将绝对值小于 5 的权重值设置为 0,从而近似实现目标的初始化分布。
这种方法并不能完全精确地实现目标分布,因为从 U(−10,10) 中采样的权重值经过筛选后,可能会导致最终的权重值分布与目标分布存在一定差异。

3 参数绑定

定义一个稠密层,然后使用它的参数来设置另一个层的参数


shared = nn.Linear(8, 8)
net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(),shared, nn.ReLU(),shared, nn.ReLU(),nn.Linear(8, 1))
net(X)
# 检查参数是否相同
print(net[2].weight.data[0] == net[4].weight.data[0])net[2].weight.data[0, 0] = 100
# 确保它们实际上是同一个对象,而不只是有相同的值
print(net[2].weight.data[0] == net[4].weight.data[0])

tensor([True, True, True, True, True, True, True, True])
tensor([True, True, True, True, True, True, True, True])

3.1 定义共享层

shared = nn.Linear(8, 8)

首先定义了一个稠密层 shared = nn.Linear(8, 8),这个层的参数将被其他层共享。注意要给共享层一个名称,以便后续可以引用它的参数。

3.2 构建网络结构

net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(),shared, nn.ReLU(),shared, nn.ReLU(),nn.Linear(8, 1))

通过 nn.Sequential 构建了一个包含多个层的神经网络 net,其中包括两个 Linear 层和多个 ReLU 激活函数层。其中,第三个、第五个神经网络层(即第二个和第三个隐藏层)使用了 shared 层的参数。

3.3 检查参数是否相同

通过比较 net[2].weight.data[0] 和 net[4].weight.data[0],发现它们的值是相同的,这表明这两个层的权重参数是绑定在一起的

print(net[2].weight.data[0] == net[4].weight.data[0])

3.4 修改参数并验证绑定关系

net[2].weight.data[0, 0] = 100
# 确保它们实际上是同一个对象,而不只是有相同的值
print(net[2].weight.data[0] == net[4].weight.data[0])

将 net[2].weight.data[0, 0] 设置为 100 后,再次比较 net[2].weight.data[0] 和 net[4].weight.data[0],发现它们的值仍然相同,这说明它们实际上是同一个对象,而不是仅仅有相同的值。
第一次比较的结果 tensor([True, True, True, True, True, True, True, True, True]) 表示第三个和第五个层的权重参数在初始化后是相同的。
第二次比较的结果同样显示为 tensor([True, True, True, True, True, True, True, True, True]),这进一步验证了它们共享的是同一个参数对象,因为当修改其中一个参数时,另一个参数也随之改变。

3.5 梯度累加

当参数被绑定时,在反向传播过程中,梯度会累加。由于模型参数包含梯度,所以在反向传播期间,第二个隐藏层(即第三个神经网络层)和第三个隐藏层(即第五个神经网络层)的梯度会加在一起,共同影响参数的更新。
总结来说,参数绑定是一种在深度学习中用于共享参数的技术,可以在多个层之间实现参数的共享,减少模型参数量,提高参数的利用率。在 PyTorch 中,通过定义共享层并将其用于多个位置,可以轻松实现参数绑定。同时,需要注意的是,绑定参数在反向传播时梯度会累加。

相关文章:

5.2 参数管理

目标 访问参数&#xff0c;用于调试、诊断和可视化&#xff1b;参数初始化&#xff1b;在不同模型组件间共享参数。 模型&#xff1a;单隐藏层的MLP import torch from torch import nnnet nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1)) X torch.rand(size…...

Best Video下载器——抖音视频去水印工具

在浏览抖音时&#xff0c;我们常常会遇到一些精彩的短视频&#xff0c;想要保存下来作为创作素材或与朋友分享。然而直接下载的视频往往带有平台水印&#xff0c;影响观看体验。今天就为大家介绍几种简单实用的去水印方法&#xff0c;让你轻松获取高清无水印视频。 目前市面上…...

C语言_程序的段

在 C 语言程序中,内存通常被分为多个逻辑段,每个段存储不同类型的数据。理解这些段的结构和功能,有助于你更高效地编写、调试和优化程序。以下是 C 语言程序中主要的内存段及其特点: 1. 代码段(Text Segment) 存储内容:编译后的机器指令(程序代码)。特性: 只读:防止…...

Google Earth Pro(谷歌地球)2025大陆版安装教程

软件介绍 【名称】&#xff1a;Google Earth Pro&#xff08;谷歌地球&#xff09;2025 【大小】&#xff1a;63.6M 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win/Win8/Winxp/Win10/Win11 谷歌地球(Google Earth) 是由Google公司开发的地图软件。谷歌地球采用了…...

2025年数维杯赛题C题专家 组委会C题专家疑集锦

1、段前段后距&#xff0c;行间距有要求嘛 C题专家&#xff1a;一般是单倍行距 2、请问参考文献和附录上方也要有图示页眉吗?ai使用报告放在附录里还是附录之后? C题专家:附录 3、第三问的那个三天都在一个城市可以吗?这样我们列两份城市的清明自由行&#xff0c;还是说…...

C.循环函数基础

循环函数基础 1. 循环函数基础1.1 循环的定义与作用1.1.1 `for` 循环语法示例1.1.2 `while` 循环语法示例1.1.3 `do-while` 循环语法示例1.1.4 循环的比较1.1.5 循环的应用场景2.1 for 循环语法结构执行流程示例应用场景优点缺点2.2 while 循环语法结构执行流程示例应用场景优点…...

spark-Join Key 的基数/rand函数

在数据处理中&#xff0c;Join Key 的基数 是指 Join Key 的唯一值的数量&#xff08;也称为 Distinct Key Count&#xff09;。它表示某个字段&#xff08;即 Join Key&#xff09;在数据集中有多少个不同的值。 1. Join Key 基数的意义 高基数&#xff1a;Join Key 的唯一值…...

【Oracle认证】MySQL 8.0 OCP 认证考试英文版(MySQL30 周年版)

文章目录 1、MySQL OCP考试介绍2、考试注册流程3、考试复习题库 Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到2025.07.31 之前。所有人均可以免费考取原价245美元 &#xff08;约1500&#xff09;的MySQL OCP 认证。 1、MySQL OCP考试介绍 OCP考试 OCP认证是Oracle公司推…...

不同环境下运行脚本如何解决pythonpath问题

目录 问题背景&#xff1a; 方法一&#xff1a;在 Dockerfile 中设置 PYTHONPATH&#xff1a; 方法二: 本地脚本内动态地设置 sys.path&#xff0c;以确保 Python 程序在运行时能够找到项目中的模块 注意&#xff1a; 问题背景&#xff1a; 脚本在windows环境定义 然后因为…...

照片to谷歌地球/奥维地图使用指南

软件介绍 照片to谷歌地球/奥维地图是一款由WTSolutions开发的跨平台图片处理工具&#xff0c;能够将带有GPS信息的照片导入Google Earth&#xff08;谷歌地球&#xff09;或奥维地图。该软件支持Windows、Mac、iOS、Linux和Android系统&#xff0c;无需下载安装&#xff0c;直…...

visual studio 2015 安装闪退问题

参考链接&#xff1a; VS2012安装时启动界面一闪而过问题解决办法 visual studio 2015 安装闪退问题...

Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南

目录 Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南 一、为什么 containerd 是趋势&#xff1f; 二、目标 三、前提条件 四、方式一&#xff1a;containerd nvidia-container-toolkit&#xff08;基础方式&#xff09; 1️⃣ 安装 NVIDIA Containe…...

【typenum】 1 说明文件(README.md)

Typenum Typenum 是一个用于在编译时计算类型级数字的 Rust 库。目前支持位、无符号整数和有符号整数。 Typenum 仅依赖 libcore&#xff0c;因此适用于任何平台&#xff01; 导入方式 虽然 typenum 分为多个模块&#xff0c;但它们都通过 crate 根目录重新导出&#xff0c…...

Axure疑难杂症:统计分析页面引入Echarts示例动态效果

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:统计分析页面引入Echarts示例动态效果 主要内容:echart示例引入、大小调整、数据导入 应用场景:统计分析页面…...

PyQt5基本窗口控件(QWidget)

QWidget 基础窗口控件QWidget类是所有用户界面对象的基类&#xff0c;所有的窗口和控件都直 接或间接继承自QWidget类。 窗口控件&#xff08;Widget&#xff0c;简称“控件”&#xff09;是在PyQt中建立界面的主要元素。在PyQt 中把没有嵌入到其他控件中的控件称为窗口&…...

双目视觉系统中,极线校正(Epipolar Rectification)与单应性矩阵/多平面单应性模型

在双目视觉系统中&#xff0c;极线校正&#xff08;Epipolar Rectification&#xff09;的目标是使左右图像的对应点位于同一水平线上&#xff0c;从而简化立体匹配的搜索过程。标准的双目相机标定和校正流程&#xff0c;其核心原理与单应性矩阵的应用方式如下&#xff1a; 1. …...

【部署】win10的wsl环境下调试dify的api后端服务

回到目录 标题&#xff1a;win10的wsl环境下&#xff0c;远程调试dify的api后端服务 0. 上一篇讲解web前端服务的启动方法&#xff0c;本篇内容是vscode的调试模式启动api后端服务。文章4000字左右&#xff0c;阅读时间15-20分钟。 dify官方运行环境要求较低2U4G&#xff0c…...

学习黑客了解Python3的“HTTPServer“

5 分钟深入浅出理解Python3的"HTTPServer"模块 &#x1f310; 大家好&#xff01;今天我们将探索Python3中的HTTPServer模块——一个简单却强大的工具&#xff0c;它允许你快速创建web服务器。在网络安全学习、渗透测试和CTF挑战中&#xff0c;这个模块常被用来搭建…...

结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘

&#x1f4ca; 结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘 文章目录 &#x1f4ca; 结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘一、前言 &#x1f50d;二、技术选型 &#x1f9f0;三、项目配置与架构 &#x1f3d7;️&#x1f310; 系统整体架构流程…...

刘强东杀入自动驾驶!京东注册“Joyrobotaxi”商标

又一个互联网大佬杀入汽车赛道&#xff01;这一次&#xff0c;是京东的刘强东。5月6日&#xff0c;京东集团旗下公司一口气申请注册了多个名为"Joyrobotaxi"的商标&#xff0c;国际分类涵盖运输工具、科学仪器等核心领域。这一动作被业界普遍解读为&#xff1a;京东要…...

JavaScript基础-switch分支流程控制

在JavaScript编程中&#xff0c;switch语句提供了一种清晰、简洁的方式来实现多路分支选择。相比于多个if...else if语句&#xff0c;switch语句可以使代码更加易读和易于维护&#xff0c;尤其是在需要根据单个变量或表达式的值进行不同路径选择时尤为有用。本文将详细介绍swit…...

MySQL:视图

目录 一、什么是视图 二、视图的创建和使用 三、修改数据 &#xff08;1&#xff09;修改真实表 &#xff08;2&#xff09;修改视图 四、删除视图 五、视图的优点 一、什么是视图 视图是一个虚拟的表&#xff0c;它是基于一个或多个基本表或其他视图的查询结果集。视…...

05 mysql之DDL

一、SQL的四个分类 我们通常可以将 SQL 分为四类&#xff0c;分别是&#xff1a; DDL&#xff08;数据定义语言&#xff09;、DML&#xff08;数据操作语言&#xff09;、 DCL&#xff08;数据控制语言&#xff09;和 TCL&#xff08;事务控制语言&#xff09;。 DDL 用于创建…...

各国GDP变化趋势网页特效(实用动态图表)完整实例

https://download.csdn.net/download/YUJIANYUE/90803109...

【部署】win10的wsl环境下启动dify的web前端服务

回到目录 标题&#xff1a;win10的wsl环境下启动dify的web前端服务 0. 官网安装指引 官网有详细的源代码部署说明&#xff0c;参考: https://docs.dify.ai/en/getting-started/install-self-hosted/local-source-code 1. 安装nodejs 1.1. 下载和解压文件 参考:https://no…...

Veins同时打开SUMO和OMNeT++的GUI界面

进入 Veins 工程目录&#xff08;即包含 sumo-launchd.py 的目录&#xff09;&#xff0c;打开终端设置 SUMO_HOME 环境变量&#xff08;指向你安装的 SUMO 路径&#xff09;&#xff1a; export SUMO\_HOME/home/veins/src/sumo-1.11.0编译 Veins 工程&#xff08;包含 OMNeT…...

模型 启动效应

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。刺激先行激活&#xff0c;后续认知更顺畅。 1 启动效应的应用 1.1 求职面试中对面试官的影响 背景&#xff1a;一家知名公司在招聘过程中发现&#xff0c;面试官对候选人的评价往往受到多种因素的影响…...

Android 使用Paging3 实现列表分页加载、下拉刷新、错误重试、筛选功能

Android 使用Paging3 实现列表加载 Paging3是Android Jetpack组件库中的分页加载库&#xff0c;它可以帮助开发者轻松实现列表数据的分页加载功能。本文将逐步讲解如何使用Paging3库实现一个带有加载更多、下拉刷新、错误重试、筛选功能的列表页面。 最终效果如下 加载更多、…...

SpringBoot2集成xxl-job详解

官方教程 搭建调度中心 Github Gitee 注&#xff1a;版本3.x开始要求Jdk17&#xff1b;版本2.x及以下支持Jdk1.8。如对Jdk版本有诉求&#xff0c;可选择接入不同版本 clone源代码执行xxl-job\doc\db\tables_xxl_job.sql # # XXL-JOB v2.4.1 # Copyright (c) 2015-present, x…...

洛图报告中的 FSHD 是什么?—— 解密九天画芯推动的三色光源显示技术

目录 一、洛图报告新焦点&#xff1a;FSHD 为何成为显示产业重要突破方向&#xff1f; &#xff08;一&#xff09;洛图报告核心结论&#xff1a;从技术突围到产业重构 二、技术解析&#xff1a;FSHD 如何重构显示底层逻辑&#xff1f; &#xff08;一&#xff09;物理架构…...

关于数据库查询速度优化

本人接手了一个关于项目没有任何文档信息的代码&#xff0c;代码也没有相关文档说明信息&#xff01;所以在做数据库查询优化的时候不敢改动。 原因1&#xff1a; 老板需要我做一个首页的统计查询。明明才几十万条数据&#xff0c;而且我加了筛选条件为什么会这么慢&#xff…...

两数相加(2)

2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode * dummy new ListNode(0);int carry 0;ListNode * head dummy;while (l1 ! nullptr || l2 ! nullptr ||…...

车载学习(6)——CAPL(1)一些基础知识

1.一些CAPL的知识 CAPL通讯访问编程语言&#xff08;Commmunication Access Programming language&#xff09; CAPL的用途 ECU的仿真实现&#xff08;报文的收发、数据的处理&#xff09;实现总线日志纪录的控制实现总线数据自动化分析实现ECU功能的自动化测试实现ECU报文发…...

C++笔记-set和map的使用(包含multiset和multimap的讲解)

1.序列式容器和关联式容器 前面我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间一般没有紧密的关联关系&#xff0…...

GLPK(GNU线性规划工具包)介绍

GLPK全称为GNU Linear Programming Kit(GNU线性规划工具包)&#xff0c;可从 https://sourceforge.net/projects/winglpk/ 下载源码及二进制库&#xff0c;最新版本为4.65。也可从 https://ftp.gnu.org/gnu/glpk/ 下载&#xff0c;仅包含源码&#xff0c;最新版本为5.0。 GLPK是…...

技嘉主板BIOS升级

截图可能不同的BIOS长的不一样&#xff0c;但大概相同&#xff0c;BIOS不下错&#xff0c;逐个版本升级就没问题 准备工作 准备工作一个fat32格式的U盘&#xff0c;用来存放BIOS确认主板型号 和当前BIOS版本 方式1&#xff1a;去系统信息里面 方式2&#xff1a; 去BIOS设置…...

自定义类型:结构体进阶

一、结构体类型的声明 前⾯我们在学习操作符和初阶结构体的时候&#xff0c;已经学习了结构体的知识&#xff0c;这⾥稍微复习⼀下。 1.1结构体的回顾 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2结构的声明 struct tag…...

linux perf top分析系统性能

1,看到内核宏是否支持perf功能 perf top -g 查看linux 内核宏定义 CONFIG_PERF_EVENTS=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_FRAME_POINTER=y # 确保帧指针支持以捕获完整堆栈 2,使用perf top -g 报错 Access to performance monitoring and observability operations is l…...

串口屏调试 1.0

http://wiki.tjc1688.com 先把商家的链接贴过来 淘晶驰T1系列3.2寸串口屏tft液晶屏显示屏HMI触摸屏超12864液晶屏 这是主包的型号 打开这个玩意 有十个基本的功能区 新建工程 在界面的右边&#xff0c;指令一定要写在page前面&#xff0c;这里的波特率等等什么的都可以…...

Python面向对象编程:初识类与对象

面向对象编程(OOP)是Python编程中最重要的范式之一。本文将从零开始介绍Python中类和对象的基本概念&#xff0c;帮助初学者快速掌握面向对象编程的核心思想。 一、什么是面向对象编程&#xff1f; 面向对象编程(Object-Oriented Programming)是一种以"对象"为核心…...

局域网常用的测速工具,Iperf3使用教程

目录 下载方式 Windows Linux 使用方法&#xff1a;测试局域网带宽 步骤一&#xff1a;服务端准备 步骤二&#xff1a;客户端发起连接 步骤三&#xff1a;查看结果 参数说明 1. Iperf常用参数&#xff08;测试够用&#xff09; 2. 通用参数&#xff08;Server端和Cli…...

[架构之美]linux常见故障问题解决方案(十九)

[架构之美]linux下常见故障问题解决方案 一&#xff0c;文本文件忙 问题一&#xff1a;rootwh-VMware-Virtual-Platform:/home/hail# cp /root/containerd/bin/* /usr/bin/ cp: 无法创建普通文件 ‘/usr/bin/containerd’: 文本文件忙 在Linux系统中遇到“文本文件忙”错误时…...

Java与Go语言对比教程

Java vs. Go&#xff1a;程序员的双节棍与瑞士军刀之战 &#x1f3af; 先看一张灵魂对比图 &#x1f916; Java老大哥 &#x1f680; Go小钢炮 出生年份 1995&#xff08;中年稳健&#xff09; 2009&#xff08;年轻活力&…...

计算机大类专业数据结构下半期实验练习题

1068: 图的按录入顺序深度优先搜索 #include"iostream" using namespace std; #include"cstring" int visited[100]; char s[100]; int a[100][100]; int n; void dfs(int k,int n) {if(visited[k]0){visited[k]1;cout<<s[k];for(int i0;i<n;i){i…...

Android 关闭Activity切换过渡动画

Android 9.0以前关闭过渡动画效果只需要把开发者模式中过渡动画缩放设为0就可以。也就是把def_window_transition_scale改为0% frameworks/base/packages/SettingsProvider/res/values/defaults.xml <fraction name"def_window_transition_scale">100%<…...

iperf3的介绍与舒勇

在 CentOS 7 中使用 iperf3 进行网络性能测试&#xff0c;分为客户端和服务器两部分。以下是使用步骤&#xff1a; 1. 安装 iperf3 首先&#xff0c;你需要在 CentOS 7 上安装 iperf3。可以通过以下命令进行安装&#xff1a; sudo yum install epel-release sudo yum install…...

Python 包管理新选择:uv

在 Python 中,uv 是由 Astral 公司开发的 Rust 高性能包管理工具,旨在替代传统 pip 并提供更快的依赖管理、Python 版本控制等功能。 https://github.com/astral-sh/uv 在 github 上已有 53k star 一、uv 的核心优势 极速性能:比 pip 快 10-100 倍。多版本 Python 管理:支…...

从需求到用例的AI路径:准确率与挑战

用工作流生成测试用例和自动化测试脚本&#xff01; 引言&#xff1a;用例的黄金起点 在软件工程中&#xff0c;“测试用例”是连接需求理解与质量保障之间的关键桥梁。一份高质量的测试用例&#xff0c;不仅是验证功能实现是否符合需求的工具&#xff0c;更是产品风险感知、用…...

JavaSE核心知识点02面向对象编程02-06(泛型)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程02-06&#…...

xml与注解的区别

功能xml配置注解定义bean bean标签 id属性 class属性 Component Controller Service Repository ComponentScan 设置依赖注入 setter注入&#xff08;set方法&#xff09; 构造器注入&#xff08;构造方法&#xff09; Autowired Qualifier Value 配置第三方bean bean标签 静…...