机器学习09-Pytorch功能拆解
机器学习09-Pytorch功能拆解
我个人是Java程序员,关于Python代码的使用过程中的相关代码事项,在此进行记录
文章目录
- 机器学习09-Pytorch功能拆解
- 1-核心逻辑脉络
- 2-个人备注
- 3-Pytorch软件包拆解
- 1-Python有参和无参构造
- 构造方法的基本语法
- 示例
- 解释
- 注意事项
- 继承中的构造方法示例
- 2-CNN继承构造方法
- 示例代码
- 构造方法详解
- 3-为什么要把SimpleCNN传入到super(SimpleCNN, self).__init__()方法中
- 详细解释
- 示例代码
- 总结
- 5-pytorch的nn核心功能介绍
- 1. Module
- 2. Linear Layers (线性层)
- 3. Convolutional Layers (卷积层)
- 4. Activation Functions (激活函数)
- 5. Pooling Layers (池化层)
- 6. Normalization Layers (归一化层)
- 7. Loss Functions (损失函数)
- 8. Optimizers (优化器)
- 9. Sequential (顺序容器)
- 10. Dropout (丢弃层)
- 11. Functionality for Data Handling (数据处理功能)
- 6-pytorch的nn包目录结构
- 7-pytorch的nn包目录backends
- 1. `torch.nn.backends` 的主要功能
- 2. `torch.nn.backends` 的核心模块和方法
- 2.1 cuDNN 后端配置
- 2.2 MKL 后端配置
- 2.3 其他后端配置
- 3. `torch.nn.backends` 的适用场景
- 4. 示例:使用 `torch.nn.backends.cudnn` 优化模型
- 5. 总结
- 8-pytorch的nn包目录intrinsic
- 主要功能
- 常见的组合层
- 示例
- 总结
- 9-pytorch的nn包目录modules
- 1. 核心功能
- a. `Module` 类
- b. 子模块管理
- c. 参数管理
- 2. 常见模块
- a. 线性层 (`nn.Linear`)
- b. 卷积层 (`nn.Conv2d`)
- c. 激活函数 (`nn.ReLU`, `nn.Sigmoid`, `nn.Tanh`)
- d. 池化层 (`nn.MaxPool2d`, `nn.AvgPool2d`)
- e. 归一化层 (`nn.BatchNorm2d`, `nn.LayerNorm`)
- f. 损失函数 (`nn.CrossEntropyLoss`, `nn.MSELoss`)
- g. 其他常见模块
- 3. 自定义模块
- 4. 模块嵌套
- 5. 总结
- 10-pytorch的nn包目录parallel
- 1. `torch.nn.parallel` 的主要功能
- a. 数据并行 (`DataParallel`)
- b. 分布式数据并行 (`DistributedDataParallel`, DDP)
- c. 张量并行 (`TensorParallel`)
- 2. `torch.nn.parallel` 的核心类和方法
- a. `DataParallel`
- b. `DistributedDataParallel`
- 3. 选择合适的并行化策略
- 4. 总结
- 11-pytorch的nn包目录qat
- 1. 量化的背景
- 2. `torch.nn.qat` 的功能
- 3. `torch.nn.qat` 的核心模块
- 4. 量化感知训练的流程
- 5. 代码示例
- 6. `torch.nn.qat` 的工作原理
- 7. `torch.nn.qat` 的适用场景
- 8. 总结
- 12-pytorch的nn包目录quantizable
- `nn.quantizable` 的用途
- 核心概念
- 主要模块
- 使用流程
- 示例代码
- 总结
- 13-pytorch的nn包目录quantized
- 1. 量化的背景
- 2. `torch.nn.quantized` 的功能
- 3. `torch.nn.quantized` 的核心模块
- 4. 量化模型的创建流程
- 5. 代码示例
- 6. `torch.nn.quantized` 的工作原理
- 7. `torch.nn.quantized` 的适用场景
- 8. 总结
- 14-pytorch的nn包目录utils
- 1. `torch.nn.utils` 的主要功能
- 2. `torch.nn.utils` 的核心模块和方法
- 2.1 梯度处理
- 2.2 模型序列化
- 2.3 模块管理
- 2.4 量化支持
- 2.5 通用工具
- 3. `torch.nn.utils` 的适用场景
- 4. 总结
1-核心逻辑脉络
- 1)pytorch核心代码中有哪些包
- 2)每个包分别是做什么用的
- 3)手写基础模型中每个类分别对应的是哪个包
2-个人备注
- 思路:从继承nn.Module的基础包开始,了解自己每一步的代码分别在做什么,对应的包分别是什么;加入想从CNN切换到GAN,对应的代码分别在哪个包中进行查找原生方法
nn
- backends 管理和配置深度学习模型在不同硬件(如 CPU、GPU)和底层库(如 cuDNN、MKL)上的执行方式
- intrinsic 提供了一些预定义的“组合层”,这些组合层通常是将多个基本的操作(如卷积和批量归一化)合并在一起,以提高计算效率
- modules 提供一种结构化的方式来定义、管理和组织神经网络的各个组件
- parallel 提供了几种不同的并行化策略,帮助用户充分利用多核 CPU 或多个 GPU 的计算资源
- qat 量化是将浮点数权重和激活值转换为低精度整数,减少模型的计算量和内存占用,加速推理过程
- quantizable 训练阶段-提供了一系列的量化感知模块,可以在训练过程中模拟量化操作,从而使模型学习到在量化后仍然表现良好的参数
- quantized 推理阶段-提供了一系列的量化模块,量化模块在推理阶段使用低精度整数进行计算,从而实现高效的推理
- utils 包含了一系列辅助函数和类,用于数据处理、模型训练、保存和加载
3-Pytorch软件包拆解
1-Python有参和无参构造
在Python中,构造方法是一种特殊的方法,用于在创建对象时初始化对象的状态。构造方法的名称是__init__
,它会在实例化一个类时自动调用。通过构造方法,你可以在对象创建时为其设置初始值或执行一些必要的初始化操作。
构造方法的基本语法
class 类名:def __init__(self, 参数1, 参数2, ...):self.属性1 = 参数1self.属性2 = 参数2# 其他初始化代码
__init__
是构造方法的名称。self
是一个特殊参数,代表类的实例本身。- 构造方法可以接受任意数量的参数,这些参数用于初始化对象的属性。
示例
下面是一个简单的示例,展示了如何使用构造方法来初始化对象的属性:
class Person:def __init__(self, name, age):self.name = nameself.age = agedef introduce(self):print(f"大家好,我叫{self.name},今年{self.age}岁。")# 创建Person类的实例
person1 = Person("张三", 25)
person2 = Person("李四", 30)# 调用实例方法
person1.introduce() # 输出: 大家好,我叫张三,今年25岁。
person2.introduce() # 输出: 大家好,我叫李四,今年30岁。
解释
Person
类有一个构造方法__init__
,它接受两个参数name
和age
。- 在构造方法中,
self.name
和self.age
分别被赋值为传入的name
和age
。 - 当创建
Person
类的实例时,构造方法会自动调用,并将传入的参数用于初始化对象的属性。
注意事项
self
参数: 构造方法中的self
参数是必须的,它代表类的实例本身,用于访问和修改对象的属性。- 构造方法的重写: 如果你没有在类中定义
__init__
方法,Python会自动提供一个默认的构造方法。如果你定义了__init__
方法,则默认的构造方法会被覆盖。 - 继承中的构造方法: 在继承中,子类可以调用父类的构造方法来初始化父类的属性,通常使用
super().__init__()
来实现。
继承中的构造方法示例
class Student(Person):def __init__(self, name, age, student_id):super().__init__(name, age) # 调用父类的构造方法self.student_id = student_iddef introduce(self):print(f"大家好,我叫{self.name},今年{self.age}岁,我的学号是{self.student_id}。")# 创建Student类的实例
student1 = Student("王五", 20, "12345")
student1.introduce() # 输出: 大家好,我叫王五,今年20岁,我的学号是12345。
在这个示例中,Student
类继承自 Person
类,并重写了构造方法。通过 super().__init__(name, age)
,子类可以调用父类的构造方法来初始化 name
和 age
属性。
2-CNN继承构造方法
在PyTorch中,nn.Module
是所有神经网络模块的基类。要在自定义的神经网络类中使用构造方法,你需要继承自 nn.Module
,并在类的构造方法中定义网络的结构。
下面是一个简单的卷积神经网络(CNN)示例,展示了如何在 PyTorch 中使用构造方法来定义网络结构。
示例代码
import torch
import torch.nn as nn
import torch.nn.functional as Fclass SimpleCNN(nn.Module):def __init__(self, num_classes=10):super(SimpleCNN, self).__init__()# 定义卷积层self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)# 定义全连接层self.fc1 = nn.Linear(in_features=32 * 7 * 7, out_features=128)self.fc2 = nn.Linear(in_features=128, out_features=num_classes)def forward(self, x):# 应用第一个卷积层,然后进行ReLU激活和最大池化x = F.relu(self.conv1(x))x = F.max_pool2d(x, 2, 2)# 应用第二个卷积层,然后进行ReLU激活和最大池化x = F.relu(self.conv2(x))x = F.max_pool2d(x, 2, 2)# 将特征图展平,准备连接到全连接层x = x.view(x.size(0), -1)# 应用第一个全连接层,然后进行ReLU激活x = F.relu(self.fc1(x))# 应用第二个全连接层,得到最终的输出x = self.fc2(x)return x# 创建网络实例
net = SimpleCNN(num_classes=10)
print(net)
构造方法详解
-
继承与初始化:
class SimpleCNN(nn.Module):
定义了一个名为SimpleCNN
的类,它继承自nn.Module
。def __init__(self, num_classes=10):
是类的构造方法,self
表示实例本身,num_classes
是一个可选参数,指定分类的数量,默认为10。
-
调用父类构造方法:
super(SimpleCNN, self).__init__()
调用父类nn.Module
的构造方法,这是必需的,用于初始化基类的功能。
-
定义网络层:
self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1)
:
定义第一个卷积层,输入通道数为1,输出通道数为16,卷积核大小为3x3,步长为1,填充为1。self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)
:
定义第二个卷积层,输入通道数为16,输出通道数为32,卷积核大小为3x3,步长为1,填充为1。self.fc1 = nn.Linear(in_features=32 * 7 * 7, out_features=128)
: 定义第一个全连接层,输入特征数为3277,输出特征数为128。self.fc2 = nn.Linear(in_features=128, out_features=num_classes)
:
定义第二个全连接层,输入特征数为128,输出特征数为num_classes
。
-
前向传播方法:
def forward(self, x):
定义了网络的前向传播过程。x = F.relu(self.conv1(x))
: 对输入x
应用第一个卷积层,然后使用 ReLU 激活函数。x = F.max_pool2d(x, 2, 2)
: 对卷积后的特征图进行最大池化,池化核大小为2x2,步长为2。- 重复上述步骤,应用第二个卷积层和最大池化。
x = x.view(x.size(0), -1)
: 将特征图展平,以便连接到全连接层。x = F.relu(self.fc1(x))
: 应用第一个全连接层,并使用 ReLU 激活函数。x = self.fc2(x)
: 应用第二个全连接层,得到最终的输出。
-
创建网络实例:
net = SimpleCNN(num_classes=10)
: 创建SimpleCNN
类的实例,指定分类数为10。print(net)
: 打印网络的结构,查看网络的层次结构和参数。
通过这种方式,你可以在 PyTorch 中使用构造方法来定义复杂的神经网络结构,并灵活地调整网络的参数和层的配置。
3-为什么要把SimpleCNN传入到super(SimpleCNN, self).init()方法中
在 Python 中,super(SimpleCNN, self).__init__()
的作用是调用父类(nn.Module
)的构造方法。将 SimpleCNN
和 self
传入 super()
是为了明确指定当前类和实例,以便 Python 能够正确地找到父类并调用其构造方法。
详细解释
-
super()
的作用:super()
是一个内置函数,用于调用父类的方法。- 在类的继承关系中,
super()
允许你在子类中调用父类的构造方法或其他方法,而不需要显式地写出父类的名称。
-
super(SimpleCNN, self)
的含义:SimpleCNN
:这是当前类的名称,告诉super()
从哪个类开始查找父类。self
:这是当前类的实例,告诉super()
在哪个实例上调用父类的方法。- 综合起来,
super(SimpleCNN, self)
的意思是:从SimpleCNN
类的父类开始查找,并在当前实例self
上调用父类的方法。
-
为什么需要传入
SimpleCNN
和self
:- 在 Python 2 中,
super()
必须显式地传入当前类和实例,即super(SimpleCNN, self)
。 - 在 Python 3 中,
super()
可以简化为super().__init__()
,因为 Python 3
会自动推断当前类和实例。但为了兼容性和代码清晰性,许多开发者仍然使用super(SimpleCNN, self).__init__()
。
- 在 Python 2 中,
-
调用父类的构造方法:
__init__()
是类的构造方法,用于初始化对象。- 在子类中调用父类的构造方法是为了确保父类的初始化代码得到执行。如果不调用父类的构造方法,父类的属性和方法可能无法正确初始化。
示例代码
import torch.nn as nnclass SimpleCNN(nn.Module):def __init__(self, num_classes=10):super(SimpleCNN, self).__init__() # 调用父类 nn.Module 的构造方法# 定义网络层self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1)self.fc1 = nn.Linear(in_features=32 * 7 * 7, out_features=128)self.fc2 = nn.Linear(in_features=128, out_features=num_classes)
总结
super(SimpleCNN, self).__init__()
的作用是调用父类nn.Module
的构造方法,确保父类的初始化代码得到执行。- 传入
SimpleCNN
和self
是为了明确指定当前类和实例,以便 Python 能够正确地找到父类并调用其构造方法。 - 在 Python 3 中,可以简化为
super().__init__()
,但为了兼容性和代码清晰性,许多开发者仍然使用super(SimpleCNN, self).__init__()
。
5-pytorch的nn核心功能介绍
PyTorch 的 torch.nn
模块是构建神经网络的核心组件,它提供了构建神经网络所需的几乎所有基本组件。下面是对 torch.nn
模块中一些核心功能的介绍:
1. Module
- 作用:
Module
是所有神经网络模块的基础类。自定义的神经网络通常会继承torch.nn.Module
类,并在其中定义前向传播函数 (forward()
方法)。 - 示例:
import torch import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.linear = nn.Linear(10, 5) # 定义一个线性层def forward(self, x):x = self.linear(x)return xmodel = MyModel()
2. Linear Layers (线性层)
- 作用:
nn.Linear
模块用于实现全连接层(也称为线性层)。它接受输入特征并进行线性变换。 - 参数:
in_features
:输入特征的数量。out_features
:输出特征的数量。
- 示例:
linear_layer = nn.Linear(10, 5) input_tensor = torch.randn(1, 10) # (batch_size, in_features) output_tensor = linear_layer(input_tensor) # (batch_size, out_features)
3. Convolutional Layers (卷积层)
- 作用:
nn.Conv2d
模块用于实现二维卷积层,常用于图像处理任务。 - 参数:
in_channels
:输入通道数。out_channels
:输出通道数。kernel_size
:卷积核的大小。stride
:卷积步长。padding
:填充值。
- 示例:
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1) input_tensor = torch.randn(1, 3, 32, 32) # (batch_size, in_channels, height, width) output_tensor = conv_layer(input_tensor) # (batch_size, out_channels, height, width)
4. Activation Functions (激活函数)
- 作用:激活函数用于引入非线性,使得神经网络能够学习复杂的映射关系。
- 常见激活函数:
nn.ReLU
:ReLU (Rectified Linear Unit) 激活函数。nn.Sigmoid
:Sigmoid 激活函数。nn.Tanh
:Tanh 激活函数。
- 示例:
activation = nn.ReLU() input_tensor = torch.randn(1, 10) output_tensor = activation(input_tensor)
5. Pooling Layers (池化层)
- 作用:池化层用于降低特征图的维度,减少参数数量,有助于防止过拟合。
- 常见池化层:
nn.MaxPool2d
:最大池化层。nn.AvgPool2d
:平均池化层。
- 示例:
pool_layer = nn.MaxPool2d(kernel_size=2, stride=2) input_tensor = torch.randn(1, 16, 32, 32) # (batch_size, channels, height, width) output_tensor = pool_layer(input_tensor) # (batch_size, channels, height/2, width/2)
6. Normalization Layers (归一化层)
- 作用:归一化层用于加快训练速度,减少内部协变量偏移。
- 常见归一化层:
nn.BatchNorm2d
:二维批量归一化层。nn.LayerNorm
:层归一化层。
- 示例:
norm_layer = nn.BatchNorm2d(16) input_tensor = torch.randn(1, 16, 32, 32) # (batch_size, channels, height, width) output_tensor = norm_layer(input_tensor)
7. Loss Functions (损失函数)
- 作用:损失函数用于衡量模型输出与真实标签之间的差异,指导模型的优化过程。
- 常见损失函数:
nn.CrossEntropyLoss
:交叉熵损失,常用于分类任务。nn.MSELoss
:均方误差损失,常用于回归任务。
- 示例:
loss_fn = nn.CrossEntropyLoss() input_tensor = torch.randn(3, 5) # (batch_size, num_classes) target_tensor = torch.tensor([1, 0, 4]) # (batch_size) loss = loss_fn(input_tensor, target_tensor)
8. Optimizers (优化器)
- 作用:优化器用于更新模型的参数,以最小化损失函数。
- 常见优化器:
torch.optim.SGD
:随机梯度下降优化器。torch.optim.Adam
:Adam 优化器。
- 示例:
import torch.optim as optimoptimizer = optim.Adam(model.parameters(), lr=0.001)
9. Sequential (顺序容器)
- 作用:
nn.Sequential
是一个容器,用于按顺序堆叠多个层。 - 示例:
model = nn.Sequential(nn.Linear(10, 5),nn.ReLU(),nn.Linear(5, 2) )
10. Dropout (丢弃层)
- 作用:丢弃层用于防止过拟合,随机地将部分神经元的输出设置为零。
- 示例:
dropout_layer = nn.Dropout(p=0.5) input_tensor = torch.randn(1, 10) output_tensor = dropout_layer(input_tensor)
11. Functionality for Data Handling (数据处理功能)
- 作用:虽然不直接属于
torch.nn
,但torch.utils.data
提供了一些方便的数据处理工具,如DataLoader
和Dataset
。 - 示例:
from torch.utils.data import DataLoader, TensorDatasetdataset = TensorDataset(torch.randn(100, 10), torch.randint(0, 2, (100,))) dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
以上是 torch.nn
模块中的一些核心功能。通过这些组件,可以灵活地构建各种复杂的神经网络模型。
6-pytorch的nn包目录结构
nn
- backends 管理和配置深度学习模型在不同硬件(如 CPU、GPU)和底层库(如 cuDNN、MKL)上的执行方式
- intrinsic 提供了一些预定义的“组合层”,这些组合层通常是将多个基本的操作(如卷积和批量归一化)合并在一起,以提高计算效率
- modules 提供一种结构化的方式来定义、管理和组织神经网络的各个组件
- parallel 提供了几种不同的并行化策略,帮助用户充分利用多核 CPU 或多个 GPU 的计算资源
- qat 量化是将浮点数权重和激活值转换为低精度整数,减少模型的计算量和内存占用,加速推理过程
- quantizable 训练阶段-提供了一系列的量化感知模块,可以在训练过程中模拟量化操作,从而使模型学习到在量化后仍然表现良好的参数
- quantized 推理阶段-提供了一系列的量化模块,量化模块在推理阶段使用低精度整数进行计算,从而实现高效的推理
- utils 包含了一系列辅助函数和类,用于数据处理、模型训练、保存和加载
7-pytorch的nn包目录backends
torch.nn.backends
是 PyTorch 提供的一个后端模块,主要用于管理和配置深度学习模型在不同硬件(如 CPU、GPU)和底层库(如
cuDNN、MKL)上的执行方式。它通过提供一致的接口,使得开发者可以在不同的硬件和库之间无缝切换,同时优化计算性能。
1. torch.nn.backends
的主要功能
torch.nn.backends
的主要功能包括:
- 配置和控制底层库的行为:
- 例如,控制 cuDNN、MKL 等底层库的性能优化选项。
- 启用或禁用特定的后端功能:
- 例如,启用或禁用混合精度训练支持。
- 支持跨硬件的计算:
- 支持在 CPU 和 GPU 上执行计算任务。
2. torch.nn.backends
的核心模块和方法
2.1 cuDNN 后端配置
torch.nn.backends.cudnn
是 torch.nn.backends
中最重要的子模块之一,用于配置和控制 cuDNN(NVIDIA 的深度学习库)的行为。
-
启用/禁用 cuDNN:
import torch.nn as nn# 启用 cuDNN nn.backends.cudnn.enabled = True# 禁用 cuDNN nn.backends.cudnn.enabled = False
-
启用/禁用 cuDNN 的 benchmark 模式:
- 启用后,cuDNN 会根据输入大小自动选择最优算法,可能会消耗一些时间用于优化。
nn.backends.cudnn.benchmark = True # 启用 nn.backends.cudnn.benchmark = False # 禁用
-
启用/禁用 cuDNN 的 deterministic 模式:
- 启用后,cuDNN 的计算结果将是确定性的,但性能可能会有所下降。
nn.backends.cudnn.deterministic = True # 启用 nn.backends.cudnn.deterministic = False # 禁用
2.2 MKL 后端配置
torch.nn.backends.mkl
是用于配置 MKL(Intel 的数学核心库)的后端模块。
- 启用/禁用 MKL:
import torch.nn as nn# 启用 MKL nn.backends.mkl.enabled = True# 禁用 MKL nn.backends.mkl.enabled = False
2.3 其他后端配置
-
CUDA 后端:
- 用于管理 CUDA 设备的设置。
- 示例:
import torch.nn as nn# 检查是否支持 CUDA print(torch.cuda.is_available())
-
混合精度训练支持:
- 使用
torch.nn.backends.cuda.sdp_kernel
或torch.nn.functional.scaled_dot_product_attention
实现混合精度训练。
- 使用
3. torch.nn.backends
的适用场景
torch.nn.backends
主要用于以下场景:
- 优化模型性能:
- 通过启用
cuDNN
的 benchmark 模式,自动选择最优算法,提升计算效率。
- 通过启用
- 确保计算结果的确定性:
- 通过启用
cuDNN
的 deterministic 模式,确保计算结果在不同运行中一致。
- 通过启用
- 跨硬件执行计算任务:
- 支持在 CPU(使用 MKL)和 GPU(使用 cuDNN)上执行计算。
- 管理后端库的行为:
- 控制底层库(如 cuDNN、MKL)的启用和禁用。
4. 示例:使用 torch.nn.backends.cudnn
优化模型
以下是一个简单的示例,展示如何使用 torch.nn.backends.cudnn
优化模型的训练:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.nn.utils import clip_grad_norm_# 启用 cuDNN
nn.backends.cudnn.enabled = True
nn.backends.cudnn.benchmark = True # 自动选择最优算法
nn.backends.cudnn.deterministic = False # 非确定性模式(更快)# 定义一个简单的模型
model = nn.Sequential(nn.Linear(10, 100),nn.ReLU(),nn.Linear(100, 1)
)# 使用 GPU 进行训练
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)# 训练过程
for _ in range(100):input = torch.randn(16, 10).to(device)output = model(input)loss = output.sum()loss.backward()# 梯度裁剪clip_grad_norm_(model.parameters(), max_norm=1.0)optimizer.step()optimizer.zero_grad()
5. 总结
torch.nn.backends
是 PyTorch
提供的一个后端管理模块,主要用于配置和优化深度学习模型在不同硬件和底层库上的执行。通过 torch.nn.backends
,开发者可以:
- 启用或禁用 cuDNN、MKL 等底层库。
- 优化计算性能,自动选择最优算法。
- 确保计算结果的确定性。
- 支持跨硬件的计算任务。
这些功能使得开发者可以更高效地实现和优化深度学习模型的训练和推理,同时充分利用硬件的计算能力。
8-pytorch的nn包目录intrinsic
torch.nn.intrinsic
是 PyTorch 中的一个子模块,主要用于优化和集成一些常见的神经网络层组合。它的设计目的是为了在某些硬件(如
NVIDIA 的 Tensor Core)上加速模型的推理和训练过程。具体来说,torch.nn.intrinsic
模块提供了一些预定义的“组合层”(composite
layers),这些组合层通常是将多个基本的操作(如卷积和批量归一化)合并在一起,以提高计算效率。
主要功能
-
组合层(Composite Layers)
torch.nn.intrinsic
提供了一些常见的组合层,这些组合层通常是将卷积层(Conv2d)与批量归一化层(BatchNorm2d)或其他操作(如
ReLU)合并在一起。- 通过将这些操作合并为一个层,可以减少内存访问次数,优化计算流程,从而在某些硬件上获得显著的性能提升。
-
量化感知训练(Quantization-Aware Training)
torch.nn.intrinsic
模块还与 PyTorch 的量化支持相关。量化是一种将浮点运算转换为低精度运算(如 8
位整数)的技术,可以显著减少模型的存储和计算开销。torch.nn.intrinsic
提供了一些量化友好的组合层,使得在量化感知训练过程中,能够更方便地处理这些组合操作。
常见的组合层
以下是 torch.nn.intrinsic
中一些常见的组合层:
-
nn.intrinsic.ConvBn2d
- 将
Conv2d
和BatchNorm2d
合并为一个层。 - 这种组合在推理阶段可以直接融合为一个卷积操作,减少计算开销。
- 将
-
nn.intrinsic.ConvBnReLU2d
- 将
Conv2d
、BatchNorm2d
和ReLU
合并为一个层。 - 这种组合在推理阶段可以进一步减少计算步骤。
- 将
-
nn.intrinsic.LinearReLU
- 将
Linear
和ReLU
合并为一个层。 - 这种组合在某些硬件上可以更高效地执行。
- 将
示例
以下是一个使用 ConvBn2d
的简单示例:
import torch
import torch.nn as nn
import torch.nn.intrinsic as nni# 定义一个组合层:Conv2d + BatchNorm2d
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.conv_bn = nni.ConvBn2d(in_channels=3,out_channels=16,kernel_size=3,stride=1,padding=1,bias=False)def forward(self, x):x = self.conv_bn(x)return x# 创建模型实例
model = MyModel()# 输入数据
input_tensor = torch.randn(1, 3, 32, 32) # (batch_size, in_channels, height, width)# 前向传播
output_tensor = model(input_tensor)
print(output_tensor.shape) # 输出:torch.Size([1, 16, 32, 32])
总结
torch.nn.intrinsic
模块的主要作用是通过将常见的神经网络层组合在一起,优化计算流程,特别是在量化感知训练和某些硬件加速(如
Tensor Core)的场景下。这些组合层可以显著提高模型的推理速度和训练效率。如果你在使用 PyTorch
并且有性能优化的需求,尤其是在量化或硬件加速的场景下,torch.nn.intrinsic
模块是一个非常有用的工具。
9-pytorch的nn包目录modules
torch.nn.modules
是 PyTorch 中 torch.nn
模块的核心包之一,它包含了所有神经网络模块的基础类和各种具体的神经网络层。nn.modules
的主要作用是提供一种结构化的方式来定义、管理和组织神经网络的各个组件。以下是对 torch.nn.modules
的详细介绍:
1. 核心功能
a. Module
类
nn.Module
是所有神经网络模块的基类。所有自定义的神经网络模型都应该继承这个类。nn.Module
提供了以下核心功能:- 参数管理:自动管理模型的参数(通过
parameters()
方法访问)。 - 子模块管理:可以嵌套定义多个子模块,形成复杂的神经网络结构。
- 前向传播定义:通过重写
forward()
方法来定义前向传播逻辑。
- 参数管理:自动管理模型的参数(通过
b. 子模块管理
nn.Module
支持嵌套子模块,子模块可以通过self.add_module()
或直接在__init__
中定义。- 子模块会被自动注册到父模块中,方便进行统一的管理和调用。
c. 参数管理
- 所有定义在
nn.Module
中的nn.Parameter
或nn.Module
类型的属性都会被自动识别为模型的参数。 - 可以通过
self.parameters()
或self.named_parameters()
方法访问这些参数。
2. 常见模块
nn.modules
包含了大量的预定义模块,这些模块可以直接用于构建神经网络。以下是一些常见的模块:
a. 线性层 (nn.Linear
)
- 用于实现全连接层(线性变换)。
- 示例:
linear_layer = nn.Linear(10, 5) input_tensor = torch.randn(1, 10) output_tensor = linear_layer(input_tensor)
b. 卷积层 (nn.Conv2d
)
- 用于实现二维卷积,常用于图像处理。
- 示例:
conv_layer = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1) input_tensor = torch.randn(1, 3, 32, 32) output_tensor = conv_layer(input_tensor)
c. 激活函数 (nn.ReLU
, nn.Sigmoid
, nn.Tanh
)
- 用于引入非线性。
- 示例:
relu = nn.ReLU() input_tensor = torch.randn(1, 10) output_tensor = relu(input_tensor)
d. 池化层 (nn.MaxPool2d
, nn.AvgPool2d
)
- 用于降低特征图的维度。
- 示例:
maxpool_layer = nn.MaxPool2d(kernel_size=2, stride=2) input_tensor = torch.randn(1, 16, 32, 32) output_tensor = maxpool_layer(input_tensor)
e. 归一化层 (nn.BatchNorm2d
, nn.LayerNorm
)
- 用于加速训练和稳定学习过程。
- 示例:
batchnorm_layer = nn.BatchNorm2d(16) input_tensor = torch.randn(1, 16, 32, 32) output_tensor = batchnorm_layer(input_tensor)
f. 损失函数 (nn.CrossEntropyLoss
, nn.MSELoss
)
- 用于定义模型的损失函数。
- 示例:
loss_fn = nn.CrossEntropyLoss() input_tensor = torch.randn(3, 5) target_tensor = torch.tensor([1, 0, 4]) loss = loss_fn(input_tensor, target_tensor)
g. 其他常见模块
- 丢弃层 (
nn.Dropout
):用于防止过拟合。 - 循环层 (
nn.RNN
,nn.LSTM
,nn.GRU
):用于处理序列数据。 - 注意力机制 (
nn.MultiheadAttention
):用于实现注意力机制,常见于 Transformer 模型。
3. 自定义模块
用户可以通过继承 nn.Module
类来自定义神经网络模块。自定义模块的基本步骤如下:
- 继承
nn.Module
类:创建一个新的类,并继承nn.Module
。 - 定义初始化方法 (
__init__
):在初始化方法中定义模型的各个层或子模块。 - 定义前向传播方法 (
forward
):在前向传播方法中定义数据通过模型的流程。
示例:
import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)self.relu = nn.ReLU()self.pool = nn.MaxPool2d(kernel_size=2, stride=2)self.linear = nn.Linear(16 * 16 * 16, 10)def forward(self, x):x = self.conv1(x)x = self.relu(x)x = self.pool(x)x = x.view(x.size(0), -1) # 展平x = self.linear(x)return xmodel = MyModel()
input_tensor = torch.randn(1, 3, 32, 32)
output_tensor = model(input_tensor)
print(output_tensor.shape) # 输出:torch.Size([1, 10])
4. 模块嵌套
nn.Module
支持模块的嵌套,这意味着你可以在一个模块中定义另一个模块。这种方式可以方便地构建复杂的神经网络结构。
示例:
class ConvBlock(nn.Module):def __init__(self):super(ConvBlock, self).__init__()self.conv = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)self.relu = nn.ReLU()def forward(self, x):x = self.conv(x)x = self.relu(x)return xclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.conv_block = ConvBlock()self.linear = nn.Linear(16 * 32 * 32, 10)def forward(self, x):x = self.conv_block(x)x = x.view(x.size(0), -1) # 展平x = self.linear(x)return xmodel = MyModel()
input_tensor = torch.randn(1, 3, 32, 32)
output_tensor = model(input_tensor)
print(output_tensor.shape) # 输出:torch.Size([1, 10])
5. 总结
torch.nn.modules
是 PyTorch 中用于构建神经网络的核心包,提供了以下功能:
- 模块化设计:通过继承
nn.Module
,用户可以方便地定义和管理神经网络的各个组件。 - 预定义模块:包含了大量常用的神经网络层和操作,如卷积、池化、激活函数、归一化等。
- 参数管理:自动管理模型的参数,方便优化器的使用。
- 模块嵌套:支持复杂的神经网络结构,可以通过嵌套定义多个子模块。
通过 torch.nn.modules
,用户可以灵活地构建各种复杂的神经网络模型,并且能够高效地进行训练和推理。它是 PyTorch
中神经网络编程的核心工具之一。
10-pytorch的nn包目录parallel
torch.nn.parallel
是 PyTorch 中用于并行计算的模块,主要用于在多个 GPU 或多个设备上并行地运行神经网络模型。它提供了几种不同的并行化策略,帮助用户充分利用多核
CPU 或多个 GPU 的计算资源,从而加速模型的训练和推理过程。
以下是对 torch.nn.parallel
模块的详细解释和工作原理:
1. torch.nn.parallel
的主要功能
a. 数据并行 (DataParallel
)
-
功能:将输入数据拆分成多个小批次(minibatches),并将这些小批次分发到不同的 GPU 上进行并行计算。每个 GPU
都会独立处理一部分数据,并在反向传播时同步梯度。 -
优点:适用于单机多卡的场景,代码实现简单。
-
缺点:由于需要频繁的 GPU 间通信,性能可能受限,尤其是在 GPU 数量较多的情况下。
-
适用场景:简单的多 GPU 并行训练,适合中小型模型。
-
示例:
import torch import torch.nn as nn# 定义一个简单的模型 model = nn.Sequential(nn.Linear(10, 100),nn.ReLU(),nn.Linear(100, 10) )# 将模型放到 GPU 上 if torch.cuda.is_available():model = model.cuda()# 使用 DataParallel 进行数据并行if torch.cuda.device_count() > 1:model = nn.DataParallel(model)# 定义输入数据 input_data = torch.randn(32, 10).cuda()# 前向传播 output = model(input_data) print(output.shape) # 输出:torch.Size([32, 10])
b. 分布式数据并行 (DistributedDataParallel
, DDP)
-
功能:
DistributedDataParallel
是 PyTorch 推荐的并行化方案,适用于多机多卡的场景。它的核心思想是将模型复制到每个 GPU
上,并在每个设备上独立处理数据,通过分布式通信库(如 NCCL 或 Gloo)来同步梯度。 -
优点:
- 性能优于
DataParallel
,尤其是在多机多卡的场景下。 - 支持异步梯度同步(梯度累积),适用于大批量数据的训练。
- 性能优于
-
缺点:
- 实现较为复杂,需要额外的分布式启动脚本。
-
适用场景:多机多卡的大规模分布式训练。
-
示例:
import torch import torch.nn as nn import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDPdef setup(rank, world_size):dist.init_process_group("nccl", rank=rank, world_size=world_size)def cleanup():dist.destroy_process_group()class ToyModel(nn.Module):def __init__(self):super(ToyModel, self).__init__()self.net = nn.Linear(10, 100)def forward(self, x):return self.net(x)def demo_basic(rank, world_size):print(f"Running DDP on rank {rank}.")setup(rank, world_size)# 创建模型并放到当前 GPU 上model = ToyModel().to(rank)ddp_model = DDP(model, device_ids=[rank])# 定义损失函数和优化器loss_fn = nn.MSELoss()optimizer = torch.optim.SGD(ddp_model.parameters(), lr=0.001)# 前向传播和反向传播for _ in range(10):inputs = torch.randn(20, 10).to(rank)outputs = ddp_model(inputs)loss = loss_fn(outputs, torch.randn(20, 100).to(rank))optimizer.zero_grad()loss.backward()optimizer.step()cleanup()if __name__ == "__main__":world_size = 2 # 假设有 2 个 GPUtorch.multiprocessing.spawn(demo_basic, args=(world_size,), nprocs=world_size, join=True)
c. 张量并行 (TensorParallel
)
-
功能:将模型的单个张量拆分到多个 GPU 上进行并行计算。例如,将一个全连接层的权重矩阵按列或行拆分到不同的 GPU 上。
-
优点:适用于非常大的模型,单个 GPU 无法容纳模型权重。
-
缺点:实现复杂,需要手动拆分和合并张量。
-
适用场景:超大型模型的训练(如 GPT-3 等)。
-
示例:
# 示例:将一个全连接层拆分到多个 GPU 上 class TensorParallelLinear(nn.Module):def __init__(self, in_features, out_features, n_gpus):super(TensorParallelLinear, self).__init__()self.n_gpus = n_gpusself.in_features = in_featuresself.out_features = out_features# 将权重矩阵按列拆分self.weight = nn.Parameter(torch.randn(out_features // n_gpus, in_features))self.bias = nn.Parameter(torch.zeros(out_features // n_gpus))def forward(self, x):# 将输入张量复制到多个 GPU 上x = x.cuda(0)outputs = []for i in range(self.n_gpus):output = F.linear(x, self.weight[i * (self.out_features // self.n_gpus): (i + 1) * (self.out_features // self.n_gpus)], self.bias)outputs.append(output.cuda(i))return torch.cat(outputs, dim=1)
2. torch.nn.parallel
的核心类和方法
a. DataParallel
- 定义:
DataParallel(module, device_ids=None, output_device=None, dim=0)
- 参数:
module
:要并行化的模型。device_ids
:参与并行计算的 GPU 列表。output_device
:输出结果的设备。
- 返回值:一个支持数据并行的
DataParallel
对象。
b. DistributedDataParallel
- 定义
:DistributedDataParallel(module, device_ids=None, output_device=None, process_group=None, find_unused_parameters=False)
- 参数:
module
:要并行化的模型。device_ids
:参与并行计算的 GPU 列表。output_device
:输出结果的设备。process_group
:分布式进程组。find_unused_parameters
:是否自动检测未使用的参数。
- 返回值:一个支持分布式数据并行的
DistributedDataParallel
对象。
3. 选择合适的并行化策略
并行化策略 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
DataParallel | 单机多卡 | 实现简单,快速上手 | 性能较差,通信开销大 |
DistributedDataParallel | 多机多卡 | 性能优异,支持大规模分布式训练 | 实现复杂,需要分布式启动脚本 |
TensorParallel | 超大模型(单 GPU 无法容纳) | 支持超大型模型的训练 | 实现复杂,需要手动拆分张量 |
4. 总结
torch.nn.parallel
模块提供了多种并行化策略,帮助用户充分利用多 GPU 或多机的计算资源。根据不同的应用场景,可以选择以下策略:
- 对于单机多卡的简单并行训练,可以使用
DataParallel
。 - 对于多机多卡的高性能分布式训练,推荐使用
DistributedDataParallel
。 - 对于超大型模型的训练,可以考虑实现自定义的张量并行逻辑。
通过合理的并行化策略,可以显著提升模型的训练速度,从而更高效地完成深度学习任务。
11-pytorch的nn包目录qat
torch.nn.qat
是 PyTorch 中用于 量化感知训练(Quantization-Aware Training, QAT)
的模块。量化感知训练是一种在模型训练过程中模拟量化效果的技术,目的是让模型在量化后仍能保持较高的精度。量化是将浮点数权重和激活值转换为低精度整数(如
8 位整数)的过程,通常用于减少模型的计算量和内存占用,从而加速推理过程并降低功耗。
1. 量化的背景
在深度学习中,模型通常使用浮点数(如
FP32)进行计算。然而,浮点数计算需要较高的计算资源和内存带宽。为了在资源受限的设备(如移动设备、嵌入式设备)上部署模型,通常会对模型进行量化,即将浮点数转换为低精度的整数(如
INT8)。量化可以显著减少模型的大小和计算量,但可能会引入精度损失。
量化分为两种主要方式:
- 后训练量化(Post-Training Quantization, PTQ):在模型训练完成后直接对模型进行量化。
- 量化感知训练(Quantization-Aware Training, QAT):在训练过程中模拟量化效果,使模型在量化后仍能保持较高的精度。
torch.nn.qat
主要用于实现量化感知训练。
2. torch.nn.qat
的功能
torch.nn.qat
提供了一系列模块(如 nn.qat.Linear
、nn.qat.Conv2d
等),这些模块在训练过程中会模拟量化的效果,从而让模型在量化后仍能保持较高的精度。具体来说,torch.nn.qat
的功能包括:
- 模拟量化:在训练过程中,
torch.nn.qat
模块会模拟量化操作(如将浮点数转换为整数),但实际计算仍使用浮点数。 - 反向传播优化:通过模拟量化,模型可以在训练过程中学习如何适应量化带来的精度损失。
- 无缝转换:训练完成后,
torch.nn.qat
模块可以无缝转换为量化模块(如torch.nn.quantized.Linear
),从而直接用于推理。
3. torch.nn.qat
的核心模块
torch.nn.qat
提供了以下核心模块:
nn.qat.Linear
:量化感知的全连接层。nn.qat.Conv2d
:量化感知的二维卷积层。nn.qat.Conv3d
:量化感知的三维卷积层。nn.qat.Embedding
:量化感知的嵌入层。
这些模块的使用方式与普通的 torch.nn
模块类似,但在训练过程中会模拟量化效果。
4. 量化感知训练的流程
量化感知训练通常包括以下步骤:
- 定义模型:使用
torch.nn.qat
模块定义模型。 - 训练模型:在训练过程中,
torch.nn.qat
模块会模拟量化效果。 - 转换为量化模型:训练完成后,将
torch.nn.qat
模块转换为量化模块(如torch.nn.quantized.Linear
)。 - 推理:使用量化模型进行推理。
5. 代码示例
以下是一个使用 torch.nn.qat
进行量化感知训练的简单示例:
import torch
import torch.nn as nn
import torch.nn.qat as nnqat
import torch.optim as optim
from torch.quantization import prepare_qat, convert# 定义一个简单的模型
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.conv = nnqat.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)self.relu = nn.ReLU()self.fc = nnqat.Linear(32 * 28 * 28, 10)def forward(self, x):x = self.conv(x)x = self.relu(x)x = x.view(x.size(0), -1)x = self.fc(x)return x# 创建模型实例
model = SimpleModel()# 准备量化感知训练
model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm')
model = prepare_qat(model)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)# 模拟训练过程
for epoch in range(10):inputs = torch.randn(32, 1, 28, 28) # 模拟输入数据labels = torch.randint(0, 10, (32,)) # 模拟标签数据optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# 转换为量化模型
model = convert(model)# 推理
with torch.no_grad():test_input = torch.randn(1, 1, 28, 28)output = model(test_input)print(output)
6. torch.nn.qat
的工作原理
在量化感知训练过程中,torch.nn.qat
模块会执行以下操作:
- 前向传播:
- 在每次前向传播时,
torch.nn.qat
模块会模拟量化操作(如将浮点数转换为整数),但实际计算仍使用浮点数。 - 这种模拟量化操作可以帮助模型适应量化带来的精度损失。
- 在每次前向传播时,
- 反向传播:
- 在反向传播时,
torch.nn.qat
模块会计算梯度并更新权重,同时考虑量化带来的影响。
- 在反向传播时,
- 转换:
- 训练完成后,
torch.nn.qat
模块可以无缝转换为量化模块(如torch.nn.quantized.Linear
),从而直接用于推理。
- 训练完成后,
7. torch.nn.qat
的适用场景
torch.nn.qat
适用于以下场景:
- 需要在资源受限的设备(如移动设备、嵌入式设备)上部署模型。
- 需要在保持较高精度的同时减少模型的计算量和内存占用。
- 需要在训练过程中模拟量化效果,从而让模型在量化后仍能保持较高的精度。
8. 总结
torch.nn.qat
是 PyTorch
中用于量化感知训练的模块,通过在训练过程中模拟量化效果,帮助模型在量化后仍能保持较高的精度。它的核心功能包括模拟量化、反向传播优化和无缝转换为量化模型。通过使用 torch.nn.qat
,可以在资源受限的设备上高效部署深度学习模型。
12-pytorch的nn包目录quantizable
在 PyTorch 中,nn.quantizable
是一个用于量化感知训练(Quantization-Aware Training,
QAT)的模块集。量化感知训练是一种训练技术,它在训练过程中模拟量化操作,以使模型在量化后仍然保持较高的精度。量化是将模型的权重和激活从浮点数转换为低精度整数(如8位整数),这可以显著减少模型的大小和计算量,从而提高推理速度并降低功耗。
nn.quantizable
的用途
nn.quantizable
模块主要用于实现量化感知训练。通过使用这些模块,开发者可以在训练过程中模拟量化操作,从而使模型学习到在量化后仍然表现良好的参数。
具体来说,nn.quantizable
模块会在训练期间模拟量化效果,但实际的计算仍然使用浮点数,以确保数值稳定性。这样,模型在训练过程中就能够适应量化带来的精度损失,并通过反向传播来优化参数。
核心概念
-
量化感知训练(QAT):
- 在训练过程中模拟量化操作,使模型学习到在量化后仍然表现良好的参数。
-
模拟量化:
- 在训练期间,模拟量化操作(如权重和激活的量化),但实际计算仍然使用浮点数。
-
转换为量化模型:
- 训练完成后,将模型转换为真正的量化模型,以便在推理时使用低精度整数进行计算。
主要模块
nn.quantizable
提供了一系列的量化感知模块,例如:
nn.quantizable.Linear
:量化感知的线性层。nn.quantizable.Conv2d
:量化感知的二维卷积层。nn.quantizable.Conv3d
:量化感知的三维卷积层。nn.quantizable.Embedding
:量化感知的嵌入层。
这些模块的使用方式与对应的非量化版本类似,但它们在训练过程中会模拟量化效果。
使用流程
使用 nn.quantizable
进行量化感知训练通常包括以下几个步骤:
-
定义模型:
- 使用
nn.quantizable
模块定义模型结构。
- 使用
-
准备量化:
- 设置量化配置,准备量化感知训练。
-
训练模型:
- 在训练过程中,模拟量化效果,训练模型。
-
转换为量化模型:
- 训练完成后,将模型转换为量化模型,以便进行高效的推理。
示例代码
以下是一个简单的示例,展示了如何使用 nn.quantizable
进行量化感知训练:
import torch
import torch.nn as nn
import torch.nn.quantizable as nnqat
import torch.optim as optim
from torch.quantization import prepare_qat, convertclass SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.conv = nnqat.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)self.relu = nn.ReLU()self.fc = nnqat.Linear(32 * 28 * 28, 10)def forward(self, x):x = self.conv(x)x = self.relu(x)x = x.view(x.size(0), -1)x = self.fc(x)return x# 创建模型实例
model = SimpleModel()# 设置量化配置
model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm')# 准备量化感知训练
model = prepare_qat(model)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)# 模拟训练过程
for epoch in range(10):inputs = torch.randn(32, 1, 28, 28)labels = torch.randint(0, 10, (32,))optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# 转换为量化模型
model = convert(model)# 进行推理
with torch.no_grad():test_input = torch.randn(1, 1, 28, 28)output = model(test_input)print(output)
总结
nn.quantizable
是 PyTorch
中用于量化感知训练的重要模块集,它允许开发者在训练过程中模拟量化效果,从而在不显著损失精度的情况下,减小模型大小并提高推理效率。通过使用这些模块,可以更有效地将深度学习模型部署到资源受限的设备上。
13-pytorch的nn包目录quantized
torch.nn.quantized
是 PyTorch 中用于表示和操作 量化模型 的模块。量化模型是指在推理阶段使用低精度整数(如
INT8)进行计算的模型。通过量化,可以显著减少模型的计算量和内存占用,从而提高推理速度并降低功耗。torch.nn.quantized
提供了一系列的量化模块,用于替代传统的浮点数模块,以便在推理阶段使用。
1. 量化的背景
在深度学习中,模型通常使用浮点数(如
FP32)进行计算。然而,浮点数计算需要较高的计算资源和内存带宽。为了在资源受限的设备(如移动设备、嵌入式设备)上部署模型,通常会使用量化技术,将模型的权重和激活值从浮点数转换为低精度整数(如
INT8)。量化可以带来以下好处:
- 减少模型的存储空间和内存占用。
- 加速推理速度,因为整数运算通常比浮点运算更快。
- 降低功耗,尤其是在硬件支持低精度计算的情况下。
量化分为两种主要方式:
- 后训练量化(Post-Training Quantization, PTQ):在模型训练完成后直接对模型进行量化。
- 量化感知训练(Quantization-Aware Training, QAT):在训练过程中模拟量化,使模型在量化后仍能保持较高的精度。
torch.nn.quantized
主要用于表示后训练量化和量化感知训练后的量化模型。
2. torch.nn.quantized
的功能
torch.nn.quantized
提供了一系列的量化模块,用于替代传统的浮点数模块(如 torch.nn.Linear
和 torch.nn.Conv2d
)。量化模块在推理阶段使用低精度整数进行计算,从而实现高效的推理。具体来说,torch.nn.quantized
的功能包括:
- 量化操作:将模型的权重和激活值从浮点数转换为低精度整数。
- 整数运算:在推理过程中使用整数运算,而不是传统的浮点运算。
- 高效推理:通过减少计算量和内存占用,显著提高推理速度。
3. torch.nn.quantized
的核心模块
torch.nn.quantized
提供了以下核心模块(支持 INT8 量化):
nn.quantized.Linear
:量化版本的线性层。nn.quantized.Conv2d
:量化版本的二维卷积层。nn.quantized.Conv3d
:量化版本的三维卷积层。nn.quantized.ReLU
:量化版本的 ReLU 激活函数。nn.quantized.FloatFunctional
:用于处理量化模型的数学操作(如加法、乘法)。nn.quantized.Embedding
:量化版本的嵌入层。nn.quantized.LSTM
:量化版本的 LSTM 模块。
这些模块在推理阶段使用整数运算,从而实现高效的推理。
4. 量化模型的创建流程
创建一个量化模型的典型流程如下:
- 训练模型:使用浮点数模型进行训练(如果使用 QAT,则使用
torch.nn.qat
模块进行量化感知训练)。 - 准备量化:将训练好的模型转换为量化模型。
- 推理:使用量化模型进行推理。
5. 代码示例
以下是一个简单的示例,展示了如何使用 torch.nn.quantized
模块构建和使用量化模型:
import torch
import torch.nn as nn
import torch.nn.quantized as nnq
import torch.quantization as quant# 1. 定义一个简单的浮点数模型
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.conv = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)self.relu = nn.ReLU()self.fc = nn.Linear(32 * 28 * 28, 10)def forward(self, x):x = self.conv(x)x = self.relu(x)x = x.view(x.size(0), -1)x = self.fc(x)return x# 2. 创建浮点数模型实例
model = SimpleModel()# 3. 准备量化
model.qconfig = quant.get_default_qconfig('fbgemm') # 设置量化配置
quant.prepare(model, inplace=True) # 准备量化# 4. 校准模型(需要提供校准数据)
with torch.no_grad():# 模拟输入数据inputs = torch.randn(32, 1, 28, 28)model(inputs) # 通过前向传播校准量化参数# 5. 转换为量化模型
quant.convert(model, inplace=True)# 6. 推理
# 注意:量化模型需要使用特殊的数据格式(如 QuantizedTensor)
with torch.no_grad():test_input = torch.randn(1, 1, 28, 28)test_input_quantized = torch.quantize_per_tensor(test_input, scale=1.0, zero_point=0, dtype=torch.quint8)output = model(test_input_quantized)print(output)
6. torch.nn.quantized
的工作原理
在量化模型的推理过程中,torch.nn.quantized
模块会执行以下操作:
- 权重和激活的量化:
- 将模型的权重和激活值从浮点数转换为低精度整数(如 INT8)。
- 整数运算:
- 使用整数运算代替传统的浮点运算,从而减少计算量。
- 反量化:
- 在某些情况下(如输出层),将整数结果反量化为浮点数,以便进行后续计算或输出。
7. torch.nn.quantized
的适用场景
torch.nn.quantized
适用于以下场景:
- 需要将训练好的模型部署到资源受限的设备(如移动设备、嵌入式设备)。
- 需要在推理阶段显著减少模型的计算量和内存占用。
- 需要提高推理速度并降低功耗。
8. 总结
torch.nn.quantized
是 PyTorch
中用于表示和操作量化模型的模块。它提供了量化版本的常见神经网络层(如线性层、卷积层),允许在推理阶段使用低精度整数进行计算,从而显著提高推理效率。通过使用 torch.nn.quantized
,可以将深度学习模型高效地部署到资源受限的设备上。
14-pytorch的nn包目录utils
torch.nn.utils
是 PyTorch
提供的一个实用工具模块,旨在简化深度学习模型训练和推理过程中的各种任务。它包含了一系列辅助函数和类,用于数据处理、模型训练、保存和加载、模块管理等。通过使用 torch.nn.utils
,开发者可以更高效地实现复杂的深度学习任务。
1. torch.nn.utils
的主要功能
torch.nn.utils
提供了以下几类实用工具:
- 梯度处理:
- 用于裁剪梯度(Gradient Clipping),防止梯度爆炸。
- 模型序列化:
- 保存和加载模型参数。
- 模块管理:
- 用于管理模块的参数和梯度。
- 量化支持:
- 为量化模型提供辅助工具。
- 通用工具:
- 提供如数据拆分、模块复制等通用功能。
2. torch.nn.utils
的核心模块和方法
以下是 torch.nn.utils
中的一些核心模块和方法:
2.1 梯度处理
-
torch.nn.utils.clip_grad_norm_
:- 裁剪模型参数的梯度范数,防止梯度爆炸。
- 常用在训练中,避免梯度过大导致模型不稳定。
- 示例:
import torch.nn as nn import torch.optim as optim from torch.nn.utils import clip_grad_norm_model = nn.Linear(10, 1) optimizer = optim.SGD(model.parameters(), lr=0.01) input = torch.randn(1, 10) output = model(input) loss = output.sum() loss.backward()# 裁剪梯度,最大范数为 1.0 clip_grad_norm_(model.parameters(), max_norm=1.0) optimizer.step()
-
torch.nn.utils.clip_grad_value_
:- 裁剪模型参数的梯度值,将其限制在某个范围内。
- 示例:
from torch.nn.utils import clip_grad_value_clip_grad_value_(model.parameters(), clip_value=0.1) optimizer.step()
2.2 模型序列化
torch.nn.utils.saved_tensors_hooks
:- 用于管理和优化保存的中间张量,减少内存占用。
2.3 模块管理
-
torch.nn.utils.rnn.PackedSequence
:- 用于处理可变长度序列数据,常用于 RNN/LSTM/GRU 等模型。
- 示例:
from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence# 假设 input_seq 是变长序列,lengths 是每个序列的长度 packed_input = pack_padded_sequence(input_seq, lengths, batch_first=True) output, _ = rnn(packed_input) output, _ = pad_packed_sequence(output, batch_first=True)
-
torch.nn.utils.prune
:- 用于模型剪枝(Model Pruning),减少模型参数,提升推理效率。
- 示例:
import torch.nn.utils.prune as prunemodel = nn.Linear(10, 1) prune.l1_unstructured(model, name='weight', amount=0.3) # 剪枝 30% 的权重
2.4 量化支持
torch.nn.utils.convert_parameters
:- 用于将模型的参数从浮点数转换为量化版本。
2.5 通用工具
-
torch.nn.utils.parameters_to_vector
和torch.nn.utils.vector_to_parameters
:- 将模型的参数展开为一维向量,或从一维向量恢复为模型参数。
- 示例:
from torch.nn.utils import parameters_to_vector, vector_to_parametersparams_vector = parameters_to_vector(model.parameters()) print(params_vector.shape)# 从向量恢复参数 vector_to_parameters(params_vector, model.parameters())
-
torch.nn.utils.weight_norm
:- 为模型的权重添加归一化(Weight Normalization),加速收敛。
- 示例:
from torch.nn.utils import weight_normmodel = nn.Linear(10, 1) model = weight_norm(model, name='weight')
3. torch.nn.utils
的适用场景
torch.nn.utils
适用于以下场景:
- 梯度裁剪:
- 防止梯度爆炸,提升训练的稳定性。
- 模型剪枝:
- 减少模型参数,提升推理效率。
- 序列数据处理:
- 处理可变长度序列数据,常用于 RNN/LSTM/GRU。
- 模型参数管理:
- 将模型参数展开或恢复,便于存储和传输。
- 量化模型:
- 为量化模型提供辅助工具。
4. 总结
torch.nn.utils
是 PyTorch
提供的一个实用工具模块,涵盖了深度学习中的多种实用功能,包括梯度处理、模型序列化、模块管理、量化支持等。通过使用 torch.nn.utils
,开发者可以更高效地实现复杂的深度学习任务,例如:
- 防止梯度爆炸(
clip_grad_norm_
)。 - 处理可变长度序列数据(
PackedSequence
)。 - 对模型进行剪枝(
prune
)。 - 管理模型参数(
parameters_to_vector
)。
这些工具极大地简化了深度学习模型的开发、训练和推理流程,提升了开发效率。
相关文章:
机器学习09-Pytorch功能拆解
机器学习09-Pytorch功能拆解 我个人是Java程序员,关于Python代码的使用过程中的相关代码事项,在此进行记录 文章目录 机器学习09-Pytorch功能拆解1-核心逻辑脉络2-个人备注3-Pytorch软件包拆解1-Python有参和无参构造构造方法的基本语法示例解释注意事项…...
Qt之QDjango-db的简单使用
QDjango是一款由C编写、依托于Qt库的Web开发框架,其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集,帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango&…...
滑动窗口最大值(力扣239)
刚拿到这道题,我们第一反应就是遍历每一个滑动窗口,然后在滑动窗口中遍历找到该窗口的最大值,但是这样的时间复杂度为O(k*n).有没有更简单的方法呢?答案是使用队列。更准确的说是双向队列。下面我将详细讲解一下如何使用双向队列解决这道问题…...
HTTP / 2
序言 在之前的文章中我们介绍过了 HTTP/1.1 协议,现在再来认识一下迭代版本 2。了解比起 1.1 版本,后面的版本改进在哪里,特点在哪里?话不多说,开始吧⭐️! 一、 HTTP / 1.1 存在的问题 很多时候新的版本的…...
Python 脚本-显示给定文件的文件信息
目录 Python 代码实现 Python 代码解释 1.导入必要的模块: 2.函数 get_file_info: 3.函数 print_file_info: 4.主函数 main: 5.程序入口: 使用方法 Python 代码实现 import os import stat import sys import…...
C# 通用缓存类开发:开启高效编程之门
引言 嘿,各位 C# 开发者们!在当今快节奏的软件开发领域,提升应用程序的性能就如同给跑车装上涡轮增压,能让你的项目在激烈的竞争中脱颖而出。而构建一个高效的 C# 通用缓存类,无疑是实现这一目标的强大武器。 想象一…...
Mac安装Homebrew
目录 安装修改homeBrew源常用命令安装卸载软件升级软件相关清理相关 安装 官网 https://brew.sh/不推荐官网安装方式(很慢很慢或者安装失败联网失败) 检测是否安装homebrewbrew -v执行安装命令 苹果电脑 常规安装脚本 (推荐 完全体 几分钟就…...
MySQL面试题2025 每日20道【其四】
1、你们生产环境的 MySQL 中使用了什么事务隔离级别?为什么? 中等 在生产环境中,MySQL数据库的事务隔离级别通常由开发团队或数据库管理员根据应用的需求来设定。MySQL支持四种标准的事务隔离级别: 读未提交(Read Unc…...
maven 微服务项目多 包版本问题
mvn dependency:tree查看jar包直接的关系 找到重复的包!!!! 可以查看包版本问题 [INFO] | - org.jpedal:OpenViewerFX:jar:6.6.14:compile [INFO] | | - org.eclipse.birt.runtime.3_7_1:org.mozilla.javascript:jar:1.7.2:compile [INFO] | | - bouncycastle:bcprov-j…...
skipcrossnets模型详解及代码复现
模型背景 在SkipcrossNets模型提出之前,多模态融合在自动驾驶领域已取得显著进展。然而,传统的两流网络仅在特定层进行融合,需要大量人工尝试来设置,并且随着网络深度增加,模态特征差异增大,容易影响性能。 为解决这些问题,研究人员开发了SkipcrossNets模型,旨在提供…...
【0397】Postgres内核 checkpoint process ⑦ 获取 delaying checkpoint VXIDs(delayChkpt)
1. Top-level transactions 顶级事务(Top-level transactions)通过由 PGPROC 字段 backendId 和 lxid 组成的 VirtualTransactionIDs 来标识。对于已准备的事务,LocalTransactionId 是一个普通的 XID。这些在短期内保证唯一,但在数据库重启或 XID 滚转后会被重新使用;因此…...
Go语言-学习一
简介:Go语言经过多年的快速发展,已经被光广泛应用到各个领域,成为当前最热的计算机语言之一。Go自带许多高级特性及常用工具,使Go一出世就以高并发和高性能为程序员所追捧。 go语言特点 1、静态类型、编译型、开源 2、脚本化&…...
学习记录-统计记录场景下的Redis写请求合并优化实践
学习记录-使用Redis合并写请求来优化性能 1.业务背景 学习进度的统计功能:为了更精确的记录用户上一次播放的进度,采用的方案是:前端每隔15秒就发起一次请求,将播放记录写入数据库。但问题是,提交播放记录的业务太复杂了&#x…...
Java中json的一点理解
一、Java中json字符串与json对象 1、json本质 json是一种数据交换格式。 常说的json格式的字符串 > 发送和接收时都只是一个字符串,它遵循json这种格式。 2、前后端交互传输的json是什么? 前后端交互传输的json都是json字符串 比如:…...
用于牙科的多任务视频增强
Multi-task Video Enhancement for Dental Interventions 2022 miccai Abstract 微型照相机牢牢地固定在牙科手机上,这样牙医就可以持续地监测保守牙科手术的进展情况。但视频辅助牙科干预中的视频增强减轻了低光、噪音、模糊和相机握手等降低视觉舒适度的问题。…...
二、vue智能Ai对话(高仿通义千问)流式进阶版
1、安装依赖、启动 // 安装依赖 npm install // 启动服务 node server.js 2、浏览器运行html 3、流式进阶版视频地址:流式进阶版视频 4、各位如有需要,请下载源码包。...
Python新春烟花
目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…...
《自动驾驶与机器人中的SLAM技术》ch4:基于预积分和图优化的 GINS
前言:预积分图优化的结构 1 预积分的图优化顶点 这里使用 《自动驾驶与机器人中的SLAM技术》ch4:预积分学 中提到的散装的形式来实现预积分的顶点部分,所以每个状态被分为位姿()、速度、陀螺零偏、加计零偏四种顶点&am…...
「2024·我的成长之路」:年终反思与展望
文章目录 1. 前言2.创作历程2.1 摆烂期2.2 转变期3. 上升期 2. 个人收获3.经验分享4. 展望未来 1. 前言 2025年1月16日,2024年博客之星入围公布,很荣幸获得了这次入围的机会。2024年对我个人是里程碑的一年,是意义非凡的一年,是充…...
P8738 [蓝桥杯 2020 国 C] 天干地支
两种方法 #include<bits/stdc.h> using namespace std;int main(){int year;cin>>year;string tg[10] {"geng", "xin", "ren", "gui","jia", "yi", "bing", "ding", "wu&…...
Linux网络 TCP socket
TCP简介 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它位于OSI模型的第四层,主要为应用层提供数据传输服务。TCP通过三次握手建立连接,确保数据在发送和接收过程中的准确性和顺序…...
IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载
IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载 在 IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载,可以让你在不重启应用的情况下看到代码修改的效果。以下是详细的配置步骤: 添加 spring-boot-devtools 依赖 在 pom.xml 文件中添加 …...
【网络协议】【http】【https】RSA+AES-TLS1.2
【网络协议】【http】【https】RSAAES-TLS1.2 https并不是一个协议 而是在传输层之间添加了SSL/TLS协议 TLS 协议用于应用层协议(如 HTTP)和传输层(如 TCP)之间,增加了一层安全性来解决 HTTP 存在的问题,H…...
Java中如何安全地停止线程?
大家好,我是锋哥。今天分享关于【Java中如何安全地停止线程?】面试题。希望对大家有帮助; Java中如何安全地停止线程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Java中,安全地停止线程是一项重要的任务,尤其…...
01.04、回文排序
01.04、[简单] 回文排序 1、题目描述 给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。 2、解题思路 回文串的特点: 一个回文串在…...
[深度学习]多层神经网络
多层神经网络 文章目录 多层神经网络单个神经元人类大脑神经与神经元神经元与矩阵神经元的串联激活函数激活函数位置神经网络的三种表现形式神经网络的参数(可训练的) 深度学习的训练过程全连接网络过拟合和欠拟合 单个神经元 一个神经元实际表示的数据公…...
JavaScript语言的正则表达式
JavaScript语言的正则表达式详解 正则表达式(Regular Expression,简称Regex或RegExp)是一种强大的文本处理工具,可以在字符串中执行模式匹配和替换操作。在JavaScript中,正则表达式是处理字符串时不可或缺的部分&…...
yolo系列模型为什么坚持使用CNN网络?
在深度学习领域,目标检测是一项至关重要的任务,而YOLO(You Only Look Once)系列模型无疑是这一领域的佼佼者。YOLO以其高效、准确的特点,在实时目标检测任务中占据了重要地位。然而,随着Transformer模型在自…...
Kotlin语言的数据结构
Kotlin语言的数据结构导论 Kotlin是一种现代化的编程语言,具有简洁、安全和高效的特点。Kotlin不仅支持面向对象编程,还融入了函数式编程的概念,使得开发者能够以更优雅的方式处理数据。在构建复杂应用时,数据结构的选择及其实现…...
光纤接口、GTX高速收发器基础知识学习、光口眼图测试--FPGA学习笔记28
----素材来源原子哥 一、光纤接口简介 光纤接口是用来连接光纤线缆的物理接口,简称为光口。其原理是利用了光从光密介质进入光疏介质从而发生了全反射。通常有 FC、 SC、 ST、 LC、 D4、 DIN、 MU、 MT 等等各种形式接口。 (1) SC 型光纤接…...
【k8s】k8s部署Argo CD
1、创建 Argo CD 命名空间: 先创建一个专用的命名空间 argocd 用于部署 Argo CD。 kubectl create namespace argocd 2、安装 Argo CD: 使用 kubectl 从 Argo CD 官方 GitHub 仓库安装它。运行以下命令来安装所有的 Argo CD 组件: kubectl a…...
PHP礼品兑换系统小程序
🎁 礼品兑换系统:革新企业礼品管理,专属神器来袭! 💻 一款专为追求高效与个性化的现代企业量身打造的礼品兑换系统,它基于强大的ThinkPHP框架与前沿的Uniapp技术栈深度融合,不仅完美适配礼品卡…...
【SSH端口转发:实现安全的远程端口映射】
SSH端口转发:实现安全的远程端口映射 在网络应用开发和运维过程中,我们经常需要进行端口转发来实现各种网络访问需求。今天我要分享一个使用SSH进行端口转发的实用脚本,并详细讲解其工作原理。 脚本内容 免密 ssh-copy-id -p 20080 rootxx…...
2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数
快速分解质因数 完整题目和在线测评可点击下方链接前往: 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找,题…...
为什么你的 Qt 应用程序会出现 xcb 插件错误
有朋友咨询为什么他们的 Qt 应用程序在统信 UOS ARM 版本下运行,提示如下错误: qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "" This application failed to start because no Qt platform plugin could be i…...
ANSYS HFSS 中的相控天线阵列仿真方法
概述 相控天线阵列系统广泛使用,从国防雷达应用到商业 5G 应用。设计这些天线阵列涉及复杂的数学运算,需要全波仿真。Ansys HFSS 全场 3D 电磁仿真软件可以在合理的时间内以较低的计算成本仿真复杂的相控阵天线系统,同时考虑复杂激励、环境&…...
【记录】Jenkins版本及JDK关系介绍的官网地址
Redhat Jenkins Packages...
66,【6】buuctf web [HarekazeCTF2019]Avatar Uploader 1
进入靶场 习惯性输入admin 还想用桌面上的123.png 发现不行 看看给的源码 <?php // 关闭错误报告,可能会隐藏一些错误信息,在开发阶段可考虑开启(例如 error_reporting(E_ALL)) error_reporting(0); // 引入配置文件&#x…...
MECD+: 视频推理中事件级因果图推理--VLM长视频因果推理
论文链接:https://arxiv.org/pdf/2501.07227v1 1. 摘要及主要贡献点 摘要: 视频因果推理旨在从因果角度对视频内容进行高层次的理解。然而,目前的研究存在局限性,主要表现为以问答范式执行,关注包含孤立事件和基本因…...
pycharm+pyside6+desinger实现查询汉字笔顺GIF动图
一、引言 这学期儿子语文期末考试有一道这样的题目: 这道题答案是B,儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的,因为二者有一个笔画是不一样的,“车字旁”下边那笔是“提”,而“车”字是“横”&am…...
拟合算法 (matlab工具箱)
拟合算法: 1线性最小二乘法拟合 使用matlab进行求解 拟合优度:R^2 拟合优度的matlab代码: 2,Matlab工具箱的教学 一些函数: 拟合算法: 插值算法中,得到的多项式f(x)要经过所有样本点。但是如果样本点太多&#…...
联想电脑怎么用u盘装系统_联想电脑用u盘装win10系统教程
联想电脑怎么重装系统?在当今科技发展迅猛的时代,联想电脑已经成为了人们生活中不可或缺的一部分。然而,随着时间的推移,我们可能会遇到一些问题,例如系统崩溃或者需要更换操作系统。这时,使用U盘来重新安装…...
WPF2-在xaml为对象的属性赋值
1. AttributeValue方式 1.1. 简单属性赋值1.2. 对象属性赋值 2. 属性标签的方式给属性赋值3. 标签扩展 (Markup Extensions) 3.1. StaticResource3.2. Binding 3.2.1. 普通 Binding3.2.2. ElementName Binding3.2.3. RelativeSource Binding3.2.4. StaticResource Binding (带参…...
什么是报文的大端和小端,有没有什么记忆口诀?
在计算机科学中,**大端(Big-Endian)和小端(Little-Endian)**是两种不同的字节序(即多字节数据在内存中的存储顺序)。理解这两种字节序对于网络通信、文件格式解析以及跨平台编程等非常重要。 1…...
【2024 博客之星评选】请继续保持Passion
我尝试复盘自己2024年走的路,希望能给诸君一些借鉴。 文章目录 回头望感想与收获成长与教训今年计划感恩一些体己话 回头望 回望我的2024年,年初拿高绩效,但感觉逐渐被公司一点点剥离出中心;年中一直在学习防患于未然;…...
网络通信---MCU移植LWIP
使用的MCU型号为STM32F429IGT6,PHY为LAN7820A 目标是通过MCU的ETH给LWIP提供输入输出从而实现基本的Ping应答 OK废话不多说我们直接开始 下载源码 LWIP包源码:lwip源码 -在这里下载 ST官方支持的ETH包:ST-ETH支持包 这里下载 创建工程 …...
Redis源码-redisObject
解释 redis中,所有的数据类型最终都转换成了redisObject,该结构体的定义,在文件server.h中。 参数说明 参数名说明unsigned type:4对象对应的数据类型unsigned encoding:4对象的编码方式unsigned lru:LRU_BITSLRU算法清空对象,…...
YOLOv10-1.1部分代码阅读笔记-tuner.py
tuner.py ultralytics\engine\tuner.py 目录 tuner.py 1.所需的库和模块 2.class Tuner: 1.所需的库和模块 # Ultralytics YOLO 🚀, AGPL-3.0 license# 此模块提供用于对象检测、实例分割、图像分类、姿势估计和多对象跟踪的 Ultralytics YOLO 模型的超参数调…...
【数据结构】二分查找
🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…...
iOS-支付相关
支付宝支付 #import <AlipaySDK/AlipaySDK.h> //orderStrAliPay为服务端传的订单信息 //fromScheme为应用配置的schemeUrl标识,用户支付包支付成功后跳转会本应用内 //callback回调需要在- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url 中调…...