参考文档:Pytorch中文文档,英文文档
常用模块
1. import torch
1.1 维度操作
torch.stack((A,B), axis) # 在新的维度上堆叠
torch.cat((A,B), axis) #只能在已有维度上连接,和np.concatenate()类似
tensor.view() # 与np.reshape()类似
1.2 torch.meshgrid()
在 sy_ij, sx_ij = torch.meshgrid(y, x, indexing='ij')
中,sy_ij 和 sx_ij 的维度是一致的。
例如,如果 y 的形状是 (m,),x 的形状是 (n,),那么 sy_ij 和 sx_ij 的形状都将是 (m, n)。
import torch
y = torch.tensor([0, 1, 2, 3])
x = torch.tensor([0, 1])
sy_ij, sx_ij = torch.meshgrid(y, x, indexing='ij')
print("sy_ij:")
print(sy_ij)
print("sx_ij:")
print(sx_ij)
sy_ij:
tensor([[0, 0],
[1, 1],
[2, 2],
[3, 3]])
sx_ij:
tensor([[0, 1],
[0, 1],
[0, 1],
[0, 1]])
2. import torch.nn as nn
2.1 nn.Module
是 PyTorch 中所有神经网络模块的基类。它是一个抽象类,只提供了一个框架,用于定义模型的构建块,本身并没有实现具体的神经网络操作。但它提供了一些基础功能,比如:
- 管理模型的参数(通过 self._parameters 字典)。
- 实现了 forward() 方法的框架,这是所有子类必须实现的方法,用于定义模型的前向传播逻辑。
- 提供了方法来注册和跟踪子模块(add_module)、参数(register_parameter)、缓冲区(register_buffer)等。
- 支持序列化(state_dict)和反序列化(load_state_dict)操作,这对于模型的保存和加载至关重要。
以下面这个为例:
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(1, 20, 5),
nn.ReLU(),
nn.Conv2d(20, 40, 5)
)
self.conv = nn.Conv2d(40, 10, 3)
self.fc = nn.Linear(10, 4)
def forward(self, x):
x = self.features(x)
x = torch.relu(self.conv(x))
x = x.view(x.size(0), -1) # Flatten the tensor
x = self.fc(x)
return x
#创建模型实例
model = MyModel()
2.1.1 结构属性
-
modules()
model.modules() 返回一个迭代器,遍历所有模块及其子模块,迭代的每个元素module都是nn.Module
类的一个实例。#使用 modules() 遍历模型的所有模块,遍历顺序同深度优先 for module in model.modules(): print(module)
迭代器遍历模块结果如下:
MyModel
–>Sequential
–>Sequential(0),(1),(2)
–>conv2d
,Linear
(虽然下图在遍历MyModel
时打印了它包含的所有内容,但不代表此时已经把整个model遍历过了)
-
named_modules()
返回一个迭代器,遍历所有模块及其子模块。与modules()方法的区别是:named_modules()还会返回模块名。模块名的命名规则:包含所有父模块的名称,因此模块名隐含了层级结构。# 使用 named_modules() 遍历模型的所有模块及其名称 for name, module in model.named_modules(): print(name, module)
迭代器遍历 模块的完整名称 和 模块 本身:
2.1.2 参数属性
-
named_parameters()
返回一个 包含模型所有参数名和参数的 迭代器,可以方便地通过参数名来访问和操作模型的参数。每个参数都是一个torch.nn.Parameter
对象(是一种特殊的tensor),这个对象具有以下属性和方法:data
: 参数张量的实际数据。grad
: 与参数相关的梯度。在反向传播之后,这个属性会被填充。在 optimizer.step() 调用之后,梯度会被清零。requires_grad
: 一个布尔值,指示是否计算此参数的梯度。默认情况下,所有参数的 requires_grad 都是 True,意味着它们是可学习的,并且在反向传播时会计算梯度。
for name, param in model.named_parameters(): print(name, param.size())
输出参数名和参数大小如下:
# 只列出顶层参数 for p_name, p in model.named_parameters(recurse=False): print(p_name, p.size())
当设置
recurse=False
,named_parameters()
只会遍历当前模块的参数,而不会遍历子模块的参数。在这个例子中,MyModel
没有直接定义自己的参数,只有位于叶子节点的模块才有参数, 因此上面代码不会有输出。 -
parameters()
功能同parameters(),但没有访问参数的名称。每个参数都是一个torch.nn.Parameter
对象,一般被用作optimizer
的参数。# 使用 parameters() 遍历模型的所有参数 for param in model.parameters(): print(