文章目录
随便记录一下torch的使用
ImportError: dlopen: cannot load any more object with static TLS
20200410
在import torch
的时候抛出了这个错误,百度一下,
- 有人更换cv2和torch的导入顺序,我尝试了下,然并卵
- 考虑到我导入的包有些是自己写的包,考虑到重名问题改了,没用
- 在最开始的地方,第一步就导入torch,成功解决
一些节约显存的trick
with torch.no_grad()
再验证的时候加上这个会再计算梯度的时候节约显存计算和使用torch.cuda.empty_cache()
用在每个epoch结束或者开始的地方,释放一些没有用的显存,他的机制是释放没有变量引用的显存python del
主动删除一些有引用的变量显存,在使用完某些变量或者中间计算量的时候手动删除这些变量较少显存占用
实际上我是用了上面三个方法还是不行2333,只是延迟了显存爆表的时间。。。,最后无奈还是减少了batchsize,现在看情况,最尴尬的情况就是我在本地测试的时候没有使用del和empty_cache,显存也没有变。。,但是后者确实可以在nvidia-smi中看到释放的显存,但是总的显存并没有变化,用于训练+测试好像没有效果,回头把他们全都注释掉
Unfold 和Fold
torch.nn.Unfold
torch.nn.functional.unfold
torch.tensor.unfold
从一个批次的输入样本中提取出滑动的局部区域块
不太懂啊
torch.nn.Unfold(kernel_size, dilation=1,padding=0,stride=1)
参考
输入为(N, C, H, W)
输出为(N, Cx
∏
\prod
∏(kernel_size), L)
就是把卷积核滑动过程中经过的区域提取出来,遍历每个通道(channel, C), 每个patch 的大小为
∏
(
k
e
r
n
e
l
s
i
z
e
)
\prod(kernel_size)
∏(kernelsize), 每个通道有L 个patch
torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)
则相反
- 待实验
torch 初始化通过函数加载预训练模型是否是原地修改网络参数
这句话的意思是,将网络模型作为参数传递给初始化函数,但是初始化函数并没有返回值,这样的情况下原网络的参数是否被修改,即是值传递还是传递引用
实验证明是传递引用
# coding=utf-8
"""
@filename : temp.py
@author : keda_wl
@time : 2021-09-30 14:44:15
@description: 网络通过函数调用加载参数是原地修改值吗?
"""
import torch
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super().__init__()
self.l = nn.Linear(4, 2, bias=False)
def forward(self, x):
return self.l(x)
def func1(net1):
net1.apply(func2)
print(net1.state_dict())
torch.save(net1.state_dict(), 'temp.pth')
return net1
def func2(m):
classname = m.__class__.__name__
if classname.find('Linear') != -1:
torch.nn.init.zeros_(m.weight.data)
def func3(net2):
func4(net2)
print(net2.state_dict())
def func4(net4):
net4.load_state_dict(torch.load('temp.pth'))
# torch.nn.init
net1 = Net()
print(net1.state_dict())
func1(net1)
# load state dict
net2 = Net()
print(net2.state_dict())
func3(net2)
"""
OrderedDict([('l.weight', tensor([[-0.0960, 0.0352, 0.4729, -0.3162],
[-0.4901, -0.2909, 0.2769, -0.3116]]))])
OrderedDict([('l.weight', tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.]]))])
OrderedDict([('l.weight', tensor([[-0.4603, 0.1903, -0.0606, -0.4371],
[ 0.1231, 0.3120, -0.4781, 0.4559]]))])
OrderedDict([('l.weight', tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.]]))])
"""
再次注意torch eval()
20220915 今天使用训练好的torch 模型测试,对比另一份代码,超参都一样,但是结果总是对不上。经过debug 后,发现时模型加载参数后,没有调用model.eval()
, 模型结构中包含batchnorm
所以会出错。
记录下再次注意包含batchnorm dropout 之类的模型需要调用model.eval()