【Pytorch】使用

常用模块

import torch

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]])

import torch.nn as nn

container

nn.Sequential()nn.ModuleList() 在 PyTorch 中都是用于组织和管理模块的容器,但它们有以下主要区别:

  • 执行顺序和连接方式:
    nn.Sequential() 中的模块是按照顺序依次执行的。它会自动将每个模块的输出作为下一个模块的输入。
    nn.ModuleList() 中的模块之间没有这种自动的顺序执行关系,需要在自定义的前向传播函数中明确指定每个模块的调用顺序和方式。
  • 前向传播的定义:
    对于 nn.Sequential() ,前向传播已经自动定义好了,无需额外编写。
    在 nn.ModuleList() 中,必须自己在 forward 方法中手动遍历和处理每个模块的计算。
  • 功能灵活性:
    nn.Sequential() 适合简单、顺序执行的模块组合。
    nn.ModuleList() 更加灵活,适用于需要更复杂的模块调用逻辑,例如根据条件决定是否调用某些模块,或者对模块进行重复使用等。

conv

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
膨胀卷积
分组卷积

特例:当分组数目和channel数目一致时,就是Depthwise卷积

Batch Normalization

原理参考在这里

activate

nn.SiLU与nn.ReLU
参考文档:【1】
在这里插入图片描述
在这里插入图片描述

register_buffer

self.register_buffer("anchors", torch.tensor(anchors).float().view(self.nl, -1, 2))  # shape(nl,na,2)

通过register_buffer(name, tensor)函数可以将一个张量tensor注册到模型中,并给它指定一个名称name。
注册为buffer的张量具有以下特点:

  • 不会参与反向传播过程,即它们不会被梯度下降更新,其requires_grad属性始终为False。
  • 会被包含在模型的state_dict中,从而可以随模型一起保存和加载
  • 可以像访问模型的属性一样,通过self.name来访问该张量

使用register_buffer的主要场景包括:在模型中需要使用一些常量或固定的中间结果,这些量在模型的训练和测试过程中都可能被用到,但不需要进行梯度更新。例如,目标检测模型的anchors值,也比如BN层每个channel的均值和方差,在推理阶段batch数一般为1,无法计算均值和方差,需要保存训练阶段最后几批batch的均值和期望,用于推理阶段。

维度操作

torch.stack((A,B), axis) # 在新的维度上堆叠
torch.cat((A,B), axis) #只能在已有维度上连接,和np.concatenate()类似
tensor.view() # 与np.reshape()类似

常见问题

RuntimeError: CUDA error: no kernel image is available for execution on the device

原因:GPU算力与pytorch算例不匹配
参考:【1】

GPU Memory-Usage拉满,Volatile GPU-Util却为0

有可能是你用nvidia-smi命令查看的时候刚好处于GPU等CPU传数据阶段,所以GPU利用率显示为0%,可以改为watch -n 1 nvidia-smi每隔一秒自动更新GPU情况来查看。
参考:【1】【2】【3】

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值