常用模块
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】