网站模板 源码之家,当下网站建设,网站建设现状  数据,html制作个人网页案例目录 
引言 
torch.nn使用和详解 
Parameter 
函数作用 
使用技巧 
使用方法和示例 
UninitializedParameter 
特点和用途 
可进行的操作 
使用示例 
UninitializedBuffer 
特点和用途 
可进行的操作 
使用示例 
Module**#xff08;重点#xff09; 
关键特性和功能 
举例说…目录 
引言 
torch.nn使用和详解 
Parameter 
函数作用 
使用技巧 
使用方法和示例 
UninitializedParameter 
特点和用途 
可进行的操作 
使用示例 
UninitializedBuffer 
特点和用途 
可进行的操作 
使用示例 
Module**重点 
关键特性和功能 
举例说明 
torch.nn.Module 主要方法详解 
add_module(name, module) 
apply(fn) 
bfloat16() 
buffers(recurseTrue) 
children() 
cpu() 
cuda(deviceNone) 
double() 
eval() 
extra_repr() 
float() 
forward(*input) 
get_buffer(target) 
get_parameter(target) 
half() 
load_state_dict(state_dict, strictTrue, assignFalse) 
modules() 
named_buffers(prefix, recurseTrue, remove_duplicateTrue) 
named_children() 
named_modules(memoNone, prefix, remove_duplicateTrue) 
named_parameters(prefix, recurseTrue, remove_duplicateTrue) 
parameters(recurseTrue) 
register_backward_hook(hook) 
register_buffer(name, tensor, persistentTrue) 
register_forward_hook(hook) 
register_forward_pre_hook(hook) 
register_full_backward_hook(hook) 
register_parameter(name, param) 
state_dict() 
to(*args, **kwargs) 
train(modeTrue) 
type(dst_type) 
zero_grad(set_to_noneTrue) 
Sequential 
主要特性 
与 torch.nn.ModuleList 的区别 
使用示例 
append(module) 方法 
ModuleList 
主要特性 
使用示例 
ModuleList 的方法 
ModuleDict 
主要特性 
使用示例 
ModuleDict 的方法 
ParameterList 
主要特性 
使用示例 
ParameterList 的方法 
ParameterDict 
主要特性 
使用示例 
ParameterDict 的方法 
总结 引言 在当今快速发展的人工智能领域深度学习已成为其中最引人注目的技术之一。PyTorch 作为一种流行的深度学习框架因其灵活性和易用性而受到广泛欢迎。在 PyTorch 的众多组件中torch.nn 模块无疑是构建复杂深度学习模型的基石。本文将深入探讨 torch.nn 模块的功能、优势和使用技巧旨在为读者提供一个清晰的理解和应用指南。torch.nn 提供了构建神经网络所需的所有基本构建块包括各种类型的层如卷积层、池化层、激活函数、损失函数和容器。这些组件不仅是模块化和可重用的而且也支持灵活的网络架构设计。通过本文我们将逐一解析这些组件的特性和使用场景并分享一些实用的技巧来优化网络性能。无论是新手还是有经验的开发者都可以从中获得宝贵的见解以更好地利用这个强大的模块来设计和实现高效的深度学习模型。 接下来的章节将从 torch.nn 的基础知识开始逐步深入到更高级的主题包括定制网络层、优化技巧和最佳实践。准备好让我们开始这次深入浅出的 torch.nn 之旅吧 
torch.nn使用和详解 
Parameter torch.nn.parameter.Parameter 是 PyTorch 深度学习框架中的一个重要类用于表示神经网络中的参数。这个类是 Tensor 的子类它在与 Module模块一起使用时具有特殊属性。当 Parameter 被赋值为 Module 的属性时它自动被添加到模块的参数列表中并且会出现在例如 parameters() 迭代器中。这与普通的 Tensor 不同因为 Tensor 赋值给模块时不会有这样的效果。 
函数作用 
目的: Parameter 主要用于将张量标记为模块的参数。这对于模型的训练和参数更新至关重要因为只有被标记为 Parameter 的张量才会在模型训练时更新。使用场景: 在构建自定义神经网络层或整个模型时需要用到 Parameter 来定义可训练的参数如权重和偏置。这些参数在训练过程中会通过反向传播进行优化。 
使用技巧 
参数初始化: 在定义模型的参数时可以直接使用 Parameter 类对其进行初始化从而确保这些参数会被识别并在训练过程中更新。控制梯度: 通过设置 requires_grad 参数可以控制特定参数是否需要在反向传播中计算梯度。这对于冻结模型的部分参数或进行特定的优化策略非常有用。 
使用方法和示例 
以下是 torch.nn.parameter.Parameter 的使用示例 
import torch
import torch.nn as nn# 定义一个自定义的线性层
class CustomLinearLayer(nn.Module):def __init__(self, in_features, out_features):super(CustomLinearLayer, self).__init__()# 定义权重为一个可训练的参数self.weight  nn.Parameter(torch.randn(out_features, in_features))# 定义偏置为一个可训练的参数self.bias  nn.Parameter(torch.randn(out_features))def forward(self, x):# 实现前向传播return torch.matmul(x, self.weight.t())  self.bias# 创建一个自定义的线性层实例
layer  CustomLinearLayer(5, 3)
print(list(layer.parameters()))在上述代码中CustomLinearLayer 类中定义了两个 Parameter 对象weight 和 bias。这些参数在模块被实例化时自动注册并在训练过程中会被优化。通过打印 layer.parameters()可以看到这些被注册的参数。 
UninitializedParameter 
torch.nn.parameter.UninitializedParameter 是 PyTorch 中的一个特殊类用于表示尚未初始化的参数。这个类是 torch.nn.Parameter 的一个特殊情况其主要特点是在创建时数据的形状shape还未知。 
特点和用途 
尚未初始化: 与常规的 torch.nn.Parameter 不同UninitializedParameter 不持有任何数据。这意味着在初始化之前试图访问某些属性如它们的形状会引发运行时错误。灵活的初始化: UninitializedParameter 允许在模型定义阶段创建参数而不必立即指定它们的大小或形状。这在某些情况下非常有用例如当参数的大小依赖于运行时才可知的因素时。 
可进行的操作 
更改数据类型: 可以更改 UninitializedParameter 的数据类型。移动到不同设备: 可以将 UninitializedParameter 移动到不同的设备例如从 CPU 移到 GPU。转换为常规参数: 可以将 UninitializedParameter 转换为常规的 torch.nn.Parameter此时需要指定其形状和数据。 
使用示例 
在下面的示例中将展示如何创建一个未初始化的参数并在稍后将其转换为常规参数 
import torch
import torch.nn as nnclass CustomLayer(nn.Module):def __init__(self):super(CustomLayer, self).__init__()# 创建一个未初始化的参数self.uninitialized_param  nn.parameter.UninitializedParameter()def forward(self, x):# 在前向传播中使用参数前必须先初始化if isinstance(self.uninitialized_param, nn.parameter.UninitializedParameter):# 初始化参数self.uninitialized_param  nn.Parameter(torch.randn(x.size(1), x.size(1)))return torch.matmul(x, self.uninitialized_param.t())# 创建自定义层的实例
layer  CustomLayer()# 假设输入x
x  torch.randn(10, 5)# 使用自定义层
output  layer(x)
print(output)在这个例子中CustomLayer 在初始化时创建了一个 UninitializedParameter。在进行前向传播时检查这个参数是否已初始化如果没有则对其进行初始化并将其转换为常规的 Parameter。这种方式在处理动态大小的输入时特别有用。 
UninitializedBuffer torch.nn.parameter.UninitializedBuffer 是 PyTorch 中的一个特殊类它代表一个尚未初始化的缓冲区。这个类是 torch.Tensor 的一个特殊情形其主要特点是在创建时数据的形状shape还未知。 
特点和用途 
尚未初始化: 与常规的 torch.Tensor 不同UninitializedBuffer 不持有任何数据。这意味着在初始化之前尝试访问某些属性如它们的形状会引发运行时错误。适用场景: UninitializedBuffer 适用于那些在模型定义阶段需要创建缓冲区但其大小或形状取决于后来才可知的数据或配置的情况。 
可进行的操作 
更改数据类型: 可以更改 UninitializedBuffer 的数据类型。移动到不同设备: 可以将 UninitializedBuffer 移动到不同的设备例如从 CPU 移到 GPU。转换为常规张量: 可以将 UninitializedBuffer 转换为常规的 torch.Tensor此时需要指定其形状和数据。 
使用示例 
在下面的示例中将展示如何创建一个未初始化的缓冲区并在稍后将其转换为常规张量 
import torch
import torch.nn as nnclass CustomLayer(nn.Module):def __init__(self):super(CustomLayer, self).__init__()# 创建一个未初始化的缓冲区self.uninitialized_buffer  nn.parameter.UninitializedBuffer()def forward(self, x):# 在前向传播中使用缓冲区前必须先初始化if isinstance(self.uninitialized_buffer, nn.parameter.UninitializedBuffer):# 初始化缓冲区self.uninitialized_buffer  torch.Tensor(x.size(0), x.size(1))# 在这里可以使用缓冲区进行计算或其他操作return x  self.uninitialized_buffer# 创建自定义层的实例
layer  CustomLayer()# 假设输入x
x  torch.randn(10, 5)# 使用自定义层
output  layer(x)
print(output)在这个例子中CustomLayer 在初始化时创建了一个 UninitializedBuffer。在进行前向传播时检查这个缓冲区是否已初始化如果没有则对其进行初始化并将其转换为常规的 Tensor。这种方法在动态处理数据大小时非常有用特别是在需要临时存储数据但在模型定义阶段无法确定其大小的情况下。   
Module**重点 torch.nn.Module 是 PyTorch 中用于构建所有神经网络模型的基类。几乎所有的 PyTorch 神经网络模型都是通过继承 torch.nn.Module 来构建的。这个类提供了模型需要的基本功能如参数管理、模型保存和加载、设备转移例如从 CPU 到 GPU等。 
关键特性和功能 
模块树结构: Module 可以包含其他 Module形成一个嵌套的树状结构。这允许用户以模块化的方式构建复杂的神经网络。参数和缓冲区的管理: Module 自动管理其属性中的所有 Parameter 和 Buffer 对象。这包括注册参数、转移到不同设备、保存和加载模型状态等。前向传播定义: 所有子类都应该覆盖 forward 方法以定义其在接收输入时的计算过程。 
举例说明 
以下是一个基本的 torch.nn.Module 子类的示例 
import torch.nn as nn
import torch.nn.functional as Fclass SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.conv1  nn.Conv2d(1, 20, 5)self.conv2  nn.Conv2d(20, 20, 5)def forward(self, x):x  F.relu(self.conv1(x))return F.relu(self.conv2(x))model  SimpleModel()在这个例子中SimpleModel 继承了 torch.nn.Module。在其构造函数中定义了两个卷积层 conv1 和 conv2并在 forward 方法中定义了模型的前向传播逻辑。 
torch.nn.Module 主要方法详解 
add_module(name, module) 
功能向当前模块添加子模块。参数 name: 子模块的名称。module: 要添加的子模块对象。 
# 定义一个自定义模块
class CustomModule(nn.Module):def __init__(self):super(CustomModule, self).__init__()# 创建一个线性层linear  nn.Linear(10, 5)# 使用 add_module 添加线性层作为子模块self.add_module(linear, linear)apply(fn) 
功能递归地将函数 fn 应用于每个子模块及其自身。参数 fn: 要应用的函数通常用于初始化参数。 
# 定义一个初始化权重的函数
def init_weights(m):if type(m)  nn.Linear:nn.init.uniform_(m.weight)# 应用 init_weights 函数初始化模型的权重
model  CustomModule()
model.apply(init_weights)bfloat16() 
功能将所有浮点参数和缓冲区转换为 bfloat16 数据类型。注意此方法就地修改模块。 
# 将模型的参数和缓冲区转换为 bfloat16 数据类型
model.bfloat16()buffers(recurseTrue) 
功能返回一个迭代器遍历模块的所有缓冲区。参数 recurse: 如果为 True则遍历此模块及所有子模块的缓冲区。 
# 遍历模型的所有缓冲区
for buf in model.buffers():print(buf.size())children() 
功能返回一个迭代器遍历模块的直接子模块。 
# 遍历模型的直接子模块
for child in model.children():print(child)cpu() 
功能将所有模型参数和缓冲区移动到 CPU。 
# 将模型移动到 CPU
model.cpu()cuda(deviceNone) 
功能将所有模型参数和缓冲区移动到 GPU。参数 device: 指定 GPU 设备。 
# 将模型移动到 GPU
model.cuda()double() 
功能将所有浮点参数和缓冲区转换为 double 数据类型。 
# 将模型的参数和缓冲区转换为 double 数据类型
model.double()eval() 
功能将模块设置为评估模式。 
# 将模型设置为评估模式
model.eval()extra_repr() 
功能设置模块的额外表示用于自定义信息打印。 
# 自定义模型的额外表示
class CustomModule(nn.Module):def __init__(self):super(CustomModule, self).__init__()def extra_repr(self):return 自定义信息model  CustomModule()
print(model)float() 
功能将所有浮点参数和缓冲区转换为 float 数据类型。 
# 将模型的参数和缓冲区转换为 float 数据类型
model.float()forward(*input) 
功能定义每次调用时的计算所有子类必须覆盖此方法。 
# 定义模型的前向传播
class CustomModule(nn.Module):def __init__(self):super(CustomModule, self).__init__()self.linear  nn.Linear(10, 5)def forward(self, x):return self.linear(x)model  CustomModule()
input  torch.randn(1, 10)
output  model(input)get_buffer(target) 
功能根据目标名称返回对应的缓冲区。 
# 获取特定名称的缓冲区
buffer  model.get_buffer(buffer_name)get_parameter(target) 
功能根据目标名称返回对应的参数。 
# 获取特定名称的参数
parameter  model.get_parameter(param_name)half() 
功能将所有浮点参数和缓冲区转换为半精度 (half) 数据类型。 
# 将模型的参数和缓冲区转换为半精度 (half) 数据类型
model.half()load_state_dict(state_dict, strictTrue, assignFalse) 
功能从 state_dict 中复制参数和缓冲区到此模块及其后代。参数 state_dict: 包含参数和持久缓冲区的字典。strict: 是否严格匹配 state_dict 和模块的键。 
# 从 state_dict 加载模型状态
state_dict  {linear.weight: torch.randn(5, 10), linear.bias: torch.randn(5)}
model.load_state_dict(state_dict, strictFalse)modules() 
功能返回一个迭代器遍历网络中的所有模块。 
# 遍历网络中的所有模块
for module in model.modules():print(module)named_buffers(prefix, recurseTrue, remove_duplicateTrue) 
功能返回一个迭代器遍历模块的所有缓冲区同时提供缓冲区的名称。 
# 遍历模型的所有缓冲区同时提供缓冲区的名称
for name, buf in model.named_buffers():print(fBuffer name: {name}, Buffer: {buf})named_children() 
功能返回一个迭代器遍历模块的直接子模块同时提供子模块的名称。 
# 遍历模型的直接子模块同时提供子模块的名称
for name, child in model.named_children():print(fChild name: {name}, Child module: {child})named_modules(memoNone, prefix, remove_duplicateTrue) 
功能返回一个迭代器遍历网络中的所有模块同时提供模块的名称。 
# 遍历网络中的所有模块同时提供模块的名称
for name, module in model.named_modules():print(fModule name: {name}, Module: {module})named_parameters(prefix, recurseTrue, remove_duplicateTrue) 
功能返回一个迭代器遍历模块的所有参数同时提供参数的名称。 
# 遍历模型的所有参数同时提供参数的名称
for name, param in model.named_parameters():print(fParameter name: {name}, Parameter: {param})parameters(recurseTrue) 
功能返回一个迭代器遍历模块的所有参数。 
# 遍历模型的所有参数
for param in model.parameters():print(param)register_backward_hook(hook) 
功能注册一个反向传播钩子。 
# 注册一个反向传播钩子
def backward_hook(module, grad_input, grad_output):print(fBackward hook in {module})model.register_backward_hook(backward_hook)register_buffer(name, tensor, persistentTrue) 
功能向模块添加一个缓冲区。 
# 向模块添加一个缓冲区
model.register_buffer(new_buffer, torch.randn(5))register_forward_hook(hook) 
功能注册一个前向传播钩子。 
# 注册一个前向传播钩子
def forward_hook(module, input, output):print(fForward hook in {module})model.register_forward_hook(forward_hook)register_forward_pre_hook(hook) 
功能注册一个前向传播预处理钩子。 
# 注册一个前向传播钩子
def forward_hook(module, input, output):print(fForward hook in {module})model.register_forward_hook(forward_hook)register_full_backward_hook(hook) 
功能注册一个完整的反向传播钩子。 
# 注册一个完整的反向传播钩子
def full_backward_hook(module, grad_input, grad_output):print(fFull backward hook in {module})model.register_full_backward_hook(full_backward_hook)register_parameter(name, param) 
功能向模块添加一个参数。 
# 向模块添加一个参数
param  nn.Parameter(torch.randn(5))
model.register_parameter(new_param, param)state_dict() 
功能返回包含模块所有状态信息的字典。 
# 获取模块所有状态信息的字典
state_dict  model.state_dict()to(*args, **kwargs) 
功能移动和/或转换参数和缓冲区。 
# 移动和/或转换参数和缓冲区
# 移动模型到 GPU 并转换为 double 类型
model.to(cuda, dtypetorch.double)train(modeTrue) 
功能将模块设置为训练模式。 
# 将模块设置为训练模式
model.train()type(dst_type) 
功能将所有参数和缓冲区转换为指定类型。 
# 将所有参数和缓冲区转换为指定类型
model.type(torch.float32)zero_grad(set_to_noneTrue) 
功能重置所有模型参数的梯度。 
# 重置所有模型参数的梯度
model.zero_grad()这些示例涵盖了 torch.nn.Module 类中的大多数主要方法展示了如何在实际情况中使用它们。 
Sequential torch.nn.Sequential 是 PyTorch 中的一个容器模块用于按顺序封装一系列子模块。它简化了模型的构建过程使得将多个模块组合成一个单独的序列变得容易和直观。 
主要特性 
顺序处理: Sequential 按照它们在构造函数中传递的顺序依次处理每个子模块。输入数据首先被传递到第一个模块然后依次传递到每个后续模块。容器作为单一模块: Sequential 允许将整个容器视为单一模块对其进行的任何转换都适用于它存储的每个模块每个模块都是 Sequential 的一个注册子模块。 
与 torch.nn.ModuleList 的区别 
torch.nn.ModuleList 仅仅是一个存储子模块的列表而 Sequential 中的层是级联连接的。在 ModuleList 中层之间没有直接的数据流动关联而在 Sequential 中一个层的输出直接成为下一个层的输入。 
使用示例 使用 Sequential 创建一个简单的模型  
model  nn.Sequential(nn.Conv2d(1, 20, 5),nn.ReLU(),nn.Conv2d(20, 64, 5),nn.ReLU())在这个例子中输入数据首先通过一个 Conv2d 层然后是 ReLU 层接着是第二个 Conv2d 层最后是另一个 ReLU 层。 
使用带有 OrderedDict 的 Sequential 
from collections import OrderedDictmodel  nn.Sequential(OrderedDict([(conv1, nn.Conv2d(1, 20, 5)),(relu1, nn.ReLU()),(conv2, nn.Conv2d(20, 64, 5)),(relu2, nn.ReLU())]))使用 OrderedDict 允许为每个模块指定一个唯一的名称。这在需要引用特定层或在打印模型结构时提高了可读性。 
append(module) 方法 
功能: 将给定的模块添加到序列的末尾。参数: module (nn.Module): 要附加的模块。返回类型: Sequential 
这种方式构建的模型可以简化前向传播的实现使得模型的构建和理解更加直观。 
ModuleList 
torch.nn.ModuleList 是 PyTorch 中用于存储子模块的列表容器。它类似于 Python 的常规列表但具有额外的功能使其能够适当地注册其中包含的模块并使它们对所有 Module 方法可见。 
主要特性 
列表式结构: ModuleList 提供了一个列表式的结构来保存模块允许通过索引或迭代器访问这些模块。模块注册: 它包含的模块会被正确注册这意味着当调用诸如 .parameters() 或 .to(device) 等 Module 方法时这些子模块也会被考虑在内。 
使用示例 
class MyModule(nn.Module):def __init__(self):super().__init__()# 使用 ModuleList 创建一个线性层的列表self.linears  nn.ModuleList([nn.Linear(10, 10) for i in range(10)])def forward(self, x):# ModuleList 可以作为迭代器也可以使用索引访问for i, l in enumerate(self.linears):x  self.linears[i // 2](x)  l(x)return x在这个例子中MyModule 创建了一个 ModuleList其中包含了 10 个 nn.Linear(10, 10) 层。在 forward 方法中使用了两种不同的方式来访问和应用这些层。 
ModuleList 的方法 append(module) 功能在列表末尾添加一个给定的模块。参数 module (nn.Module)要添加的模块。 extend(modules) 功能将来自 Python 可迭代对象的模块添加到列表的末尾。参数 modules (iterable)可迭代的模块对象。 insert(index, module) 功能在列表中给定索引之前插入一个模块。参数 index (int)插入的索引。module (nn.Module)要插入的模块。 
ModuleList 提供了灵活的方式来管理子模块的集合特别是当模型的某些部分是动态的或者模型结构中的层的数量在初始化时未知时非常有用。 
ModuleDict 
torch.nn.ModuleDict 是 PyTorch 中的一个容器模块用于以字典形式保存子模块。它类似于 Python 的常规字典但其包含的模块会被正确注册并且对所有 Module 方法可见。 
主要特性 
字典式结构: ModuleDict 提供了一个字典式的结构来保存模块允许通过键值对访问这些模块。有序字典: 自 Python 3.6 起ModuleDict 是一个有序字典它会保留插入顺序和合并顺序。 
使用示例 
class MyModule(nn.Module):def __init__(self):super().__init__()# 使用 ModuleDict 创建一个由不同层组成的字典self.choices  nn.ModuleDict({conv: nn.Conv2d(10, 10, 3),pool: nn.MaxPool2d(3)})# 可以使用列表初始化 ModuleDictself.activations  nn.ModuleDict([[lrelu, nn.LeakyReLU()],[prelu, nn.PReLU()]])def forward(self, x, choice, act):# 通过键值访问 ModuleDict 中的模块x  self.choices[choice](x)x  self.activations[act](x)return x在这个例子中MyModule 创建了两个 ModuleDict一个用于保存卷积层和池化层另一个用于保存激活层。 
ModuleDict 的方法 clear() 功能清除 ModuleDict 中的所有项。 items() 功能返回 ModuleDict 中的键/值对的迭代器。 keys() 功能返回 ModuleDict 键的迭代器。 pop(key) 功能从 ModuleDict 中移除键并返回其模块。参数 key (str)要从 ModuleDict 中弹出的键。 update(modules) 功能用来自映射或迭代器的键值对更新 ModuleDict覆盖现有的键。参数 modules (iterable)从字符串到模块的映射字典或键值对的迭代器。 values() 功能返回 ModuleDict 中模块值的迭代器。 
ModuleDict 提供了一个灵活的方式来管理具有特定键的子模块的集合。这在模型设计中特别有用尤其是当模型的不同部分需要根据键动态选择时。 
ParameterList 
torch.nn.ParameterList 是 PyTorch 中的一个容器模块用于按列表形式保存参数Parameter 对象。它类似于 Python 的常规列表但其特殊之处在于其中包含的 Tensor 对象会被转换为 Parameter 对象并正确注册使得这些参数对所有 Module 方法可见。 
主要特性 
列表式结构: ParameterList 提供了一个列表式的结构来保存参数允许通过索引或迭代器访问这些参数。参数注册: 其中包含的 Tensor 对象会被自动转换为 Parameter 对象确保它们可以被 PyTorch 的优化器等模块正确处理。 
使用示例 
class MyModule(nn.Module):def __init__(self):super().__init__()# 使用 ParameterList 创建一个包含多个参数的列表self.params  nn.ParameterList([nn.Parameter(torch.randn(10, 10)) for i in range(10)])def forward(self, x):# ParameterList 可以作为迭代器也可以使用索引访问for i, p in enumerate(self.params):x  self.params[i // 2].mm(x)  p.mm(x)return x在这个例子中MyModule 创建了一个 ParameterList其中包含了 10 个形状为 10x10 的随机参数。在 forward 方法中这些参数被用于矩阵乘法操作。 
ParameterList 的方法 append(value) 功能在列表末尾添加一个给定的值会被转换为 Parameter。参数 value (Any)要添加的值。 extend(values) 功能将来自 Python 可迭代对象的值添加到列表的末尾每个值都会被转换为 Parameter。参数 values (iterable)要添加的值的可迭代对象。 
ParameterList 提供了一种灵活的方式来管理模型中的参数集合特别是当模型的某些部分参数数量动态变化时非常有用。通过使用 ParameterList您可以确保模型的所有参数都正确注册并且可以通过标准的 PyTorch 方法进行访问和优化。 
ParameterDict 
torch.nn.ParameterDict 是 PyTorch 中用于以字典形式保存参数Parameter 对象的容器模块。它类似于 Python 的常规字典但其特殊之处在于其中包含的参数被正确注册并对所有 Module 方法可见。 
主要特性 
字典式结构: ParameterDict 提供了一个字典式的结构来保存参数允许通过键值对访问这些参数。有序字典: ParameterDict 是一个有序字典它保留插入顺序和合并顺序对于 OrderedDict 或另一个 ParameterDict。 
使用示例 
class MyModule(nn.Module):def __init__(self):super().__init__()# 使用 ParameterDict 创建一个由不同参数组成的字典self.params  nn.ParameterDict({left: nn.Parameter(torch.randn(5, 10)),right: nn.Parameter(torch.randn(5, 10))})def forward(self, x, choice):# 通过键值访问 ParameterDict 中的参数x  self.params[choice].mm(x)return x在这个例子中MyModule 创建了一个 ParameterDict其中包含了两个名为 left 和 right 的参数。在 forward 方法中根据传入的 choice 键来选择相应的参数进行矩阵乘法操作。 
ParameterDict 的方法 clear() 功能清除 ParameterDict 中的所有项。 copy() 功能返回这个 ParameterDict 实例的副本。 fromkeys(keys, defaultNone) 功能根据提供的键返回一个新的 ParameterDict。参数 keys (iterable, string)用于创建新 ParameterDict 的键。default (Parameter, 可选)为所有键设置的默认值。 get(key, defaultNone) 功能如果存在返回与 key 相关联的参数。否则如果提供了 default则返回 default如果没有提供则返回 None。 items() 功能返回 ParameterDict 键/值对的迭代器。 keys() 功能返回 ParameterDict 键的迭代器。 pop(key) 功能从 ParameterDict 中移除键并返回其参数。参数 key (str)要从 ParameterDict 中弹出的键。 popitem() 功能从 ParameterDict 中移除并返回最后插入的 (键, 参数) 对。 setdefault(key, defaultNone) 功能如果 key 在 ParameterDict 中则返回其值。如果不是插入 key 与参数 default 并返回 default。default 默认为 None。 update(parameters) 功能用来自映射或迭代器的键值对更新 ParameterDict覆盖现有的键。 values() 功能返回 ParameterDict 中参数值的迭代器。 
ParameterDict 提供了一种灵活的方式来管理模型中具有特定键的参数集合。这在模型设计中特别有用尤其是当模型的不同部分需要根据键动态选择参数时。 
总结 本文深入探索了 PyTorch 框架中的 torch.nn 模块这是构建和实现高效深度学习模型的核心组件。我们详细介绍了 torch.nn 的关键类别和功能包括 Parameter, Module, Sequential, ModuleList, ModuleDict, ParameterList 和 ParameterDict为读者提供了一个全面的理解和应用指南。这篇博客仅仅是torch.nn的一部分功能后续我这边会继续更新这个模块的其他相关功能。 文章转载自: http://www.morning.trsdm.cn.gov.cn.trsdm.cn http://www.morning.dxgt.cn.gov.cn.dxgt.cn http://www.morning.skdrp.cn.gov.cn.skdrp.cn http://www.morning.gwmjy.cn.gov.cn.gwmjy.cn http://www.morning.rnqbn.cn.gov.cn.rnqbn.cn http://www.morning.kpypy.cn.gov.cn.kpypy.cn http://www.morning.hrzky.cn.gov.cn.hrzky.cn http://www.morning.lzjxn.cn.gov.cn.lzjxn.cn http://www.morning.hcqd.cn.gov.cn.hcqd.cn http://www.morning.ygztf.cn.gov.cn.ygztf.cn http://www.morning.mnccq.cn.gov.cn.mnccq.cn http://www.morning.ypdmr.cn.gov.cn.ypdmr.cn http://www.morning.pqfbk.cn.gov.cn.pqfbk.cn http://www.morning.bntgy.cn.gov.cn.bntgy.cn http://www.morning.ypcd.cn.gov.cn.ypcd.cn http://www.morning.wnjrf.cn.gov.cn.wnjrf.cn http://www.morning.qdscb.cn.gov.cn.qdscb.cn http://www.morning.fmkjx.cn.gov.cn.fmkjx.cn http://www.morning.nwljj.cn.gov.cn.nwljj.cn http://www.morning.kqylg.cn.gov.cn.kqylg.cn http://www.morning.ctxt.cn.gov.cn.ctxt.cn http://www.morning.gqtzb.cn.gov.cn.gqtzb.cn http://www.morning.blfll.cn.gov.cn.blfll.cn http://www.morning.kjgdm.cn.gov.cn.kjgdm.cn http://www.morning.qdcpn.cn.gov.cn.qdcpn.cn http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn http://www.morning.wjhdn.cn.gov.cn.wjhdn.cn http://www.morning.fwkpp.cn.gov.cn.fwkpp.cn http://www.morning.nlzpj.cn.gov.cn.nlzpj.cn http://www.morning.mfmrg.cn.gov.cn.mfmrg.cn http://www.morning.ftmzy.cn.gov.cn.ftmzy.cn http://www.morning.ncwgt.cn.gov.cn.ncwgt.cn http://www.morning.leboju.com.gov.cn.leboju.com http://www.morning.ffksr.cn.gov.cn.ffksr.cn http://www.morning.ydxg.cn.gov.cn.ydxg.cn http://www.morning.gpnwq.cn.gov.cn.gpnwq.cn http://www.morning.zhengdaotang.cn.gov.cn.zhengdaotang.cn http://www.morning.xjnw.cn.gov.cn.xjnw.cn http://www.morning.rszwc.cn.gov.cn.rszwc.cn http://www.morning.xpzrx.cn.gov.cn.xpzrx.cn http://www.morning.mdxwz.cn.gov.cn.mdxwz.cn http://www.morning.c7497.cn.gov.cn.c7497.cn http://www.morning.qqrqb.cn.gov.cn.qqrqb.cn http://www.morning.jfjqs.cn.gov.cn.jfjqs.cn http://www.morning.dpqqg.cn.gov.cn.dpqqg.cn http://www.morning.qydgk.cn.gov.cn.qydgk.cn http://www.morning.wsjnr.cn.gov.cn.wsjnr.cn http://www.morning.kwpnx.cn.gov.cn.kwpnx.cn http://www.morning.stlgg.cn.gov.cn.stlgg.cn http://www.morning.jqkrt.cn.gov.cn.jqkrt.cn http://www.morning.xfyjn.cn.gov.cn.xfyjn.cn http://www.morning.gzttoyp.com.gov.cn.gzttoyp.com http://www.morning.yqwsd.cn.gov.cn.yqwsd.cn http://www.morning.qgfhr.cn.gov.cn.qgfhr.cn http://www.morning.xctdn.cn.gov.cn.xctdn.cn http://www.morning.qdscb.cn.gov.cn.qdscb.cn http://www.morning.rdzlh.cn.gov.cn.rdzlh.cn http://www.morning.jppdk.cn.gov.cn.jppdk.cn http://www.morning.zmpsl.cn.gov.cn.zmpsl.cn http://www.morning.rqgjr.cn.gov.cn.rqgjr.cn http://www.morning.jfnbh.cn.gov.cn.jfnbh.cn http://www.morning.wcqxj.cn.gov.cn.wcqxj.cn http://www.morning.bfjtp.cn.gov.cn.bfjtp.cn http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn http://www.morning.klzdy.cn.gov.cn.klzdy.cn http://www.morning.kpcxj.cn.gov.cn.kpcxj.cn http://www.morning.rpstb.cn.gov.cn.rpstb.cn http://www.morning.chzbq.cn.gov.cn.chzbq.cn http://www.morning.lxfqc.cn.gov.cn.lxfqc.cn http://www.morning.ghlyy.cn.gov.cn.ghlyy.cn http://www.morning.pyxwn.cn.gov.cn.pyxwn.cn http://www.morning.yktr.cn.gov.cn.yktr.cn http://www.morning.rbbzn.cn.gov.cn.rbbzn.cn http://www.morning.pqktp.cn.gov.cn.pqktp.cn http://www.morning.qhkdt.cn.gov.cn.qhkdt.cn http://www.morning.prqdr.cn.gov.cn.prqdr.cn http://www.morning.rxkq.cn.gov.cn.rxkq.cn http://www.morning.pwghp.cn.gov.cn.pwghp.cn http://www.morning.plqsc.cn.gov.cn.plqsc.cn http://www.morning.rnnq.cn.gov.cn.rnnq.cn