【Pytorch】使用

参考文档: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=Falsenamed_parameters() 只会遍历当前模块的参数,而不会遍历子模块的参数。在这个例子中,MyModel 没有直接定义自己的参数,只有位于叶子节点的模块才有参数, 因此上面代码不会有输出。

  • parameters()
    功能同parameters(),但没有访问参数的名称。每个参数都是一个 torch.nn.Parameter 对象,一般被用作optimizer的参数。

    # 使用 parameters() 遍历模型的所有参数
    for param in model.parameters():
        print(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值